请教STC15F104E单片机中断的问题

2019-07-16 06:46发布

一个简单的汇编程序:单片机在正常情况下不断的做延时待机循环,当有外部中断INTO来得时候,跳到中断执行中断,完毕之后又回到延时待机循环。单片机加电后可以执行正常的外部随机中断,当运行了几个小时候,随机中断就不能执行了。但是单片机还能正常的执行延时待机循环非常奇诡的问题。单片机型号是所STC15F104E,程序中我也用了看门狗。
想不通为什么几个小时候中断就不能正常执行了,重启后一切又正常了。如果是干扰的话,单片机应该死机呀,为什么还能执行正常的待机循环程序。这里请请高手指点一下是什么问题,先感谢了。

程序如下所示:
  1. WDT_CONTR  DATA 0C1H            ;STC15F看门狗标志位
  2.       org 0000H
  3.       JMP Main            ;跳转到主程序MAIN
  4.       ORG 0003H        ;INT0的中断服务子程序向量地址为0003H
  5.       JMP Charging         
  6.    
  7. MAIN:   
  8.        ; MOV WDT_CONTR,#00111111B      
  9.        MOV SP,   #7FH                                 ;设定堆栈指针
  10.        SETB IT0                          
  11.        SETB EX0
  12.        SETB EA  
  13.       
  14. START:        
  15.        CLR P3.3
  16.        LCALL YS5S
  17.      ;  MOV WDT_CONTR,#00111111B  
  18.        LCALL YS5S
  19.       ; MOV WDT_CONTR,#00111111B  
  20.        LCALL YS5S
  21.      ;  MOV WDT_CONTR,#00111111B  
  22.        LCALL YS5S  
  23.      ;  MOV WDT_CONTR,#00111111B  
  24.        LCALL YS5S
  25.      ;  MOV WDT_CONTR,#00111111B  
  26.        LCALL YS5S
  27.     ;   MOV WDT_CONTR,#00111111B  
  28.        LCALL YS5S
  29.     ;   MOV WDT_CONTR,#00111111B  
  30.        SETB P3.3
  31.        LCALL YS5S
  32.     ;   MOV WDT_CONTR,#00111111B  
  33.         
  34. LOOP:
  35.        CLR  P3.3
  36.        LCALL YS5S
  37.      ; MOV WDT_CONTR,#00111111B  
  38.       LCALL YS5S
  39.      ; MOV WDT_CONTR,#00111111B  
  40.       LCALL YS5S
  41.      ;  MOV WDT_CONTR,#00111111B   
  42.      
  43.       SETB P3.3
  44.       LCALL YS5S
  45.     ; MOV WDT_CONTR,#00111111B  
  46.       LCALL YS5S
  47.     ; MOV WDT_CONTR,#00111111B  
  48.       LCALL YS5S
  49.     ; MOV WDT_CONTR,#00111111B  
  50.       LCALL YS5S
  51.     ; MOV WDT_CONTR,#00111111B  
  52.       LJMP  LOOP
  53.       
  54. Charging:
  55.      
  56.     PUSH ACC                  ;将累加器的值压入堆栈保存
  57.     PUSH PSW                  ;将PSW的值压入堆栈保存
  58.     SETB RS0                  ;设定工作寄存器组0
  59.     CLR  RS1  
  60.      
  61.     CLR P3.3
  62.     CLR P3.4
  63.     CLR P3.0
  64.     CLR P3.1
  65.     LCALL YS5S
  66.     SETB P3.4
  67.   ;  MOV WDT_CONTR,#00111111B  
  68.     LCALL YS5S
  69. ;  MOV WDT_CONTR,#00111111B  
  70.     LCALL YS5S  
  71.   ;  MOV WDT_CONTR,#00111111B   
  72.     LCALL YS5S
  73. ; MOV WDT_CONTR,#00111111B  
  74.     LCALL YS5S
  75. ; MOV WDT_CONTR,#00111111B  
  76.     LCALL YS5S  
  77.   ; MOV WDT_CONTR,#00111111B  
  78.    
  79.     SETB P3.3
  80.     SETB P3.0
  81.     SETB P3.1
  82.       
  83.     POP PSW                     ;从堆栈取回PSW的值
  84.     POP ACC                     ;从堆栈取回ACC的值
  85.     NOP
  86.     NOP
  87.     REti

  88. YS5S:
  89. MOV R7,#0FEH
  90. DL1:
  91.     MOV R6,#0E8H
  92. DL0:
  93.     MOV R5,#0FDH
  94.     DJNZ R5,$
  95.     DJNZ R6,DL0
  96.     DJNZ R7,DL1
  97.     MOV R5,#989H
  98.     DJNZ R5,$
  99.     NOP
  100.     NOP
  101.     RET
  102.     END
复制代码在程序中我没有使用看门狗.
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。