gary2009 发表于 2011-9-28 21:45:30

关于STC15F104E单片机中断的问题请教大家

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

程序很简单如下所示:
WDT_CONTRDATA 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:
       CLRP3.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
      LJMPLOOP
   
Charging:
   
    PUSH ACC                  ;将累加器的值压入堆栈保存
    PUSH PSW                  ;将PSW的值压入堆栈保存
    SETB RS0                  ;设定工作寄存器组0
    CLRRS1
   
    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

程序中我我没有使用看门狗

shqila 发表于 2011-9-28 21:47:17

据STC的人说,STC15F104E的中断有问题,已经在改版中了....

gary2009 发表于 2011-9-28 21:56:29

看来这型号的单片机还真不能用了

BXAK 发表于 2011-9-28 21:57:08

STC15系列(A版)的外部中断有问题,其它中断可正常使用。

如果实在需要外部中断,可以用定时器0/1的外部计数溢出中断代替。

至于B版,仍在浮云中……

master5888 发表于 2011-9-28 22:28:28

15F系列B版难产快1年了。老妖供货不稳定也不是一时半会了,搬家怕是个失误

xpxp 发表于 2011-9-29 00:23:48

看来楼主搞开发都不用看技术手册了。

gary2009 发表于 2011-9-29 15:23:55

回复【5楼】xpxp
-----------------------------------------------------------------------

说实话,老妖的手册看得我也头大

madara 发表于 2011-9-29 15:56:05

这个程序,没有用到计数器,如果STC片有电路设计方面问题,不应该在运行几小时后才出现,可以考虑是不是硬件热稳定性不好或者其它什么原因导致的IT0、EX0被清0了。在程序的主循环中加两个IT0与EX0置1的操作看看还这样不。

pcbboy 发表于 2011-11-15 16:16:42

stc12c5204ad 开始中断可以,测试几天后外中断不行了,外中断p3.2 I/O口还是好的,有人遇到过没有?

stevem 发表于 2011-11-16 10:47:13

遇到了,解决方法同3楼所示

t3486784401 发表于 2011-11-16 18:38:38

已经放弃 15F104E 了,各种不稳定
页: [1]
查看完整版本: 关于STC15F104E单片机中断的问题请教大家