你的位置:大电流电感 > 基础知识

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

2022-10-24 06:47:29      点击:
上一篇:Vishay在SIAT 2017上展出全线车用产品这是一个时钟中断程序,利用定时器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


运行在俩个回合(至五个回合不等)之后单片机没有响应
问题出在哪里?


P0.0最好接一个上拉,看这段程序不像会有交替循环播放的问题,即使出现,应该有一个3秒的停顿,看现象应该是跑飞了,不知道还有没有其他部分的程序会播放,有的话,查查那部分。也可以用KEIL做软件仿真,人工设置端口状态,跟踪程序看看跑到哪了,也只能帮你这么多了

最佳答案
你的程序应该好好整理一下,思路也整理一下,其中R3,R5,T1MS,TMI做了计算,但没有用到,EA最好是在所有初始化都结束后再开启。 MOV R4,#0,MOV R6,#0重新开始计时时,最好把定时器也初始化一下。
另外所谓的单片机不响应的状态也要明确一下,是什么反应都没有,还是维持一个状态不变,播放语言是否能正确运行,播放语言的时间建议设在2、3秒以上做测试用。不响应的状态如果在约300秒后会不会恢复正常


谢谢您的耐心帮助,是这样的,这个只是整体程序中的一小部分,其他的没问题,我只把故障模块单独拿出来测试的,初始化部分不用的寄存器没删。
播放语音模块应该是没问的,而且在刚开始两个循环里都有声音的,在其他程序里播放都是正常的。
好像是程序混乱了,因为每次测试的结果都不一样,有时候能正常运行五六个循环,有时候就两三个,之后就没任何响声了,多久都不响,在按下p3.4按钮后有时又能想两声又没反应了,而且有时候探测器的状态不稳定,是不是探测器的问题,在探测器前面没人的情况下,会出现p2.2和p2.0连续交替响起的情况,真的快疯掉了


以前从来没用到过人体探测器,经过测试好像这个探测器输出的不是一个连续的电平0或者1,所以我的思路是,在一段时间内捕获0信号,程序中设定的是10秒,在10秒内没有0输出就判定没有人。


这是等等模式,就是什么都不做,等着时间到了再继续执行下面的程序
MOV R4,#0
PW:CJNE R4,#10,PW      R4等待模式               
                CLR TCST                          
                SETB P2.2                          
                MOV R6,#0
                LP:CJNE R6,#1,LP        R6等等模式      
                CLR P2.2
        AJMP LOP  
这种模式运行非常稳定,可是程序整体效率太低了

下面是平行运行模式,就是所有程序运行的过程中每个循环检测时间状态,到时间就执行响应的指令,没到时间就继续其他指令,和中断的原理差不多,就算是软中断吧
MOV R4,#0
START
CJNE R4,#10,LP2                      ;R4平行检测模式,到10秒执行下面的没到时间执行LP2
                CLR TCST                             
                SETB P2.2                          
                MOV R4,#0
                MOV R6,#0
                LP:CJNE R6,#1,LP              
                CLR P2.2
        AJMP LOP  
LP2:
……
……
AJMP START
可是这种模式好难实现,各种pug各种飞


你可以先接一个带上拉电阻的开关来代替人体探测器,人工的选择是否检测到有人,这样调试其他部分的时候,人体探测器这个因素就比较稳定。程序上看,大体看没什么问题,这种平行的操作也应该可以,个人认为在进行重新计时的时候,最好把定时器也初始化,这样虽然不一定有问题,但是可以避免在定时器计时到3、5百毫秒时重新计时,导致定时可能不足一秒


定时器初始化,会影响其他秒计数寄存器的,谢谢


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快速交替循环播放


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快速交替循环播放


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快速交替循环播放


和板子一起的还有两个遥控模块,会不会是有干扰,不应该呀,我又没按遥控


问题出现在重新读入信号时,
不管先输入1还是0,信号没变之前正常,只要信号发生变化就会出现交替播放


看程序不象会有这种现象,p0.0有没有接上拉电阻,交替播放时有没有一个3秒的空闲。


p0.0是弱上拉准双向位,没有上拉,交替没有3秒


非常感谢


人中狼 发表于 2017-6-2 10:24
P0.0最好接一个上拉,看这段程序不像会有交替循环播放的问题,即使出现,应该有一个3秒的停顿,看现象应该是跑飞了,不知道还有没有其他部分的程序会播放,有的话,查查那部分。也可以用KEIL做软件仿真,人工设置端口状态,跟踪程序看看跑到哪了,也只能帮你这么多了 ...

帮顶一下楼主加油


支持一下 楼主加油