8051汇编定时器定时异常求助:25%占空比波形不符预期
8051定时器波形生成问题排查
错误点指出
- 模式切换未停止定时器:从MODE0与MODE1互相切换时,未先执行
CLR TR0和CLR TR1停止定时器,直接写入新重载值并启动,会导致定时器计数状态混乱,引发波形异常。 - 重载值注释与代码不匹配:STIMER11段注释标注
TH1/TL1 = FD12,但实际代码是MOV TL1, #11H,手动输入错误可能导致占空比/频率计算偏差。 - 多定时器标志处理逻辑缺陷:MODE1的LOOPM1/LOOPM2循环中,若TF0和TF1同时置位,代码仅处理先检测到的定时器,未处理的标志会残留到下一轮循环,结合重载值切换逻辑,会导致波形时序错乱。
- 重复启动定时器:进入MODE0或MODE1时,未判断定时器是否已运行就重复执行
SETB TR0/SETB TR1,虽不直接报错,但会残留不确定的运行状态。
小建议
- 模式切换前统一执行
CLR TR0、CLR TR1、CLR TF0、CLR TF1,确保定时器完全重置后再初始化新参数。 - 将所有定时器重载值定义为符号常量(如
TIM0_MODE0_TL EQU 0FAH),避免手动输入错误,提升代码可读性与维护性。 - 单独测试MODE1下单个端口的波形,确认单个定时器的25%占空比逻辑正确后,再合并测试两个端口,缩小排查范围。
附上原汇编代码
ORG 0 SETUP: ;both timers set as mode 1 (16-bit counter) MOV TMOD, #11H MAIN: MOV C, P2.0 JC MODE1 MODE0: ; This part corresponds to switch = 0. F2 gets timer 1, F1 gets timer 0 ;initialize timer 0 MOV TL0, #0FAH MOV TH0, #0F7H SETB TR0 ;initialize timer 1 MOV TL1, #17H MOV TH1, #0FCH SETB TR1 LOOPM0: MOV C, P2.0 JC MODE1 JB TF0, TIMER0 JB TF1, TIMER1 SJMP LOOPM0 TIMER0: CPL P2.6 ;Reset timer 0 CLR TF0 MOV TL0, #0FAH MOV TH0, #0F7H SJMP LOOPM0 TIMER1: CPL P2.7 ;Reset timer 1 CLR TF1 MOV TL1, #17H MOV TH1, #0FCH SJMP LOOPM0 MODE1: CLR TF1 CLR TF0 ; This part corresponds to switch =1, F1 gets timer 1, F2 gets timer 0 ;Setup for OFF1, F2 ;TH0/TL0 = FA21 MOV TL0, #21H MOV TH0, #0FAH SETB TR0 ;Setup for OFF1, F1 ;TH1/TL1 = FD10 MOV TL1, #11H MOV TH1, #0FDH SETB TR1 LOOPM1: MOV C, P2.0 JNC MODE0 JB TF0, STIMER0 JB TF1, STIMER1 SJMP LOOPM1 STIMER0: CPL P2.7 CLR TF0 ;TH0/TL0 = FC17 MOV TL0, #17H MOV TH0, #0FCH SJMP LOOPM2 STIMER1: CPL P2.6 CLR TF1 ;TH1/TL1 = FE0B MOV TL1, #0BH MOV TH1, #0FEH SJMP LOOPM2 LOOPM2: MOV C, P2.0 JNC MODE0 JB TF0, STIMER00 JB TF1, STIMER11 SJMP LOOPM2 STIMER00: CPL P2.7 CLR TF0 ;TH0/TL0 = FA21 MOV TL0, #21H MOV TH0, #0FAH SJMP LOOPM1 STIMER11: CPL P2.6 CLR TF1 ;TH1/TL1 = FD12 MOV TL1, #11H MOV TH1, #0FDH SJMP LOOPM1 END
内容的提问来源于stack exchange,提问作者DevKara
相关产品推荐
相关产品推荐

