本帖最后由 gary2009 于 2011-9-28 21:06 编辑
我编了一个非常简单的汇编程序:单片机在正常情况下不断的做延时待机循环,当有外部中断INTO来得时候,跳到中断执行中断,完毕之后又回到延时待机循环。单片机加电后可以执行正常的外部随机中断,当运行了几个小时候,随机中断就不能执行了。但是单片机还能正常的执行延时待机循环非常奇诡的问题。单片机型号是所STC15F104E,程序中我也用了看门狗。
想不通为什么几个小时候中断就不能正常执行了,重启后一切又正常了。如果是干扰的话,单片机应该死机呀,为什么还能执行正常的待机循环程序。这里请请高手指点一下是什么问题,先感谢了。
程序很简单如下所示:
WDT_CONTR DATA 0C1H ;STC15F看门狗标志位
org 0000H
JMP Main ;跳转到主程序MAIN
ORG 0003H ;INT0的中断服务子程序向量地址为0003H
JMP Charging
MAIN:
; MOV WDT_CONTR,#00111111B
MOV SP, #7FH ;设定堆栈指针
SETB IT0
SETB EX0
SETB EA
START:
CLR P3.3
LCALL YS5S
; MOV WDT_CONTR,#00111111B
LCALL YS5S
; MOV WDT_CONTR,#00111111B
LCALL YS5S
; MOV WDT_CONTR,#00111111B
LCALL YS5S
; MOV WDT_CONTR,#00111111B
LCALL YS5S
; MOV WDT_CONTR,#00111111B
LCALL YS5S
; MOV WDT_CONTR,#00111111B
LCALL YS5S
; MOV WDT_CONTR,#00111111B
SETB P3.3
LCALL YS5S
; MOV WDT_CONTR,#00111111B
LOOP:
CLR P3.3
LCALL YS5S
; MOV WDT_CONTR,#00111111B
LCALL YS5S
; MOV WDT_CONTR,#00111111B
LCALL YS5S
; MOV WDT_CONTR,#00111111B
SETB P3.3
LCALL YS5S
; MOV WDT_CONTR,#00111111B
LCALL YS5S
; MOV WDT_CONTR,#00111111B
LCALL YS5S
; MOV WDT_CONTR,#00111111B
LCALL YS5S
; MOV WDT_CONTR,#00111111B
LJMP LOOP
Charging:
PUSH ACC ;将累加器的值压入堆栈保存
PUSH PSW ;将PSW的值压入堆栈保存
SETB RS0 ;设定工作寄存器组0
CLR RS1
CLR P3.3
CLR P3.4
CLR P3.0
CLR P3.1
LCALL YS5S
SETB P3.4
; MOV WDT_CONTR,#00111111B
LCALL YS5S
; MOV WDT_CONTR,#00111111B
LCALL YS5S
; MOV WDT_CONTR,#00111111B
LCALL YS5S
; MOV WDT_CONTR,#00111111B
LCALL YS5S
; MOV WDT_CONTR,#00111111B
LCALL YS5S
; MOV WDT_CONTR,#00111111B
SETB P3.3
SETB P3.0
SETB P3.1
POP PSW ;从堆栈取回PSW的值
POP ACC ;从堆栈取回ACC的值
NOP
NOP
RETI
YS5S:
MOV R7,#0FEH
DL1:
MOV R6,#0E8H
DL0:
MOV R5,#0FDH
DJNZ R5,$
DJNZ R6,DL0
DJNZ R7,DL1
MOV R5,#989H
DJNZ R5,$
NOP
NOP
RET
END
程序中我我没有使用看门狗 |