求助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
1楼-- · 2019-07-16 11:41
STRSP:                       
       
LP2:JB P0.0,OC                                                               
                CLR TCST
                SETB P2.2
                MOV R6,#0
                LP:CJNE R6,#1,LP
                CLR P2.2
        AJMP LOP       
        OC:
                SETB TCST
                SETB P2.3
                MOV R6,#0
                LP1:CJNE R6,#1,LP1
                CLR P2.3
LOP:
MOV R6,#0
                LP3:CJNE R6,#3,LP3
                NOP
AJMP STRSP
我简化了程序,把感应器换成普通开关,出现新情况
输入1时循环正常,
隔一秒播放一次P2.3
输入0就程序错乱,出现 P2.2和P2.3快速交替循环播放
wangrui2000_wr
2楼-- · 2019-07-16 16:08
STRSP:                       
       
LP2:JB P0.0,OC                                                               
                CLR TCST
                SETB P2.2
                MOV R6,#0
                LP:CJNE R6,#1,LP
                CLR P2.2
        AJMP LOP       
        OC:
                SETB TCST
                SETB P2.3
                MOV R6,#0
                LP1:CJNE R6,#1,LP1
                CLR P2.3
LOP:
MOV R6,#0
                LP3:CJNE R6,#3,LP3
                NOP
AJMP STRSP
我简化了程序,把感应器换成普通开关,出现新情况
输入1时循环正常,
隔一秒播放一次P2.3
输入0就程序错乱,出现 P2.2和P2.3快速交替循环播放
wangrui2000_wr
3楼-- · 2019-07-16 17:28
 精彩回答 2  元偷偷看……
wangrui2000_wr
4楼-- · 2019-07-16 19:24
问题出现在重新读入信号时,
不管先输入1还是0,信号没变之前正常,只要信号发生变化就会出现交替播放
人中狼
5楼-- · 2019-07-16 20:41
看程序不象会有这种现象,p0.0有没有接上拉电阻,交替播放时有没有一个3秒的空闲。

评分

参与人数 1积分 +4 收起 理由 wangrui2000_wr + 4 虽然问题没解决,但是很感谢,希望有空的话.

查看全部评分

wangrui2000_wr
6楼-- · 2019-07-16 22:13
p0.0是弱上拉准双向位,没有上拉,交替没有3秒

一周热门 更多>