单片机定时器中断

  就在前不久,我觉得我虽然书上的内容我已经看了不少,但是我觉得我对前面的内容还是了解的太少了,后面的内容就看不走,所以我又把书从头看着走,不过这次我带上了实际操作,就是每看完一节,自己就去跟着操作,收获确实不少,但是在中断这一节,我停留的时间比较久,估计差不多整整一周的时间吧。所以这次我就来分享一下我所了解的定时器中断吧。

  其实中断的概念大家都很容易懂,简单的讲,就是单片机在处理某一件事情的时候,突然另外一件事情发生了,就停下当前的工作,去处理另外一件事情,当然可能不止一件事情发生,这就要根据它的优先级来看先处理那一件事情了。

  我今天来说一下定时器中断的问题,也是一个困扰我很久的问题。首先我们来看一张图。本图片是百度的·

    其实光看懂这张图,我就花了很多时间。下面的TMOD,TCON是两个寄存器,分别是定时器/计数器工作方式寄存器和定时器/计数器控制寄存器,TMOD的高4位用于设置定时器1,也就是上图的T1引脚,低四位用于设置定时器0,上图的T0引脚。TCON其实主要是用来控制定时器的启、停、标志定时器中断溢出情况。

  我给大家举个例子,假如说我们用了定时器0,首先我们要给定时器0的TL0和TH0装一个初值,然后定时器就开始加1计数,然后当TL0记满后,向TH0进一位,直到把TH0也记满,此时计数器就溢出,置TF0为1(TF0为TCON中的一位,也就是定时器0的溢出标志),接着向CPU申请中断。

    如果说你看到这儿还没懂,废话不多说,下面来看一段程序,帮助理解。

#include<reg52.h>
#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;
		
	}	
}
  各位看懂了吗?欢迎提出问题。

猜你喜欢

转载自blog.csdn.net/xhl1123456789/article/details/80283653