定时器例程之二 :模拟时钟
这也是JHC-51-A的实验6-1的内容。
以下是部分程序
void init_timer0(void)
{
//以下为初始化定时器
TMOD|=0x01; //选择定时器0,工作模式1:16位定时器
TH0=0xEE; //置定时初始值
TL0=0x00;
//初始化完毕。
ET0=1; //开定时器0中断,允许定时器0中断。
EA=1; //开全局中断。允许所有中断
TR0=1; //开始计数
}
unsigned char time_allow; //整点报时标志
unsigned char time_num; //报时的次数 ,
unsigned char FMq_times; //整点报时 蜂鸣器声音维持时间计数
unsigned char set_kk_times;
unsigned char ms5_times; //5ms中断计次
unsigned char hour,min,sec; //定义时,分,秒。
void timer0() interrupt 1 using 1 //5ms中断一次定时器中断处理函数
{
//重新置位计数初始值 在工作方式1下,需要重新置位定时初始值,程序才会再一次进入中断,
//工作方式0,3也是如此,只有工作方式2不需要重新置位初始值。
TH0=0xEE; //置定时初始值
if(++ms5_times>=200) //5ms中断一次,计数200次 达到1s
{
ms5_times=0;
dc1=0; //处理小数点 点亮
sec++; //时钟 秒+1
if(sec>=60) //秒计数达到60
{
sec=0;
min++; //分钟+1
if(min>=60) //分钟计数达到60
{
min=0;
hour++; //小时+1
if(hour>23) hour=0; //24小时制,计数达到24,清零
}
}
}
if(0==sec)
{
if(0==min) //如果时间达到整点。允许报时功能
{
if(hour>12) time_num=hour-12; //如果时间超过12点,报时声音次数相应减 12
else if(0==hour) time_num=12; //如果时间为零点。报时声音为12次
else time_num=hour; //报时次数为时间值
time_allow=1; //报时允许标志置位
}
if(30==min) //如果时间达到半点,允许报时功能
{
time_allow=1; //报时标志置位
time_num=1; //报时次数 1次
}
}
if(1==time_allow) //如果报时允许
{
if(fmq_times++>200)
{
fmq_times=0;
spk=1; //蜂鸣器停止发声
time_num--; //报时次数减 1
}
if(100==fmq_times) spk=0; //蜂鸣器发声
if(0==time_num) time_allow=0; //报时结束 清零报时标志位
}
if(ms5_times==80) dc1=1; //处理小数点 熄灭
if(set_kk_times++>200) set_kk_times=0;
disp_LED(display); //刷新数码管
}