就在前不久,我觉得我虽然书上的内容我已经看了不少,但是我觉得我对前面的内容还是了解的太少了,后面的内容就看不走,所以我又把书从头看着走,不过这次我带上了实际操作,就是每看完一节,自己就去跟着操作,收获确实不少,但是在中断这一节,我停留的时间比较久,估计差不多整整一周的时间吧。所以这次我就来分享一下我所了解的定时器中断吧。 其实中断的概念大家都很容易懂,简单的讲,就是单片机在处理某一件事情的时候,突然另外一件事情发生了,就停下当前的工作,去处理另外一件事情,当然可能不止一件事情发生,这就要根据它的优先级来看先处理那一件事情了。 我今天来说一下定时器中断的问题,也是一个困扰我很久的问题。首先我们来看一张图。
本图片是百度的· 其实光看懂这张图,我就花了很多时间。下面的TMOD,TCON是两个寄存器,分别是定时器/计数器工作方式寄存器和定时器/计数器控制寄存器,TMOD的高4位用于设置定时器1,也就是上图的T1引脚,低四位用于设置定时器0,上图的T0引脚。TCON其实主要是用来控制定时器的启、停、标志定时器中断溢出情况。 我给大家举个例子,假如说我们用了定时器0,首先我们要给定时器0的TL0和TH0装一个初值,然后定时器就开始加1计数,然后当TL0记满后,向TH0进一位,直到把TH0也记满,此时计数器就溢出,置TF0为1(TF0为TCON中的一位,也就是定时器0的溢出标志),接着向CPU申请中断。 如果说你看到这儿还没懂,废话不多说,下面来看一段程序,帮助理解。
#include
#define uchar unsigned char
#define uint unsigned int
sbit led1 = P1^0;
uchar num;
void main()
{
TMOD=0x01; //设置定时器0为工作方式1(M1M0为01)
TH0=(65536-45782)/256;//装初值
TL0=(65536-45782)%256;
EA=1; //开总中断
ET0=1; //开定时器0中断
TR0=1; //启动定时器0
while(1); //程序停止在这里等待中断发生
}
void T0_time()interrupt 1
{
TH0=(65536-45782)/256;
TL0=(65536-45782)%256;
num++;
if(num==2+0)
{
num=0;
}
}
各位看懂了吗?欢迎提出问题。