中断及定时计数器
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
单片机的中断与定时器/计数器
中断就是停止当前的任务,去做另一个需要马上处理的任务,做完后再回去做原来的任务!
P1.0P1.1P1.2P1.3P1.4P1.5P1.6P1.7RST/V PD P3.0/RXD P3.1/TXD P3.2/INT0P3.3/INT1P3.4/T0P3.5/T1P3.6/WR P3.7/RD XTAL2XTAL1V SS
V CC P0.0P0.1P0.2P0.3P0.4P0.5P0.6P0.7EA/V PP PSEN P2.7P2.6P2.5P2.4P2.3P2.2P2.1P2.0
RST P3.0/RXD P3.1/TXD
XTAL2XTAL1P3.2/INT0P3.3/INT1P3.4/T0P3.5/T1
GND
V CC P1.7P1.6P1.5P1.4P1.3P1.2
P1.1/AIN1P1.0/AIN0P3.7
注:类似的还有Philips公司的 87LPC64,20引脚
8XC748/750/(751),24引脚 8X749(752),28引脚 8XC754,28引脚 等等
如上图 8051中有5个中断:
P3.2和P3.3为外部中断INT0和INT1端口,
P3.4和P3.5为定时器/计数器中断T0和T1端口, 以及一个串行口中断,(此内容暂时不讲)
8052中有6个中断,比8051多一个特殊的定时器/计数器中断。(暂时不讲)
外部中断: INT0和INT1
外部中断通过其对应的引脚来接受外部中断请求,触发方式有两种: 1.低电平触发,即得到地电位就触发中断。
2.负边沿触发,即由高电平降至低电平的瞬间触发。 区别在于低电平触发属于静态触发,只要是低电平就一定触发;而负边沿触发为动态触发,必须由高电平变为低电平的时候才会触发。
控制触发方式的开关为:IT 。
IT0和IT1分别对应控制INT0和INT1的触发方式。 0为低电平触发,1为负边沿触发。 例:外部中断INT0开启低电平触发: IT0=0;
定时器/计数器中断: T0和T1
它有两种工作模式:定时器与计数器。
1. 定时器模式下,单片机对内部时钟脉冲进行计数。不使用外部端口。
2. 计数器模式下,单片机对外部脉冲进行计数,使用外部端口,外部脉冲由外部对应
端口进入。即P3.4和P3.5
至于定时器/计数器是如何触发中断的将在后半部分内容中详细说明。
中断的启用与控制:
中断平时是关闭的,只有通过打开相应的开关才能使用,打开后还需进行相应的设置。
1、EA ---- 中断允许总控制器
=0,中断总禁止,关闭所有中断。
=1,中断总允许,各中断的允许或禁止由各中断的控制位进行设置。
2、EX0 EX1 ---- 外部中断0(1)允许控制位。
=0,禁止外中断。
=1,允许外中断。
3、ET0 ET1 ---- 定时中断0(1)允许控制位。
=0,禁止定时中断。
=1,允许定时中断。定时器产生中断(触发方式后面讲),响应中断服务程序。
4、ES ---- 串行中断允许控制位。
=0,禁止串行中断。
=1,允许串行中断。
1、IE0 IE1 ---- 外部中断请求标志位。(硬件自动清零)
cpu检测到中断端口出现有效中断请求时,此位被置1,再中断响应完成转向中断服务子程序时,再由硬件自动清为0。
2、IT0 IT1 ---- 外部中断触发方式控制位。(软件置位、清零)
=0,时电平触发方式,低电平有效。
=1,是脉冲触发方式,下降沿触发有效;
3、TR0 TR1 ---- 定时器0(1)运行控制位。
=0,禁止定时器运行;
=1,允许定时器运行。
4、TF0 TF1 ---- 内部定时/计数器0(1)溢出标志。
相应的定时器溢出时,被自动置为1。当转向中断服务子程序时,再由硬件自动清0。
中断的优先级:
多个中断同时触发时候将会按照优先级顺序来执行:
默认的自然优先顺序为:
外中断 0→定时器0→外中断1→定时器1→串口中断(8052中的定时器2与串口中断的自然优先级相同,都在最底。)
8051单片机可人工对其优先级进行调整,但只有2个级别。高级优先于低级执行,在同等级内部优先顺序依旧按照自然优先顺序排列。
1、PX0 PX1 ---- 外中断0(1)优先级设定位。
2、PT0 PT1 ---- 定时中断0(1)优先级设定位。
3、PS ---- 串行中断优先级设定位。
=0,低优先级;
=1,高优先级。
举例:假定开放外中断1,采用负边沿触发方式,高优先等级需要作如下设定:
EA=1
EX1=1
IT1=1
PX1=1
中断的嵌套使用:
假如现在程序已经进入一个中断子程序进行执行。此时又一中断触发,若此中断等级高于正在执行的中断,则停止当前任务处理中断请求;若此中断等级低于或等于当前处理中断,则等当前正在处理的中断执行完后在给与处理。
中断的使用:
中断号中断源中断向量
0 外部中断0 0003H
1 定时器0 000BH
2 外部中断1 0013H
3 定时器1 001BH
4 串行口0023H
5 定时器2 0X2BH (外加器件)
语法如下:
void X(void) interrupt 中断号
函数X()与中断源的联系是通过使用Keil的关键字interrupt 建立起来的。
例:
void x(void) interrupt 1
{ ET0=0; //禁止定时中断
P1=0x0f;
delay(1000);
P1=0xf0;
delay(1000);
EX0=1; //允许外中断
}