[실험보고서] 타이머/카운터를 이용한 디지털시계 설계
본 자료는 3페이지 의 미리보기를 제공합니다. 이미지를 클릭하여 주세요.
닫기
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
해당 자료는 3페이지 까지만 미리보기를 제공합니다.
3페이지 이후부터 다운로드 후 확인할 수 있습니다.

목차

<타이머/카운터를 이용한 디지털시계 설계>
▶이론 및 배경
▶타겟 보드(ATmega128 보드)설명 및 회로도 첨부
▶프로그램 소스파일 분석
▶전체 프로그램의 flow chart

본문내용

트1
TIMSK = 0x10; // OC1A interrupt 사용가능
ETIMSK = 0x00;
TIFR = 0x3C; // 모든 interrupt flags 클리어
ETIFR = 0x01;
sei();
}
void LCD_2digit(unsigned char number) //10진수의 두자리 수로 출력
{
LCD_data(number/10 + '0'); // 10^1
LCD_data(number%10 + '0'); // 10^0
}
void Display_time(void) //각각의 hour, minute, second, sec 출력
{
LCD_command(0xC2);
LCD_2digit(hour);
LCD_command(0xC5);
LCD_2digit(minute);
LCD_command(0xC8);
LCD_2digit(second/100);
LCD_command(0xCB);
LCD_2digit(second%100);
}
ISR(TIMER1_COMPA_vect) // 타이머/카운터 1을 이용한 인터럽트실행
{
second++; // second 1/100 ms
if(second == 6000) // 6000 * 1/100 = 60s
{ second = 0; // 60s 일 경우 second = 0 , minute 증가
minute++;
if(minute == 60) // minute = 60 이면 시간 증가 및 minute =0 로 만듬
{ minute = 0;
hour++;
if(hour == 100) // hour100 이면 hour=0
hour = 0;
}
}
Display_time(); // 시간 출력
}
ISR(TIMER3_COMPA_vect) //" : : " 의 0.5초마다 출력하기위한 인터럽트
{
if(s==1)
{
s=0;
}
else
{
s=1;
}
}
void stopwatch(void) // 스탑워치 함수
{
MCU_initialize(); //초기화
Delay_ms(50);
LCD_initialize();
Beep();
LCD_string(0x80," AVR STOP WATCH "); //스탑워치모드시 LCD 위쪽행의 출력
Set_timer1(); // 타이머/카운터1의 인터럽트를 실행하기 위한 레지스터값을 저장한 함수
cli(); // 타이머 출력 멈춤(∵타이머카운터 인터럽트 1과 3 실행시에 두 인터럽트가 겹쳐 서 타이머의 초기 스타트 버튼 클릭이전에 시작되어서 cli()이라는 함수를 통해서 시작을 못하게함)
Clear_time(); // 디스플레이 초기화
run_flag = 0;
PORTB=0x30; //LED 1,2 on
while(1)
{ switch(Key_input()) // 키입력에따른 스위치 함수
{ case 0x0E : if(run_flag == 0) break //runflag의 값이 0이면 무시
cli(); // 스탑워치 멈춤
PORTB = 0x30; // LED 1,2 on
run_flag = 0;
break
case 0x0B : if(run_flag == 1) break // 스탑워치 스타트 버튼
PORTB = 0x30;
TCNT1H = 0x00;
TCNT1L = 0x00;
run_flag = 1;
sei(); //global interrupt
break
case 0x07 : if(run_flag == 1) break // reset 버튼
Clear_time();
break
cli();
PORTB = 0x30;
case 0x0D : cli(); //메인루틴으로 돌아감
PORTB = 0x30;
run_flag = 0;
main();
break
default: break
}
}
}
int main(void)
{
MCU_initialize();
Delay_ms(50);
LCD_initialize(); // 초기화
Beep();
int k;
LCD_string(0x80," NO-1 DIGICLOCK "); //초기 LCD 디스플레이
LCD_string(0xC0," M : : ");
LCD_command(0x0F);
cursor = 0xC2; //커서의 초기위치 지정 C2 아래쪽LCD창의 세번째위치
Delay_ms(200);
if(RTC_FLAG != 'G') // RTC_data 사용을 위한 과정
{ RTC_FLAG = 'G'
RTC_HOUR = 0x12;
RTC_MINUTE = 0x00;
RTC_SECOND = 0x00;
RTC_A = 0x2F; // oscillator ON, SQW=2Hz
RTC_B = 0x00; // interrupt 불가능, SQW 불가능
}
s=0;
TCCR3A = 0x00; // CTC mode(4), OC1A로 출력하지말것
TCCR3B = 0x0C; // 16MHz/256/(1+31249) = 2Hz → 0.5초
TCCR3C = 0x00;
OCR3A = 31249;
TCNT3 = 0x0000; // 타이머카운터3 초기화
TIMSK = 0x00;
ETIMSK = 0x10;
TIFR = 0x00;
ETIFR = 0x3E;
sei();
while(1)
{
DSP_RTC1(); //RTC를 이용한 시계함수 실행
switch(Key_input()) //Key입력에 대한 각각의 기능 실행
{ case 0x0E : alarm(); // alarm모드
break
case 0x0D : stopwatch(); //Stopwatch모드
break
case 0x0B : Increment2(); // 시간 증가
break
case 0x07 : Increment1(); // 분 증가
break
default : break
}
hour=RTC_HOUR;
minute=RTC_MINUTE;
hour_alm=RTC_HOUR_ALM;
min_alm=RTC_MIN_ALM;
if(hour == hour_alm && minute == min_alm)
{
for(k=0;k<=hour_alm;k++) //alarm에 입력된 시간에 대하여 알람울림
{
Beep();
PORTB=0xF0;
}
}
}
}
▶전체 프로그램의 flow chart
▶디지털시계 작동 결과물
~별도 첨부
  • 가격1,500
  • 페이지수10페이지
  • 등록일2011.12.17
  • 저작시기2009.7
  • 파일형식한글(hwp)
  • 자료번호#721412
본 자료는 최근 2주간 다운받은 회원이 없습니다.
청소해
다운로드 장바구니