采用ATmega16单片机设计制作的电子时钟
功能:精确走时及时间的校准(配以闪烁显示)
特点:不采用传统的延时扫描键盘的方法,代之以CPU效率更高的
基于定时计数器的状态机扫描法,充分利用CPU的时钟
#include mega16.h
#define uchar unsigned char
#define uint unsigned int
flash uchar led_7[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
flash uchar position[6]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};
flash uint t[9]={0,956,865,759,716,638,568,506,470};
flash uchar d[9]={0,105,116,132,140,157,176,198,209};
#define Max_note 32
flash uchar music[Max_note]={5,2,8,2,5,2,4,2,3,2,2,2,1,4,1,2,1,2,2,2,3,2,3,2,1,2,3,2,4,2,5,8};
uchar note_n;
uint int_n;
bit play_on;
uchar time[3],time_set[3]; 时,分,秒和设置单元
uchar dis_buff[6];
uchar time_counter,key_time_counter; 时间计数单元
uchar clock_state=6,return_time;
bit point_on,set_on,time_1s_ok,key_stime_ok;
void display()
{
static uchar posit=0;
PORTA=0xff; 熄灭数码管,防止重影
PORTB=BIT(0);
PORTB&=~BIT(0); 锁存
PORTA=led_7[dis_buff[posit]];
if(set_on&&(posit==clock_state)) PORTA=0x00; 校时闪烁
if(point_on&&(posit==1posit==3)) PORTA=0x80; 秒闪烁
PORTB=BIT(1);
PORTB&=~BIT(1);
PORTA=position[posit];
PORTB=BIT(0);
PORTB&=~BIT(0); 锁存
if(++posit=6) posit=0;
}
定时器0比较匹配中断服务,2ms
interrupt [TIM0_COMP] void timer0_comp_isr(void )
{
display();
if(++key_time_counter=5)
{
key_time_counter=0;
key_stime_ok=1; 10ms到
if(!(++time_counter%25)) set_on=!set_on; 设置校时闪烁标志
if(time_counter=100)
{
time_counter=0;
time_1s_ok=1;
}
}