51单片机对PWM风扇进行两档风速调节并却不使用外部中断计算PWM风扇转速的C语言代码
时间: 2024-01-11 17:04:23 浏览: 119
以下是一个使用51单片机对PWM风扇进行两档风速调节并且不使用外部中断计算PWM风扇转速的C语言代码:
```c
#include <reg52.h>
#define FAN_PIN P1_1 // PWM风扇引脚
#define SWITCH_PIN P1_0 // 切换风速引脚
// 定义定时器1的初值和重装值,用于产生PWM信号
#define T1_INIT_VALUE 0xFF
#define T1_RELOAD_VALUE 0xFF
// 定义定时器0的初值和重装值,用于计算PWM风扇转速
#define T0_INIT_VALUE 0x00
#define T0_RELOAD_VALUE 0xFF
// 定义计算PWM风扇转速需要用到的变量
unsigned int pulse_count = 0; // PWM信号脉冲计数器
unsigned int fan_speed = 0; // PWM风扇转速
void main() {
// 初始化定时器1为工作模式2(自动重载模式),产生PWM信号
TMOD &= 0x0F;
TMOD |= 0x20;
// 设置定时器1的重载值
TH1 = T1_INIT_VALUE;
TL1 = T1_INIT_VALUE;
// 启动定时器1
TR1 = 1;
// 初始化定时器0为工作模式1(16位定时器模式),用于计算PWM风扇转速
TMOD &= 0xF0;
TMOD |= 0x01;
// 设置定时器0的重载值
TH0 = T0_INIT_VALUE;
TL0 = T0_INIT_VALUE;
// 启动定时器0
TR0 = 1;
// 设置外部中断0为下降沿触发,用于切换PWM风扇的风速
IT0 = 1;
EX0 = 1;
EA = 1;
// 初始化PWM风扇引脚为低电平输出
FAN_PIN = 0;
while (1) {
// 计算PWM风扇转速
fan_speed = 65536 * pulse_count / (T0_RELOAD_VALUE + 1);
// 判断当前PWM风扇的风速档位,并设置PWM信号的占空比
if (SWITCH_PIN == 0) {
// 风速档位1,占空比为25%
TH1 = T1_RELOAD_VALUE;
TL1 = T1_RELOAD_VALUE / 4;
} else {
// 风速档位2,占空比为50%
TH1 = T1_RELOAD_VALUE;
TL1 = T1_RELOAD_VALUE / 2;
}
// 等待一段时间,让PWM信号稳定输出
for (int i = 0; i < 100; i++) {
for (int j = 0; j < 100; j++) {
// 空转
}
}
// 开启PWM风扇
FAN_PIN = 1;
// 等待一段时间,让PWM信号稳定输出
for (int i = 0; i < 100; i++) {
for (int j = 0; j < 100; j++) {
// 空转
}
}
// 关闭PWM风扇
FAN_PIN = 0;
// 等待一段时间,让PWM信号稳定输出
for (int i = 0; i < 100; i++) {
for (int j = 0; j < 100; j++) {
// 空转
}
}
}
}
// 外部中断0的中断服务函数,用于切换PWM风扇的风速
void switch_speed() {
SWITCH_PIN = ~SWITCH_PIN;
}
// 定时器0的中断服务函数,用于计算PWM风扇转速
void timer0_isr() interrupt 1 {
pulse_count++;
}
```
这个代码使用定时器1产生PWM信号,定时器0计算PWM风扇转速,并且使用外部中断0来切换PWM风扇的风速。在主循环中,根据当前风速档位设置PWM信号的占空比,并且开启和关闭PWM风扇。注意,在开启和关闭PWM风扇之间需要等待一段时间,让PWM信号稳定输出。
阅读全文
相关推荐
















