一个简单的汇编程序:
单片机在正常情况下不断的做延时待机循环,当有外部中断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
复制代码在程序中我没有使用看门狗.
说实话,老妖的手册看得我头都大
一周热门 更多>