- 电子工程师自学宝典:嵌入设计篇
- 蔡杏山编著
- 1337字
- 2022-01-21 14:00:26
6.3 中断编程举例
6.3.1 中断编程的电路例图
本节以图6-6所示电路来说明单片机中断的使用,当按键S3或S4按下时,给单片机的INT0(P3.2)端或INT1(P3.3)输入外部中断请求信号。
图6-6 中断编程的电路例图
6.3.2 用外部中断0以低电平方式触发中断的程序与说明
图6-7是用外部中断0以低电平方式触发中断的程序。程序执行时,在未按下P3.2端口外接的S3按键时,P1.0、P1.1和P1.4、P1.5端口外接LED会亮,按下S3再松开,这些端口外接LED熄灭,P1.2、P1.3、P1.6、P1.7端口外接LED则变亮,如果S3一直按下不放,P1.0~P1.7端口所有外接LED均变亮。
在程序中,先初始化P1端口,然后将IP寄存器、IE寄存器和TCON寄存器有关位的值设为1,让INT0为高优先级,打开总中断和INT0中断,并将INT0中断输入方式设为低电平有效,再用while(1)语句进入中断等持。一旦P3.2端口外接的S3按键按下,P3.2端口(即INT0端)输入低电平,触发单片机的INT0中断,马上执行中断函数(也可称中断子程序),中断函数中只有一条语句P1=~P1,将P1端口各位值变反(P1=0xcc),中断函数执行后,又返回while(1)语句等待。如果S3按键未松开,仍处于按下状态,中断函数又一次执行,P1端口各位值又变反,由于中断函数两次执行时间间断短,P1端口值变化快,其外接LED亮灭变化也较快,由于人眼视觉暂留特性,会觉得所有的LED都亮。如果按下S3按键后马上松开,中断函数只执行一次,就可以看到P1端口不同引脚的LED亮灭变化,也可以在中断函数内部最后加一条EA=0来关闭总中断,这样中断函数只能执行一次,即使再按压S3键也不会引起中断。
用“(返回值)函数名(输入参数)interrupt n using m”语法可定义一个中断函数,interrupt为定义中断函数的关键字,n为中断源编号(见表6-1),n=0~4,m为用作保护中断断点的寄存器组,可使用4组寄存器(0~3),每组有7个寄存器(R0~R7),m=0~3,若程序中只使用一个中断,可不写"using m",使用多个中断时,不同中断应使用不同的m。
图6-7 用外部中断0以低电平方式触发中断的程序
6.3.3 用外部中断1以下降沿方式触发中断的程序与说明
图6-8是用外部中断1以下降沿方式触发中断的程序。程序执行时,在未按下P3.3端口外接的S4按键时,P1.0、P1.1和P1.4、P1.5端口外接LED会亮,按下S4再松开,这些端口外接LED熄灭,P1.2、P1.3、P1.6、P1.7端口外接LED则变亮,如果S4一直按下不放,P1.0~P1.7引脚外接LED保持四亮四灭不变。
图6-8 用外部中断1以下降沿方式触发中断的程序
在程序中,与使用外部中断0一样,先初始化P1端口,然后将IP寄存器、IE寄存器和TCON寄存器有关位的值设为1,让INT1为高优先级,打开总中断和INT1中断,并将INT1中断输入方式设为下降沿有效,再用while(1)语句进入中断等待。一旦P3.3端口外接的S4按键按下,P3.3端口(即INT1端)输入下降沿,触发单片机的INT1中断,马上执行中断函数(也可称中断子程序)。由于按键按下时的抖动可能会出现多个下降沿,可能会使中断函数多次执行,故在中断函数中采用了按键防抖程序,当S4按键按下产生第一个下降沿后,马上触发中断执行中断函数,在中断函数中检测到INT1端为低电平后,执行延时函数延时10ms,避开按键抖动时间,再检测INT1端状态,一旦INT1端变为高电平(S4键松开),马上执行P1端口值取反语句(P1=~P1)。
由于本例中采用按键输入模拟中断请求输入,而按键操作时易产生抖动信号,使输入的中断请求信号比较复杂,故在程序中加入了按键防抖语句,有关按键抖动与防抖内容在后续章节中介绍。