试用定时/计数器T1对外部事件计数 。要求每计数100, 就将T1改 成定时方式, 控制P1.7输出一个脉宽为10ms的正脉冲,然后又转为计数方式, 如此反复循环 。设晶振频率为12MHz
时间: 2024-05-13 08:17:36 浏览: 145
这道题需要使用定时器/计数器 T1 来计数外部事件,并在计数到 100 的倍数时,将 T1 改为定时模式,控制 P1.7 输出一个脉宽为 10ms 的正脉冲,然后又转为计数模式,如此反复循环。
以下是具体的实现步骤:
1. 设置 T1 的工作模式为 16 位计数模式,并设置 T1 的计数初值为 0。
```
TMOD |= 0x10; // 设置 T1 为 16 位计数模式
TH1 = 0; // 设置 T1 的计数初值为 0
TL1 = 0;
```
2. 启动 T1 计数器,并使能 T1 中断。
```
TR1 = 1; // 启动 T1 计数器
ET1 = 1; // 使能 T1 中断
```
3. 在 T1 的中断服务程序中,每次计数到 100 的倍数时,将 T1 改为定时模式,并控制 P1.7 输出一个脉宽为 10ms 的正脉冲,然后又将 T1 改为计数模式,如此反复循环。
```
void T1_ISR() interrupt 3
{
static int count = 0;
count++; // 计数器加 1
if (count % 100 == 0) // 每计数到 100 的倍数时执行以下操作
{
TR1 = 0; // 关闭 T1 计数器
// 设置 T1 工作模式为定时模式,产生 10ms 的定时器中断
TMOD &= 0x0F; // 将 T1 工作模式设置为定时模式
TH1 = 0xC2; // 设置 T1 的重载值为 65536 - 12000 / 12 = 0xC2C0,产生 10ms 的定时器中断
TL1 = 0xC0;
TR1 = 1; // 启动 T1 定时器
P1_7 = 1; // P1.7 输出高电平
}
if (count == 200) // 计数到 200 时复位计数器
{
count = 0;
}
}
```
完整代码如下:
阅读全文