C51单片机5种中断例子及中断程序改进
C51单片机5种中断例子及中断程序改进
单片机中断编程是嵌入式系统开发中的重要技术,它允许单片机在接收到外部信号时暂停当前任务,转而执行特定的中断服务程序。这种机制可以提高系统的响应速度和效率。本文将通过5个具体的中断例子,详细介绍C51单片机的中断编程方法。
1. 中断响应
在单片机P1口上接有8只LED。在外部中断0输入引脚(P3.2)接一只按钮开关K1。要求将外部中断0设置为电平触发。程序启动时,P1口上的8只LED全亮。每按一次按钮开关K1,使引脚接地,产生一个低电平触发的外中断请求,在中断服务程序中,让低4位的LED与高4位的LED交替闪烁5次。然后从中断返回,控制8只LED再次全亮。
2. 二次中断
在单片机P1口上接有8只LED。在外部中断0输入引脚(P3.2)接有一只按钮开关K1。在外部中断1输入引脚(P3.3)接有一只按钮开关K2。要求K1和K2都未按下时,P1口的8只LED呈流水灯显示,仅K1(P3.2)按下再松开时,上下各4只LED交替闪烁10次,然后再回到流水灯显示。如果按下再松开K2(P3.3)时,P1口的8只LED全部闪烁10次,然后再回到流水灯显示。设置两个外中断的优先级相同。
3. 中断嵌套
设计一中断嵌套程序:要求K1和K2都未按下时,P1口8只LED呈流水灯显示,当按一下K1时,产生一个低优先级外中断0请求(跳沿触发),进入外中断0中断服务程序,上下4只LED交替闪烁。此时按一下K2时,产生一个高优先级的外中断1请求(跳沿触发),进入外中断1中断服务程序,使8只LED全部闪烁。当显示5次后,再从外中断1返回继续执行外中断0中断服务程序,即P1口控制8只LED,上、下4只LED交替闪烁。设置外中断0为低优先级,外中断1为高优先级。
3个例子重要知识点:中断优先级寄存器IP各位含义:
(1)PS—串行口中断优先级控制位,1—高级;0—低级。
(2)PT1—T1中断优先级控制位,1—高级;0—低级。
(3)PX1—外部中断1中断优先级控制位,1—高级;0—低级。
(4)PT0—T0中断优先级控制位,1—高级;0—低级。
(5)PX0—外部中断0中断优先级控制位,1—高级;0—低级。
4. 定时中断
在AT89S51的P1口上接有8只LED,原理电路见图7-13。采用T0方式1的定时中断方式,使P1口外接的8只LED每0.5s闪亮一次。
在第四个例子中:设定时间为5ms,则规定时间根据公式有:
定时时间=(216−X)×12/晶振频率
则 5 000=(216 −X) ×12/11.059 2
得 X = 60 928
转换成十六进制:0xee00,其中0xee装入TH0,0x00装入TL0。
如果要设定时间为1s,则相同带入公可得出要将0xdc装入TH0。
5. 计数中断
T1采用计数模式,方式1中断,计数输入引脚T1(P3.5)上外接按钮开关,作为计数信号输入。按4次按钮开关后,P1口的8只LED闪烁不停。
一般来说,中断函数中要尽量避免使用执行时间较长(耗时)的代码,以避免中断服务影响到主程序代码的执行效率。但是在上面外部中断的实验中,中断函数采用了软件延时函数去控制LED亮灭的间隔周期。这是一种不好的编程。请你思考,换一种更合理的方式,不在中断函数使用延时循环,实现同样的功能。(提示:可以在main函数中写好几种亮灯模式代码和对应的模式标志位,按键中断发生后,中断服务程序只改变模式标志位,不做其他处理;由主程序根据模式标志,选择不同的亮灯模式)
使用中断函数执行长时间的操作,如软件延时控制LED的亮灭,确实会影响程序的执行效率,因为这会占用大量的CPU时间,导致主程序或其他中断服务的响应变慢。更合理的方法是利用中断服务程序(ISR)仅做快速的状态改变或标志位设置,而具体的逻辑处理则留给主程序来完成。以下是实现这一目标的建议方法:
- 定义全局变量或标志位:首先,在程序中定义一个或多个全局变量作为模式标志位,用来指示当前应该执行哪一种LED亮灯模式。
- 中断服务程序(ISR):在中断服务程序中,不直接进行LED控制或延时操作,而是仅仅改变前面定义的模式标志位。例如,每次外部中断发生时,就切换到下一个亮灯模式。
- 主程序循环中处理逻辑:在主程序的循环中,根据模式标志位的值来选择执行相应的LED亮灯模式。每种模式都可以包含适当的延时或其他逻辑,但这些操作不会被中断影响,因为它们在主循环中执行。
参考博客:51单片机的中断与定时计数