我试图在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
仅在程序开始时初始化计时器。溢出后,必须重新初始化,因为它又从值
0x0000
开始计数。
您必须尽快设置TLx
,否则您可能会失去一次计数。
如果使用指令 JBC
而不是 JB
,则可以缩短程序。
因为它看起来像学校作业,所以我不会编写正确的代码。