单片机外中断使用方面的问题及其解决方法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
单片机外中断使用方面的问题及其解决方法
在长期使用51 单片机的过程中,我们发现单片机在工业生产现场等干扰较强的环境工作时,有时确已产生定义为下降沿触发方式的外中断,然而用仪器测量已经送入单片机的INTX 引脚时,单片机却不能够正常响应中断。
在排除了可能由程序导致的问题之后,再检查CPU 的当前状态,发现中断级别、中断允许、中断触发方式也都表明应该响应中断。
后经分析及测试,发现是单片机INTX 引脚内部端口锁存器被置为零所致。
当端口被封锁为零时,从该引脚引入的下降沿表示的中断申请将丢失,中断当然不被响应。
由于程序中并未使用可将端口锁存器置为零的指令,且这种情况的产生具有一定的随机性,并非经常发生,所以认为这种现象可能是因电路干扰或噪声造成锁存器误动作导致的。
同时我们还认为这种误动作和P3 口的内部结构及操作方式有一定关系。
单片机外中断输入端的P3 口是具有第二变异功能的准双向口,其每一位的内部结构如图1 所示。
当变异功能输出为高电平时,位口是普通I/O 口。
此时如对I/O 口进行写操作,数据由内部总线写入锁存器,经与非门和MOS 管两次反相后送出引脚;如对I/O 口进行读操作,则必须先将锁存器置为1,使MOS 管截止,引脚被片内负载MOS 管(图中标为上拉电阻)上拉为高电平,然后可进行输入操作,当输入为低电平时它能被拉成低电平,引脚信息经两个缓冲器进入内总线;如果使用第二功能(变异功能),输入锁存器同样也必须
先被置为1,这时引脚受变异功能输出控制,若需使用变异功能输入,则锁存器和变异输出必须同时置为1,使MOS 管截止,变异功能输入随引脚的变化而变化。
估计在第二功能时只能用于输入中断的P3.2 和P3.3 口,内部可能没有变异功能输出线,即使有,也只能上拉为固定的高电平。
可见,单片机P3
口不管是通用I/O 口还是变异功能输入,其锁存器都必须先置为1。
单片机复位后所有I/O 口的状态都是1,一般在系统的初始化程序中定义过中断优先级,并在开中断之后单片机即可响应中断,此后若关掉相应中断允许位(置为0),则需从引脚进入单片机的中断有效信号(低电平或下降沿)虽然仍可进入并使
IE0(或IE1)置为1,但不能引起中断,当然程序可查寻IE 了解中断源是否产生了中断申请。
笔者注意到单片机I/O 口有两类指令隐含着对I/O 口锁存器的写入。
第一类是读I/O 引脚指令,在执行了读I/O 引脚指令后,I/O 口锁存器状态将变得和引脚相同,如果在中断引脚为低电平期间正巧执行了这种指令,锁
存器将变为0 态,中断从此将不能进入。
第二类是读-修改-写锁存器指令,例如SETB PX.Y 和JBC
PX.Y,LABEL 等,这些指令被执行时总是先读入I/O 口全部8 位数据,作
一定修改或判断后再回写到锁存器中。
在笔者的程序中没有使用第一类指令,第二类指令倒是有,不过,不是对
P3.2(或P3.3)进行操作,而是对P3.4 和P3.5 进行操作(因为系统中使用了P3.4 和P3.5 作为普通I/O 位口)。
但是,我们认为有可能在执行这一类指令修改P3.4 和P3.5 锁存器位时,由于受到较强的干扰而误将
P3.2(或P3.3)写成了0,从而出现上述情况。
为了验证这一点,我们去掉了程序中对P3.4 和P3.5 进行操作的指令,发现中断不能进入的现象基本消失,但在极个别情况下,中断仍不能进入,这种极个别的现象纯粹是随机干扰
所致。
为彻底解决中断不能进入的问题,采用了如下两种措施:
(1)放弃P3 口剩余的位口,不将其作为普通I/O 位口用,而用单片机外
部扩充的接口取而代之;
(2)在中断服务程序即将退出之前,往P3.2(或P3.3)口写1,以使
P3.2(或P3.3)位的锁存器状态在下一次中断到来之前为1,从而保证不漏掉任何一次中断申请。
对系统作了以上两点改进后,中断丢失的现象再也没有发生过。
参考文献1孙育才.MCS-51系列单片微型计算机及其应用.南京:东南大学出版社,1987
tips:感谢大家的阅读,本文由我司收集整编。
仅供参阅!。