单片机定时器中断

2019-04-15 18:24发布

  就在前不久,我觉得我虽然书上的内容我已经看了不少,但是我觉得我对前面的内容还是了解的太少了,后面的内容就看不走,所以我又把书从头看着走,不过这次我带上了实际操作,就是每看完一节,自己就去跟着操作,收获确实不少,但是在中断这一节,我停留的时间比较久,估计差不多整整一周的时间吧。所以这次我就来分享一下我所了解的定时器中断吧。  其实中断的概念大家都很容易懂,简单的讲,就是单片机在处理某一件事情的时候,突然另外一件事情发生了,就停下当前的工作,去处理另外一件事情,当然可能不止一件事情发生,这就要根据它的优先级来看先处理那一件事情了。  我今天来说一下定时器中断的问题,也是一个困扰我很久的问题。首先我们来看一张图。本图片是百度的·    其实光看懂这张图,我就花了很多时间。下面的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; } }   各位看懂了吗?欢迎提出问题。