【例6-1】 利用定时器作外部中断源。
解:MCS-51单片机有两个定时器/计数器,当它们选择计数工作方式时,T0或T1引脚上的负跳变将使T0或T1计数器加“1”计数,故若把定时器/计数器设置成计数工作方式,计数初始设定为满量程,一旦外部从计数引脚输入一个负跳变信号,计数器T0或T1加“1”产生溢出中断,这样便可把外部计数输入端T0(P3.4)或T1(P3.5)扩充作为外部中断源输入。
例如,将T1设置为工作方式2(自动恢复常数)及外部计数方式,计数器TH1、TL1初值设置为0FFH。当计数输入端T1(P3.5)发生一次负跳变,计数器加“1”并产生溢出标志,向CPU申请中断,中断处理程序使累加器A内容加“1”,送P1口输出,然后返回主程序。编程如下:
ORG 0000H ;用户程序首址
AJMP MAIN ;转主程序
ORG 00lBH
AJMP INTS ;转中断服务程序
MAIN: MOV SP,#60H ;堆栈指针赋初值
MOV TMOD,#60H ;T1方式2,计数
MOV TL1,#0FFH ;送常数
MOV TH1,#0FFH
SETB TR1 ;启动Tl计数
SETB ET1 ;允许T1中断
SETB EA ;CPU开中断
LOOP: SJMP LOOP ;等待
INTS: INC A ;T1中断处理程序
MOV P1,A
RETI ;中断返回
【例6-2】 图6-5为多个故障显示电路。当系统无故障时,4个故障源输入端X1~X4全为低电平,显示灯全灭;当某部分出现故障,其对应的输入由低电平变为高电平,从而引起MCS-51单片机中断,中断服务程序的任务是判定故障源,并用对应的发光二极管LED1~LED4进行显示。
图6-5 利用中断对多个故障进行显示
解:编程如下。
ORG 0000H
AJMP MAIN
ORG 0003H
AJMP SERVE
MAIN: ORL P1,#0FFH ;灯全灭,准备读入
SETB IT0 ;选择边沿方式
SETB EX0 ;允许INT0中断
SETB EA ;CPU开中断
AJMP $ ;等待中断
SERVE: JNB P1.3,L1 ;若X1有故障
CLR P1.4 ;LED1亮
L1: JNB P1.2,L2 ;若X2有故障
CLR P1.5 ;LED2亮
L2: JNB P1.1,L3 ;若X3有故障
CLR P1.6 ;LED3亮
L3: JNB P1.0,L4 ;若X4有故障
CLR P1.7 ;LED4亮
L4: RETI
下面给出一个应用定时器中断的实例。要求编制一段程序,使P1.0端口线上输出周期为2 ms的方波脉冲。设单片机晶振频率为6 MHz。
方法:利用定时器T0作1ms定时,达到定时值后引起中断。在中断服务程序中,使P1.0的状态取一次反,并再次定时1ms。
机器周期显然为2ms,所以定时1ms所需的机器周期个数为500,亦即01F4H。设T0为工作方式1(16位方式),则定时初值是01F4H,求补等于0FE0CH。
程序如下:
ORG 0000H
AJMP START
ORG 000BH
AJMP IST0 ;转入T0中断服务程序入口地址IST0
MOV TMOD,#01H ;T0为定时器状态,工作方式1
MOV TL0,#0CH ;T0的低位定时初值
MOV TH0,#0FEH ;T0的高位定时初值
MOV TCON,#10H ;打开T0
SETB ET0 ;允许T0中断
SETB EA ;允许中断
AJMP $ ;动态暂停
IST0: MOV TL0,#0CH ;重置定时器初值
MOV TH0,#0FEH ;重置定时器初值
CPL P1.0 ;P1.0取反
RETI ;中断返回
(1)编写出外部中断1为跳沿触发的中断初始化程序。
(2)中断服务子程序返回指令RETI和普通子程序返回指令RET有什么区别?
(3)某系统有3个外部中断源1、2、3,当某一中断源变为低电平时,便要求CPU进行处理,它们的优先处理次序由高到低依次为3、2、1,中断处理程序的入口地址分别为1000H、1100H、1200H。试编写主程序及中断服务程序(转至相应的中断处理程序的入口即可)。