목차
1. 제목
<신나는 뽑기 게임>
2. 작품개요(동작개요)
3. 회로도
1) 회로
2) 사용포트
3) 부품리스트
4. 처리 흐름도(flow chart)
5. 소스 리스트
6. 작품사진
<신나는 뽑기 게임>
2. 작품개요(동작개요)
3. 회로도
1) 회로
2) 사용포트
3) 부품리스트
4. 처리 흐름도(flow chart)
5. 소스 리스트
6. 작품사진
본문내용
끝나면 타이머0 정지
if(n < m_bit[i]){ // 박자를 다 안 채우면
TCNT0 = note[i]; // 타이머 초기값 재설정
PORTC.7 = !PORTC.7; // 토글하여 파형 만들기
n++;
}
else{
n = 0;
i++; // 박자 다 채우면 다음 음게, 박자를 위한 증가
}
if(i == 24) i = 0; // 음악 끝나면 처음부터
}
interrupt [TIM1_OVF] void timer_int1(void) // 타이머1, 게임 시간
{
if(t_cnt > 0 && start == 1){ // 시간이 지나지 않았으면
t_cnt--; // 시간 감소
TCNT1 = 49911; // 초기값 재설정
}
else{ // 시간이 끝나면
t_cnt = time_r; // 시간 재설정
start = 0; // 시작 변수 = 0
PORTC = PORTC & 0xC0;
fin = 1;
TCNT1 = 49911; // 초기값 재설정
TCCR1B = 0; // 타이머 정지
}
}
interrupt [TIM2_OVF] void timer_int2(void) // 사탕 잡는 함수
{
TCNT2 = 0; // 타이머 초기값 재설정
d_cnt++; // 집게 다운 카운터 증가
if(d_cnt < delay_t) PORTC.0 = 1; // 다운 시간 동안 모터 아래로
else if(d_cnt < (2*delay_t)){ // 다운 시간 끝나면 모터 위로
PORTC.0 = 0;
PORTC.1 = 1;
}
else{ // 모터 움직임 끝나면 초기화
PORTC.1 = 0;
d_fin = 1;
TCCR2 = 0;
start = 0;
}
}
void game_state(void) // 모터 동작 함수
{
if(PINA.0 == 1 && down == 0){ // 아래쪽 스위치 눌리면
down = 1; // 모터 다운 변수 증가
d_cnt = 0; // 다운 시간 초기화
delay_t = 50; // 다운 시간 값 설정
TCCR2 = 0x05; // 모터 다운 카운터 시작
}
else if(PINA.2 == 1 && st_r == 1) PORTC.2 = 1; // 오른쪽
else if(PINA.3 == 1 && st_l == 1) PORTC.3 = 1; // 왼쪽
else if(PINA.4 == 1 && st_f == 1) PORTC.4 = 1; // 앞쪽
else if(PINA.5 == 1 && st_b == 1) PORTC.5 = 1; //뒤쪽
else PORTC = PORTC & 0xC3; // 스위치 안눌리면 모터정지
}
void check_limit(void) // 이동 위치 제한
{
lm_sw = PING & 0b00001111; // 스위치 값 받기
st_l = 1;
st_r = 1; // 초기값 설정
st_b = 1;
st_f = 1;
if(lm_sw == 0b00000100 | lm_sw == 0b00000110 | lm_sw == 0b00000101) st_l = 0; // 왼쪽 리미트 변수
if(lm_sw == 0b00001000 | lm_sw == 0b00001010 | lm_sw == 0b00001001) st_r = 0; // 오른쪽 리미트 변수
if(lm_sw == 0b00000001 | lm_sw == 0b00000101 | lm_sw == 0b00001001) st_f = 0; // 앞쪽 리미트 변수
if(lm_sw == 0b00000010 | lm_sw == 0b00000110 | lm_sw == 0b00001010) st_b = 0; // 뒤쪽 리미트 변수
}
void ini_loca(void) // 초기 위치 설정 함수
{
if(down == 0){ // 아래쪽 모터 작동 안했으면
down = 1; // 모터 다운 변수 증가
d_fin = 0; // 초기 위치 가기 위한 변수 설정
d_cnt = 0; // 다운 시간 초기화
delay_t = 50; // 다운 시간 값 설정
TCCR2 = 0x05; // 모터 다운 카운터 시작
}
if(st_l != 0 && d_fin == 1) PORTC.3 = 1; // 리미트 스위치 눌릴때까지 왼쪽 이동
else PORTC.3 = 0;
if(st_f != 0 && d_fin == 1) PORTC.4 = 1; // 리미트 스위치 눌릴때까지 앞쪽 이동
else PORTC.4 = 0;
if(down == 1 && st_f == 0 && st_l == 0){ // 초기 위치에서 사탕 놓기
down = 2; // 두번째 모터 내려가기에서 다운 변수 증가
d_cnt = 0;
i = 0;
delay_t = 10;
TCCR2 = 0x05;
}
}
void Time_out(void) // 값 표시 함수
{
u_char seg1, seg2;
if(ch_time == 1) { // 시간 변경 모드의 경우 A, 시간 표시
seg1 = 10;
seg2 = time_r;
}
else { // 게임 동작 모드의 경우 동전, 시간 표시
seg1 = coin_en % 10;
seg2 = t_cnt;
}
PORTF = 0b11100000; // SEG 1, 초1단위
PORTB = seg_pat[seg1];
delay_ms(5);
PORTF = 0b10110000; // SEG 3, 초2단위
PORTB = seg_pat[seg2 % 10];
delay_ms(5);
PORTF = 0b01110000; // SEG 4, 동전표시
PORTB = seg_pat[seg2 / 10];
delay_ms(5);
}
void AD_chan(int val) // ADC값 변환 함수
{
float fval;
fval = (float)val * 20.0 / 1024;
time_r = (int)(fval + 10.5); // 10-30까지 표시
}
작품사진
전체적 외관
시간, 동전 표시 부분
모터 내부
lb1630 테스트
스피커
리미트 스위치 연결 부분
방향 스위치 연결 부분
모터제어부분, 스피커 구동 회로
동작 사진
동전 동작 사진
시간 조정 모드 10초부터
시간 조정 모드 30초까지
if(n < m_bit[i]){ // 박자를 다 안 채우면
TCNT0 = note[i]; // 타이머 초기값 재설정
PORTC.7 = !PORTC.7; // 토글하여 파형 만들기
n++;
}
else{
n = 0;
i++; // 박자 다 채우면 다음 음게, 박자를 위한 증가
}
if(i == 24) i = 0; // 음악 끝나면 처음부터
}
interrupt [TIM1_OVF] void timer_int1(void) // 타이머1, 게임 시간
{
if(t_cnt > 0 && start == 1){ // 시간이 지나지 않았으면
t_cnt--; // 시간 감소
TCNT1 = 49911; // 초기값 재설정
}
else{ // 시간이 끝나면
t_cnt = time_r; // 시간 재설정
start = 0; // 시작 변수 = 0
PORTC = PORTC & 0xC0;
fin = 1;
TCNT1 = 49911; // 초기값 재설정
TCCR1B = 0; // 타이머 정지
}
}
interrupt [TIM2_OVF] void timer_int2(void) // 사탕 잡는 함수
{
TCNT2 = 0; // 타이머 초기값 재설정
d_cnt++; // 집게 다운 카운터 증가
if(d_cnt < delay_t) PORTC.0 = 1; // 다운 시간 동안 모터 아래로
else if(d_cnt < (2*delay_t)){ // 다운 시간 끝나면 모터 위로
PORTC.0 = 0;
PORTC.1 = 1;
}
else{ // 모터 움직임 끝나면 초기화
PORTC.1 = 0;
d_fin = 1;
TCCR2 = 0;
start = 0;
}
}
void game_state(void) // 모터 동작 함수
{
if(PINA.0 == 1 && down == 0){ // 아래쪽 스위치 눌리면
down = 1; // 모터 다운 변수 증가
d_cnt = 0; // 다운 시간 초기화
delay_t = 50; // 다운 시간 값 설정
TCCR2 = 0x05; // 모터 다운 카운터 시작
}
else if(PINA.2 == 1 && st_r == 1) PORTC.2 = 1; // 오른쪽
else if(PINA.3 == 1 && st_l == 1) PORTC.3 = 1; // 왼쪽
else if(PINA.4 == 1 && st_f == 1) PORTC.4 = 1; // 앞쪽
else if(PINA.5 == 1 && st_b == 1) PORTC.5 = 1; //뒤쪽
else PORTC = PORTC & 0xC3; // 스위치 안눌리면 모터정지
}
void check_limit(void) // 이동 위치 제한
{
lm_sw = PING & 0b00001111; // 스위치 값 받기
st_l = 1;
st_r = 1; // 초기값 설정
st_b = 1;
st_f = 1;
if(lm_sw == 0b00000100 | lm_sw == 0b00000110 | lm_sw == 0b00000101) st_l = 0; // 왼쪽 리미트 변수
if(lm_sw == 0b00001000 | lm_sw == 0b00001010 | lm_sw == 0b00001001) st_r = 0; // 오른쪽 리미트 변수
if(lm_sw == 0b00000001 | lm_sw == 0b00000101 | lm_sw == 0b00001001) st_f = 0; // 앞쪽 리미트 변수
if(lm_sw == 0b00000010 | lm_sw == 0b00000110 | lm_sw == 0b00001010) st_b = 0; // 뒤쪽 리미트 변수
}
void ini_loca(void) // 초기 위치 설정 함수
{
if(down == 0){ // 아래쪽 모터 작동 안했으면
down = 1; // 모터 다운 변수 증가
d_fin = 0; // 초기 위치 가기 위한 변수 설정
d_cnt = 0; // 다운 시간 초기화
delay_t = 50; // 다운 시간 값 설정
TCCR2 = 0x05; // 모터 다운 카운터 시작
}
if(st_l != 0 && d_fin == 1) PORTC.3 = 1; // 리미트 스위치 눌릴때까지 왼쪽 이동
else PORTC.3 = 0;
if(st_f != 0 && d_fin == 1) PORTC.4 = 1; // 리미트 스위치 눌릴때까지 앞쪽 이동
else PORTC.4 = 0;
if(down == 1 && st_f == 0 && st_l == 0){ // 초기 위치에서 사탕 놓기
down = 2; // 두번째 모터 내려가기에서 다운 변수 증가
d_cnt = 0;
i = 0;
delay_t = 10;
TCCR2 = 0x05;
}
}
void Time_out(void) // 값 표시 함수
{
u_char seg1, seg2;
if(ch_time == 1) { // 시간 변경 모드의 경우 A, 시간 표시
seg1 = 10;
seg2 = time_r;
}
else { // 게임 동작 모드의 경우 동전, 시간 표시
seg1 = coin_en % 10;
seg2 = t_cnt;
}
PORTF = 0b11100000; // SEG 1, 초1단위
PORTB = seg_pat[seg1];
delay_ms(5);
PORTF = 0b10110000; // SEG 3, 초2단위
PORTB = seg_pat[seg2 % 10];
delay_ms(5);
PORTF = 0b01110000; // SEG 4, 동전표시
PORTB = seg_pat[seg2 / 10];
delay_ms(5);
}
void AD_chan(int val) // ADC값 변환 함수
{
float fval;
fval = (float)val * 20.0 / 1024;
time_r = (int)(fval + 10.5); // 10-30까지 표시
}
작품사진
전체적 외관
시간, 동전 표시 부분
모터 내부
lb1630 테스트
스피커
리미트 스위치 연결 부분
방향 스위치 연결 부분
모터제어부분, 스피커 구동 회로
동작 사진
동전 동작 사진
시간 조정 모드 10초부터
시간 조정 모드 30초까지
소개글