You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 01:55:23