中断允许控制寄存器
CPU对中断系统所有中断以及某个中断源的开放和屏蔽是由中断允许寄存器IE控制的。
EX0(IE.0),外部中断0允许位;EX0=1,打开外部中断0中断;EX0=0关闭外部中断0中断。
ET0(IE.1),定时/计数器T0中断允许位; ET0=1打开T0中断;ET0=0关闭T0中断。
EX1(IE.2),外部中断1允许位;EX1=1 打开外部中断1中断,EX1=0 关闭外部中断1中断。
ET1(IE.3),定时/计数器T1中断允许位;ET1=1,打开T1中断;ET1=0 关闭T1中断。
ES(IE.4),串行口中断允许位;ES=1打开串口中断;ES=0 关闭串口中断。
EA (IE.7), CPU中断允许(总允许)位。EA=1,打开全局中断控制,由各中断控制位确定相应的中断打开或关闭;EA=0,关闭所有中断。
单片机定时器中断
51单片机内部有2个16位可编程的定时器/计数器,即定时器T0和定时器T1。他们既有定时功能又有计数功能,通过设置与他们相关的特殊功能寄存器,可以选择启用定时功能或计数功能。
注意,定时器系统是单片机内部一个独立的硬件部分,它与CPU和晶振通过内部某些控制线连接并相互作用,CPU一旦设置开启定时器功能后,定时器便在晶振的作用下自动计时,当定时器的计数器计满后会产生中断,即通知CPU该如何处理。
定时器/计数器的实质是加1计数器(16位),由高8位和低8位2个寄存器组成。TMOD是定时器/计数器的工作方式寄存器,确定工作方式和功能。TCON是控制寄存器 ,控制T0、T1的启动和停止及设置溢出的标志,如下图:
加1计数器输入的计数脉冲有两个来源,一个是由系统的时钟振荡器输出脉冲经12分频后送来;一个是T0或T1引脚输入的外部脉冲源。每来一个脉冲计数器加1,当加到计数器为全1时,再输入一个脉冲就使计数器回零,且计数器的溢出使TCON中TF0或TF1置1,向CPU发出中断请求(定时/计数器中断允许时)。如果定时/计数器工作于定时模式,则表示定时时间已到;如果工作于计数模式,则表示计数值已满。
可见,由溢出时计数器的值减去计数初值才是加1计数器的计数值。
工作方式寄存器TMOD
工作方式寄存器TMOD用于设置定时/计数器的工作方式,低四位用于T0,高四位用于T1。其格式如下:
GATE:门控位。GATE=0时,只要用软件使TCON中的TR0或TR1为1,就可以启动定时/计数器工作;GATA=1时,要用软件使TR0或TR1为1,同时外部中断引脚或也为高电平时,才能启动定时/计数器工作。即此时定时器的启动多了一条件。
M1M0:工作方式设置位。定时/计数器有四种工作方式,由M1M0进行设置。
控制寄存器TCON
定时器/计数器控制寄存器TCON在特殊功能寄存器中,字节地址为88H,可进行位寻址。TCON寄存器用来控制寄存器的启、停,以及标志定时器溢出和中断情况。单片机复位时,TCON全部清零。其各位定义如下
位 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |
位符号 | TF1 | TR1 | TF0 | TR0 | IE1 | IT1 | IE0 | IT0 | |
地址 | 8FH | 8EH | 8DH | 8CH | 8BH | 8AH | 89H | 88H |
TF1 ----定时器1溢出标志位,当定时器1计满溢出时,由硬件TF1置1,并且申请中断,进入中断服务程序后,由硬件自动清0(注意此处:触发中断程序后,计时器立即同步重新开始,应该是这个意思).如果使用定时器中断,那么该位完全不用认为去操作;如果使用软件查询方式的话,当查询到该位置1后,就需要使用软件清0.
TR1----定时器1运行控制位。由软件清0关闭定时器1。当GATE=1且INT1为高电平时,TR1置1,启动定时器1.当GATE=0时,TR1置1,启动定时器1。
TF0-----定时器0溢出标志,其功能及操作方法通TF1.
TR0-----定时器0运行控制位,其功能及操作方法通TR1。
C51 中断函数格式如下:
void 函数名() interrupt 中断号 using 工作组
{
中断服务程序内容
}
详解:中断函数不能有返回值,所以最前面用void ,后面紧跟函数名,名字名字可以随便起但不要与C语言的关键字相同;中断函数不带任何参数,所以函数名后面的()中为空;中断号是指单片机中的几个中断的序号,这个序号是编译器识别不同中断的唯一符号,因此在写中断服务程序时务必要写正确;最后的using工作组是指这个中断函数使用单片机内存中4组工作寄存器中的那一组,C51编译器在编译程序时会自动分配工作组,因此最后这句话可以省略,但大家以后遇到这样的程序代码时要知道是什么意思。
在写单片机的定时器程序时,在程序开始处需要对定时器及中断寄存器做初始化设置,通常初始化设置如下:
- 对TMOD赋值,以确定T0和T1的工作方式。
- 计算初值,并将初值写入TH0、TL0或TH1、TL1。
- 对IE赋值,开放中断
- 使TR0或TR1置位,启动定时器/计数器定时或计数。