最近拿到了单片机的课程设计题目,乍一看还挺简单的,就是一个简单的电子时钟,想都没想就直接把我arduinod的DS1302时钟模块拿来直接就做出来了,好家伙这两天仔细读了题目才发现直接指出了不能用DS1302。
在上周才刚刚学了C52的中断系统,何不用中断系统做个定时器呢?
一.实现思路
其实中断就是当某个中断请求源发出中断请求,并且断点中断请求被允许的话,单片机暂时中止当前正在执行的主程序,转到中断处理程序处理中断服务请求。中断服务请求处理完后,再回到原来被中止的程序之处(断点),继续执行被中断的主程序。
52单片机里有TMOD,TCON,SCON,PCON,SBUF寄存器, 详情可以阅读这篇博客,在这里我就不在介绍了,那实现定时器功能我就采用TMOD寄存器,并且将其设置成方式一,16位定时器,同时将总中断(EA)打开,定时器中断(ET0)和定时器开关(TR0)打开。
二.代码实现
在下面提供一个定时器初始化函数,在主函数中调用即可。
void init_time0(void)
{
TMOD |= 0x01; //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响
EA=1; //总中断打开
ET0=1; //定时器中断打开
TR0=1; //定时器开关打开
}
初始化完成后那就要写定时器中断子程序了,可直接粘贴使用
void Timer0_ii(void) interrupt 1
{
static unsigned int num,i;
TH0=(65536-2000)/256;//重新赋值 2ms
TL0=(65536-2000)%256;
// DigDisplay(); // 调用数码管扫描
i++;
if(i==10) //20ms更新一次
{
i=0;
UpdateTimeFlag=1; //更新时间志位置1
}
num++;
if(num==500) //大致1s
{
num=0;
second++;
if(second==60) //秒到60,分钟加1
{
second=0;
minute++;
if(minute==60) //分钟到60,小时加1
{
minute=0;
hour++;
if(hour==24) //小时到24,回零
hour=0;
}
}
}
}
注意子函数中没有定义的变量都为全局变量
如有错误欢迎大家指正,我会虚心学习的,感谢阅读!