利同定时/计数器T0 从P10输出周期为1s、脉重为20m 的正脉冲信号,晶提频 2*C1单片机的片内、片外程序存储器如何选择7(5分) 率为12M。试设计程序
时间: 2024-09-21 07:08:20 浏览: 43
使用单片机的定时/计数器T0产生周期为1秒、脉宽为20毫秒的正脉冲信号,通常需要设置定时器的工作模式为模式1,因为这样可以方便地控制输出宽度。这里以常见的8051系列单片机如AT89S52为例,它有13个机器周期的定时器初值计算方法。
首先,我们确定定时器的溢出周期。对于12MHz的晶振频率,1秒等于12000000 * 1000 / 1000000 = 120机器周期。为了得到20ms的脉宽,我们需要溢出次数为120 - 20 = 100次。
在模式1下,T0由两个8位计数器组成,我们可以先将最高位清零,然后用最低4位计数到100。这样每个机器周期计数值增加1,当达到100时,溢出标志TF会被置位。
以下是基本的程序设计步骤:
1. 定义寄存器TMOD和TH0/LB0(T0高/低字节):
```
TMOD = 0x01; // 设置定时器工作模式为模式1
TH0 = 0x64; // 计数初始值,100 = (0x64 << 4) + 0x00
LB0 = 0x00;
```
2. 开启中断并启动定时器T0:
```
EA = 1; // 启用全局中断
ES = 1; // 设置工作寄存器组为外部数据存储区
ET0 = 1; // 开启T0中断
TR0 = 1; // 启动定时器T0
```
3. 主循环中检查TF是否溢出并处理输出脉冲:
```
while(1){
if(TF0 == 1){ // 检测到溢出
TF0 = 0; // 清除溢出标志
P10 = !P10; // 输出反相,20ms高电平,20ms低电平
}
}
```
注意:实际编程时,应考虑到CPU的忙等待时间和其他干扰因素,可能需要适当调整计数初值以确保准确的脉宽。此外,这只是一个基础示例,实际应用中可能还需要配合中断处理机制和延时函数。