(第7章)利用定时器/计数器TO 从 P1.7 口输出脉宽 5ms 的正脉冲信号,采用6MHz的晶振,试设计程序。(选择定时工作方式,配置 TMOD,计算计数初值,编写程序,分别采用查询方式和中断方式来做 用汇编语言写出来
时间: 2024-12-17 19:31:03 浏览: 15
在使用8051单片机的定时器/计数器(Timer/Counter, TO)通过P1.7口输出5ms正脉冲信号时,我们需要设置定时器的工作模式、TMOD寄存器、计算适当的计数初值,并根据查询方式和中断方式编写程序。
**1. 定时工作方式选择:**
对于5ms脉宽,我们可以选择定时器T0工作于模式2(13位计数)。因为模式2下,计数从0xFF开始,减至0x00时溢出,大约需要14个机器周期完成,而我们设定为13个周期可以确保计数一次即结束。
**2. 配置TMOD寄存器:**
在TMOD寄存器中,设高4位为0B0010(对应模式2),低4位用于选择工作方式。例如,若T0为工作方式2,则TMOD = 0x02。
**3. 计数初值计算:**
6MHz晶振频率下,一个机器周期为1μs。为了得到5ms的脉宽,我们需要计数1000次(因为1ms有1000个机器周期)。因此,计数初值为0x3FF(1023 - 1,因为溢出前会加1)。
**4. 查询方式编程示例(假设XTAL=12MHz,因为实际应用中可能需要调整):**
```assembly
MOV TMOD, #0x02 ; 设置工作模式2
MOV TH0, #0x3FF ; 设置计数值
MOV TL0, #0x3FF ; 同上
main_loop:
SETB TR0 ; 启动定时器T0
LOOP WaitForOverflow:
JNB TF0, $ ; 循环等待溢出标志TF0
CLR TF0 ; 清除溢出标志
SETB P1.7 ; 输出正脉冲
DJNZ main_loop, $ ; 如果未溢出,继续循环
```
**5. 中断方式编程示例:**
```assembly
;...其他初始化代码...
SETB EA ; 开启全局中断
MOV IE, #0x01 ; 设置中断允许位,仅启用定时器T0中断(TI)
main_loop:
MOV TMOD, #0x02 ; ...设置TMOD...
MOV TH0, #0x3FF ; ...设置计数值...
MOV TL0, #0x3FF ; ...
LJMP main_loop ; 进入主循环
TimerInterrupt:
P1.7 = !P1.7 ; 输出正脉冲
SETB TF0 ; 更新溢出标志
IRET ; 返回中断服务程序
```
**
阅读全文