如何使用Assembly在8051中创建2个占空比为50%的方波

问题描述 投票:0回答:1

我试图在Proteus仿真环境中通过8051的p2.6和p2.7端口创建两个230和460Hz的方波。它还将通过 p2.0 的开关输入来改变其行为。当开关处于低电平时,行为不会改变。切换后,频率互换且占空比降至 25%。我在第一部分中遇到了麻烦,其中 switch 为 0。尽管我的计算对于时间延迟和 TH/TL 值是正确的,但波形甚至没有接近预期的模拟。另外,代码应该严格是汇编代码,因此不允许使用 C。

我尝试重新计算但没有成功。我只用一个计数器尝试了我的方法,它确实有效,所以它与计时器触发有关。在下面的代码中,我检查计时器标志,当计时器到达终点时,我对 50% 占空比的输出进行补充。当我介绍第二个时,波形发生了变化,预期的4微秒周期在Proteus数字示波器中变成了几百毫秒。

这是我的代码片段:

ORG 0

    SETUP:
        ;both timers set as mode 1 (16-bit counter)
        MOV TMOD, #11H
    
    MAIN:
        MOV C, P2.0 ;switch signal moved to carry bit
        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
        CLR TF0
        SJMP LOOPM0
    
    TIMER1:
        CPL P2.7
        CLR TF1
        SJMP LOOPM0
    
    MODE1:
        ; This part corresponds to switch =1, F1 gets timer 1, F2 gets timer 0
        ; To be implemented
    

    END
    


here是我的proteus设置:

assembly microprocessors 8051 proteus
1个回答
0
投票

仅在程序开始时初始化计时器。溢出后,必须重新初始化,因为它又从值

0x0000
开始计数。 您必须尽快设置
TLx
,否则您可能会失去一次计数。 如果使用指令
JBC
而不是
JB
,则可以缩短程序。

因为它看起来像学校作业,所以我不会编写正确的代码。

© www.soinside.com 2019 - 2024. All rights reserved.