求助stc15系列定时器中断问题

2019-07-15 10:36发布

这是一个时钟中断程序,利用定时器0,实现多个时钟计时功能,时钟值放在R3至R6,R3是记分钟,其他都是计秒
者4个软计时器要在主程序中多次调用,在等待模式运行情况良好,可是平行运行是很不稳定,各种运行异常。下面是代码,请高手帮忙看看。
端口说明:
P2.7=红外线人体感应器biss0001
P2.0~P2.4BY-8001语音模块
ORG 00000H
AJMP START
ORG 000BH
AJMP tiME0
ORG 30H
AUXR         DATA         8EH
P0M1         EQU         093H
P0M0         EQU         094H
P4                 EQU         0C0H
P4M1         EQU         0B3H
P4M0         EQU         0B4H
P5                 EQU         0C8H
P5M1         EQU         0C9H
P5M0         EQU         0CAH
T0MS        EQU                30H                ;毫秒计数器0
T1MS        EQU                31H                ;毫秒计数器1
TMI                EQU                32H                ;分秒计数器
MAT                EQU                4FH                ;总任务限时
TCST        BIT                05H                ;探测状态标志
START:
MOV AUXR,#7FH
MOV SP,#80H
MOV TMOD,#0F0H                        ;设置定时计数器为工作模式0,可重载16位计数器
MOV TH0, #3CH
MOV TL0,#0B0H                                ;定时器0 预置15536,一个计数周期50000uS=50mS.
CLR TF0
SETB EA                                                ;中断总开关
SETB ET0                                        ;定时器0中断开关
SETB TR0                                        ;定时器0开始计时
MOV T0MS,#00H                                
MOV T1MS,#00H
MOV TMI,#0
MOV 41H,#00H                                
MOV R2,#00H                                        ;
MOV R3,#00H                                        ;分计数器R3
MOV R4,#00H                                        ;秒计数器R4
MOV R5,#00H                                         ;秒计数器R5                                
MOV R6,#00H                                        ;秒计数器R6
MOV R7,#00H                                        ;SecondNum3
JNB P3.4,STRSP                                ;push strat
AJMP START
STRSP:                        
        
LP2:JNB P2.7,OC                                                               
        CJNE R4,#10,LP2                      ;如果持续10秒没有0信号代表没有人
                CLR TCST                              ;设置探测标志位0代表没人
                SETB P2.2                          ;播放语言来监视端口读取及计时器运行状态
                MOV R4,#0
                MOV R6,#0
                LP:CJNE R6,#1,LP              
                CLR P2.2
        AJMP LOP        
        OC:                                                      ;如果10秒内有0输入代表有人
                SETB TCST                                    ;设置探测标志为1代表有人
                SETB P2.0                                      ;播放语言来监视端口读取及计时器运行状态
                MOV R6,#0
                LP1:CJNE R6,#1,LP1
                CLR P2.0
LOP:
MOV R6,#0
                LP3:CJNE R6,#1,LP3
                NOP
AJMP STRSP
AJMP START

;*****************************************************************************************************
;************************定时中断程序*********************************************************
TIME0:                                          ;
PUSH ACC
PUSH PSW
INC T0MS                                                ;毫秒计数器0+1
INC T1MS                                                ;毫秒计数器1+1
MOV A,T0MS                                                ;
CJNE A,#20,SCD1                                ;20*50ms=1S 整秒检测,不到1s回到主程序
MOV A,TMI
INC A
MOV TMI,A                                                ;分秒计数器+1
INC R4                                                         ;秒计数器R3+1
INC R5                                                         ;秒计数器R5+1
INC R6                                                        ;秒计数器R6+1
MOV T0MS,#0                                                 ;毫秒计数器0清零
CJNE A,#60,SCD4                                         ;60秒=1分钟检测        
INC R3                                                         ;分计数器+1
SCD4:CJNE R4,#200,SCD3
MOV R4,#0                                                ;秒计数器R4清零                                         
SCD3:CJNE R5,#200,SCD2
MOV R5,#0                                                ;秒计数器R5清零
SCD2:CJNE R6,#200,SCD1
MOV R6,#0                                                ;秒计数器R6清零
SCD1:
MOV A,T1MS
CJNE A,#255,NEX
MOV T1MS,#0
NEX:
MOV TH0, #3CH
MOV TL0,#0AFH                                        ;定时器0 预置15535,一个计数周期50000uS=50mS.
POP PSW
POP ACC
RETI
END


运行在俩个回合(至五个回合不等)之后单片机没有响应
问题出在哪里?
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
16条回答
wangrui2000_wr
2019-07-15 14:50
谢谢您的耐心帮助,是这样的,这个只是整体程序中的一小部分,其他的没问题,我只把故障模块单独拿出来测试的,初始化部分不用的寄存器没删。
播放语音模块应该是没问的,而且在刚开始两个循环里都有声音的,在其他程序里播放都是正常的。
好像是程序混乱了,因为每次测试的结果都不一样,有时候能正常运行五六个循环,有时候就两三个,之后就没任何响声了,多久都不响,在按下p3.4按钮后有时又能想两声又没反应了,而且有时候探测器的状态不稳定,是不是探测器的问题,在探测器前面没人的情况下,会出现p2.2和p2.0连续交替响起的情况,真的快疯掉了

一周热门 更多>