设计定时器中断程序,从P1.7引脚输出频率为10KHZ的方波,设外接频率为12MHZ
时间: 2024-05-04 14:21:10 浏览: 14
下面是一个简单的定时器中断程序,可以在P1.7引脚输出10KHZ的方波。代码中使用了定时器1和模式2,外部时钟频率为12MHZ。
```c
#include <reg52.h>
void timer1_isr(void) interrupt 3 {
static unsigned int cnt = 0;
P1 ^= 0x80; // P1.7取反
cnt++;
if (cnt == 600) {
cnt = 0;
}
}
void main() {
TMOD |= 0x10; // 定时器1, 模式2
TH1 = 0xFC; // 计数初值
TL1 = 0x66;
ET1 = 1; // 使能定时器1中断
EA = 1; // 使能总中断
TR1 = 1; // 启动定时器1
while(1);
}
```
解释一下代码:
- `TMOD |= 0x10` 设置定时器1为模式2,每次计数器从0到65535,需要12个时钟周期。
- `TH1 = 0xFC` 和 `TL1 = 0x66` 设置计数初值为65412,这样定时器每次从65412开始计数,经过12个时钟周期后就会溢出并触发中断。
- `ET1 = 1` 使能定时器1中断。
- `EA = 1` 使能总中断。
- `TR1 = 1` 启动定时器1。
- `while(1)` 进入死循环,等待定时器中断。
在定时器中断服务程序中,我们使用一个计数器 `cnt` 来计算方波的占空比。每次中断发生时, `cnt` 加1,当 `cnt` 等于600时,即表示输出了600个高电平和600个低电平,也就是一个周期,此时将 `cnt` 清零。
在中断服务程序中,我们还将 P1.7 取反,实现了每个周期一个方波的输出。注意到每个周期需要1200个时钟周期,所以输出频率为 12MHz / 1200 = 10KHZ。