C51代码编写试用定时/计数器T1对外部事件计数。要求每计数100,就将T1改成定时方式,控制P1.7输出 一个脉宽为10ms的正脉冲,然后又转为计数方式,如此反复循环。设晶振频率为12MHz。
时间: 2023-07-15 19:13:54 浏览: 90
根据题目要求,我们可以使用定时/计数器T1对外部事件进行计数,当计数器达到100时,将T1切换为定时模式,控制P1.7输出一个脉宽为10ms的正脉冲,然后再将T1切换为计数模式,如此循环。
程序代码如下:
```
#include <reg52.h>
#define FREQ_OSC 12000000UL // 晶振频率
sbit LED = P1^7; // 定义P1.7为LED
void timer1_init(void)
{
TMOD |= 0x10; // 设置T1为16位定时/计数模式
TH1 = 0x3C; // 设置T1初值为0x3C
TL1 = 0xAF; // 设置T1初值为0xAF
TR1 = 1; // 启动T1
}
void main(void)
{
unsigned int cnt = 0; // 外部事件计数器
timer1_init(); // 初始化定时/计数器T1
while (1) {
if (TF1) { // 如果T1溢出
TF1 = 0; // 清除T1溢出标志位
cnt++; // 外部事件计数器加1
if (cnt >= 100) { // 如果计数器达到100
cnt = 0; // 重置计数器
TR1 = 0; // 关闭T1
TH1 = 0xF8; // 设置T1初值为0xF8
TL1 = 0x30; // 设置T1初值为0x30,定时10ms
LED = 1; // 输出正脉冲
TR1 = 1; // 启动T1
}
}
}
}
```
程序中使用了定时/计数器T1对外部事件进行计数,并在计数器达到100时,将T1切换为定时模式,控制P1.7输出一个脉宽为10ms的正脉冲,然后再将T1切换为计数模式,如此循环。