单片机原理与应用(五)第五章MCS-51单片机的中断系统5.1 中断系统概述中断:CPU暂时停止正在执行的程序,自动转去执行需紧迫处理的事件(程序),并在处理完毕后能够返回原来程序暂停的位置,接着继续执行。
5.2 中断源和中断控制5.2.1 中断源:能够让CPU暂停执行的信号(硬件)。
8051单片机有5个中断源:2个内部定时器/计数器T0和T1溢出中断:TF0和TF1。
2个外部输入INT0(P3.2)和INT1(P3.3)中断:IE0和IE1。
1个串行口发送/接收中断:TI / RI。
1. 定时器/计数器中断控制寄存器TCON (88H)D7 D6 D5 D4 D3 D2 D1 D0TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0(1) IT0 为外部中断0的触发方式控制位:(由软件置位)当IT0=0时,为负电平触发方式,即INT0(P3.2脚)为低电平时,置IE0=1。
当IT0=1时,为边沿负跳变触发方式,即INT0从高变为低电平时,置IE0=1。
(2) IE0为外部中断0的触发标志(申请中断):(当INT0的电平变化时由硬件置位)硬件置位IE0=1时,向CPU请求中断。
在CPU响应中断请求后,当IT0=1时,IE0自动清零;而当IT0=0时,IE0不能自动清零。
(3) IT1 为外部中断1的触发方式控制位:(由软件置位)同IT0。
(4) IE1 为外部中断1的触发标志(申请中断):同IE0。
(5) TF0为T0的溢出标志(申请中断):当T0的(TH0、TL0)计满溢出时,硬件置TF0为“1”,并向CPU申请中断。
CPU响应中断后,TF0自动清零。
(6) TF1为T1的溢出标志(申请中断):当T1的(TH1、TL1)计满溢出时,硬件置TF1为“1”,并向CPU申请中断。
CPU响应中断后,TF1自动清零。
2. 串行口控制寄存器SCON (98H)D7 D6 D5 D4 D3 D2 D1 D0SM0 SM1 SM2 REN TB8 RB8 TI RI1) TI:串行口发送中断标志位。
发送完成后TI=1。
2) RI:串行口接收中断标志位。
接收完成后RI=1。
5.2.2 中断控制1. 中断允许控制寄存器IE (A8H)D7 D6 D5 D4 D3 D2 D1 D0EA ---- ---- ES ET1 EX1 ET0 EX01) EA:中断允许总控制位当EA=0时,所有中断都禁止;当EA=1时,所有中断都允许。
2) ES:串行口中断允许控制位当ES=0时,禁止串行口中断;当ES=1时,允许串行口中断。
3) ET1:定时器/计数器T1中断允许控制位当ET1=0时,禁止T1中断;当ET1=1时,允许T1中断。
4) EX1:外部INT1中断允许控制位当EX1=0时,禁止INT1中断;当EX1=1时,允许INT1中断。
5) ET0:定时器/计数器T0中断允许控制位当ET0=0时,禁止T0中断;当ET0=1时,允许T0中断。
6) EX0:外部INT0中断允许控制位当EX0=0时,禁止INT0中断;当EX0=1时,允许INT0中断。
8051单片机系统上电复位后,IE的各位均被置“0”。
2. 中断优先级控制寄存器IP (B8H)D7 D6 D5 D4 D3 D2 D1 D0---- ---- ---- PS PT1 PX1 PT0 PX0如果有多个中断源同时请求中断时,就须分出处理的先后。
8051单片机分为高、低两个中断优先级,由软件设置,当处于同一优先级时,按以下次序的先后进行处理:外部INT0中断(IE0) →定时器T0溢出(TF0) →外部INT1中断(IE1) →→定时器T1溢出(TF1) →串行口中断(TI / RI)1) PS:串行口中断优先级控制位。
当设置PS=1时为高级优先,PS=0时为低级。
2) PT1:定时器/计数器T1中断优先级控制位。
优先级设置同上。
3) PX1:外部INT1中断优先级控制位。
优先级设置同上。
4) PT0:定时器/计数器T0中断优先级控制位。
优先级设置同上。
5) PX0:外部INT0中断优先级控制位。
优先级设置同上。
8051单片机系统上电复位后,IP的各位均被置“0”。
中断优先级控制系统的等效电路逻辑结构图:INT 0& IE0 IE寄存器IP寄存器高级中断请求IT0 触发器低级中断请求INT 1 IE1 EX0TF0TF1 ET0TIRIESEA PX05.3 中断处理5.3.1 中断的响应过程1. 硬件响应:当前程序计数器PC的内容进栈,中断入口地址装入PC中,程序转移到该中断入口地址去执行中断服务子程序。
2. 软件响应:进入中断服务子程序后,执行关中断→保护现场→开中断→中断处理→关中断→恢复现场→开中断→中断返回。
注意:在保护现场和恢复现场时,不允许其他中断进入,必须禁止中断。
中断入口地址表中断源中断入口地址外部输入INT0中断0003H内部定时器/计数器T0溢出中断000BH外部输入INT1中断0013H内部定时器/计数器T1溢出中断001BH串行口发送/接收中断0023H5.3.2 中断的响应时间:一般是3~8个机器周期。
5.3.3 外部中断的方式(IT0 / IT1)1. 电平触发方式:要求在中断返回之前能清除中断源的低电平。
2. 边沿触发方式:要求触发电平至少要保持12个时钟周期。
5.4 外部中断源的扩展(略)5.5 中断系统设计中应注意的几个问题5.5.1 调试时注意开发机上使用的中断入口地址(目前的仿真器已无此问题)5.5.2 保护现场:一般是把累加器A、程序状态字PSW、数据指针DPTR、等进栈。
例:CLR EAPUSH APUSH PSWPUSH DPHPUSH DPLSETB EA恢复现场:以保护现场时进栈的反序出栈。
例:CLR EAPOP DPLPOP DPHPOP PSWPOP ASETB EARETI5.5.3 中断标志的清除(1) T0的TF0、T1的TF1、IT0=1(负边沿触发)时的IE0,IT1=1时的IE1这四个中断标志,在中断响应后,CPU会自动清零。
(2) IT0=0(负电平触发)时的IE0,IT1=0时的IE1这两个中断标志,必须撤消引起外部中断的负电平信号。
(3) 串行口中断信号TI、RI,必须由软件清零。
中断的应用:(1) 设置中断允许控制寄存器IE (EA=0)。
(2) 设置中断优先级控制寄存器IP。
(3) 对于外部中断,还要设置中断请求触发方式IT0 / IT1。
(4) 在相应的中断入口地址处加一条无条件转移指令:LJMP <标号>(5) 在主程序的开头加开中断指令:SETB EA(6) 编写中断处理子程序。
例题1:采用外部中断方式的按键计数程序。
K BIT P3.2S EQU 20HORG 0000HMain: MOV S, #00H ; S置初值0MOV P0, #0C0H ; 显示‘空’L1: SETB KJB K, L1 ; K=1, 无键入LCALL Delay10 ; 消抖处理JB K, L1 ; K=1, 是抖动INC S ; K键按下的处理:S S+1, 显示数值S(0~9)MOV A, SMOV DPTR, #TABMOVC A, @A+DPTR; 取出数值S对应的LED显示段码MOV P0, A ; 显示数值S(0~9)L2: SETB KJNB K, L2 ; K=0, 键没有松开LCALL Delay10 ; 消抖处理JNB K, L2 ; K=0, 是抖动MOV A, SCJNE A, #10, L1SJMP MainTAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0C0HDelay10: MOV R4, #10 ; 10*1ms=10ms ; 延时10msDe1: MOV R5, #250 ; 250*4us=1msDe2: DJNZ R5, De2 ; 4us,设f = 6MHzDJNZ R4, De1RETEND例题2:采用外部中断方式的倒计数程序。
K BIT P3.2S EQU 20H P0ORG 0000HMain: MOV S, #09H KMOV P0, #0FFH ; 显示‘空’P3.2 +5VL1: SETB KJB K, L1 ; K=1, 无键入MOV A, S ; K键按下的处理:显示数值S(9~0) ,S←S-1MOV DPTR, #TABMOVC A, @A+DPTR ; 取出数值S对应的LED显示段码MOV P0, A ; 显示数值S(0~9)LCAL Delay ; 延时1sMOV A, SJZ MainDEC SSJMP L1TAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0C0H Delay: MOV R3, #5 ; 5*200ms=1000ms=1sDe0: MOV R4, #200 ; 200*1ms=200msDe1: MOV R5, #250 ; 250*4us=1msDe2: DJNZ R5, De2 ; 4us,设f = 6MHzDJNZ R4, De1DJNZ R3, De0RETEND课堂上机练习题:请把单个LED显示的倒计数例题的按钮输入识别改为中断的方式。
其编程调试步骤如下:①:编写主程序1.编写主程序主程序:ORG 0000HMain: MOV S, #9MOV P0, #0FFH ; 显示‘空’L1: SETB KJB K, L1 ; K=1, 无键入MOV A, S ; K键按下的处理:显示数值S(9~0) ,S←S-1MOV DPTR, #TABMOVC A, @A+DPTR ; 取出数值S对应的LED显示段码MOV P0, A ; 显示数值S(0~9)LCALL Delay ; 延时1sMOV A, SJZ MainDEC SSJMP L1TAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0C0HDelay: MOV R2, #5 ; 延时500msDe0: MOV R3, #100 ; (延时100ms)De1: MOV R4, #250 ;De2: DJNZ R4, De2 ; 250*4us=1ms,设f = 6MHzDJNZ R3, De1DJNZ R2,De0RETEND2.输入并调试、运行通过。
②:在初始化中加入(1) 设置中断允许控制寄存器IE (EA=0)。
(2) 设置中断优先级控制寄存器IP。
(3) 对于外部中断,还要设置中断请求触发方式IT0 / IT1。