51单片机晶振12MHz,编程实现: (1)T0工作在定时器模式的模式1,控制P2.0产生400Hz方波;(2)T1工作在定时器模式的模式2,控制P2.1产生200Hz、占空比20%的矩形波。
时间: 2024-02-29 19:53:08 浏览: 29
以下是基于51单片机晶振12MHz的代码实现:
```c
#include <reg51.h>
// 定义计数器初值
#define TIMER0_INIT 65536 - 30000 // 12MHz / 2 / 400Hz = 15000
#define TIMER1_INIT 65536 - 7500 // 12MHz / 2 / 200Hz / 5 = 7500
// 定时器0中断服务函数
void timer0_isr() interrupt 1 {
P2 ^= 0x01; // P2.0 取反
TH0 = TIMER0_INIT / 256; // 重新装载计数器初值
TL0 = TIMER0_INIT % 256;
}
// 定时器1中断服务函数
void timer1_isr() interrupt 3 {
static unsigned char count = 0;
count++;
if (count <= 1) {
P2 |= 0x02; // P2.1 输出高电平
} else if (count <= 4) {
P2 &= ~0x02; // P2.1 输出低电平
} else {
count = 0; // 计数器清零
}
TH1 = TIMER1_INIT / 256; // 重新装载计数器初值
TL1 = TIMER1_INIT % 256;
}
void main() {
TMOD = 0x11; // T0 和 T1 工作在不同的模式
TH0 = TIMER0_INIT / 256; // 初始化 T0 计数器初值
TL0 = TIMER0_INIT % 256;
TH1 = TIMER1_INIT / 256; // 初始化 T1 计数器初值
TL1 = TIMER1_INIT % 256;
ET0 = 1; // 开启 T0 中断
ET1 = 1; // 开启 T1 中断
EA = 1; // 开启总中断
TR0 = 1; // 启动 T0 计数器
TR1 = 1; // 启动 T1 计数器
while (1); // 主程序空循环
}
```
代码实现了:
1. T0工作在定时器模式的模式1,控制P2.0产生400Hz方波;
2. T1工作在定时器模式的模式2,控制P2.1产生200Hz、占空比20%的矩形波。