最近在STC90C516RD+上做程序时遇到一个怪现象,有外部中断有计时器中断,计时器启动语句是在外部中断响应里的,但外部中断响应的其它语句并没有执行,计时器溢出中断却来了。
测试程序如下:
ORG 0000H
JMP MAIN
ORG 0003H
JMP INTRUP0
ORG 000BH
JMP TOUT0
ORG 0040H
MAIN:
SETB P3.2 ;INIT 2 INT SOURCE TO ACCEPT INPUT
SETB P3.3
SETB TCON.2 ;SET INT1 AS EDGE TRIGGER
SETB TCON.0 ;SET INT0 AS EDGE TRIGGER
MOV IE,#083H ;ENABLE BOTH INT1 AND TIMER0
MOV TMOD,#011H ;INIT TMOD AS 00010001 ENABLE BOTH TIMERS AS TIMER AND IN MODE 1
MOV TL0,#0H
MOV TH0,#0H
MOV P2,#0H
MOV P1,#077H ;DISPLAY A
JMP $
INTRUP0:
MOV P1,#079H ;DISPLAY E
SETB TR0
RETI
TOUT0:
MOV P1,#071H ;DISPLAY F
RETI
END
硬件搭在普中开发板上,相当于8051最小系统,P1口接8段数码管,P2口接数码管选通信号,INT0也就是P32脚接地。
理论上这段程序应该只显示字母A,但实际上A亮了一下就飞快跑到F了。INT0中断源为下降沿触发,常低的电平应该不会触发,即便触发了也应该会显示一下E。当MOV P1,#071H这句注释掉,也没有出现E,只有A,说明INTRUP0根本没执行到。但奇怪的是当我把SETB TR0注释掉,F也不出来了,只有A。从这些现象上看很像INTRUP0的第一句没执行而第二句被执行了。
想了好久都想不出为什么,只能来求教于各位高人了! |