基于stc89c51单片机的温控风扇:打造智能调温小能手
基于stc89c51单片机的温控风扇(程序代码+原理图)自动模式下,通过读取ds18b20的温度,并且通过红外人体感应,判断是否有人,如果有人就智能自动设置风扇的pwm输出,达到智能调温的作用,如果感应到没人,自动关闭风扇,然后将当前温度显示在四位数码管上面最近玩了个挺有意思的项目——基于stc89c51单片机的温控风扇,今天就来和大家分享分享。这个小风扇可不一般,它能自动调节温度,还能根据是否有
基于stc89c51单片机的温控风扇(程序代码+原理图) 自动模式下,通过读取ds18b20的温度,并且通过红外人体感应,判断是否有人,如果有人就智能自动设置风扇的pwm输出,达到智能调温的作用,如果感应到没人,自动关闭风扇,然后将当前温度显示在四位数码管上面

最近玩了个挺有意思的项目——基于stc89c51单片机的温控风扇,今天就来和大家分享分享。这个小风扇可不一般,它能自动调节温度,还能根据是否有人来决定工作状态,超智能!
一、整体原理
咱先来说说整体思路,在自动模式下,得靠DS18B20温度传感器读取环境温度,同时利用红外人体感应模块判断周围是否有人。要是有人,就根据读取到的温度智能设置风扇的PWM输出,从而调节温度。要是没人,风扇就自动关闭,节省能源。最后,把当前温度显示在四位数码管上,让咱能直观看到温度情况。
二、原理图
下面简单讲讲原理图。
- 单片机部分:核心就是STC89C51单片机啦,它负责协调各个模块工作,接收传感器数据,处理后控制风扇和数码管显示。
- DS18B20温度传感器:通过单线与单片机连接,向单片机传输温度数据。它的优点是精度高,使用方便。
- 红外人体感应模块:一般有三个引脚,分别是VCC、GND和信号输出引脚。当检测到有人时,信号输出引脚会输出高电平,单片机通过检测这个引脚电平状态来判断是否有人。
- 风扇控制部分:利用PWM控制风扇转速。通过单片机的一个IO口输出不同占空比的PWM信号,连接到风扇驱动电路,从而控制风扇转速。
- 四位数码管显示:数码管一般采用共阴极或共阳极,通过单片机的IO口控制段选和位选,显示温度数值。
三、程序代码及分析
#include <reg51.h>
#include <intrins.h>
// 定义DS18B20端口
sbit DQ = P1^0;
// 定义红外人体感应端口
sbit IR = P1^1;
// 定义数码管段选端口
#define SEG P0
// 定义数码管位选端口
sbit DIG1 = P2^0;
sbit DIG2 = P2^1;
sbit DIG3 = P2^2;
sbit DIG4 = P2^3;
// 数码管段码表
unsigned char code SEG_TABLE[] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F};
// 温度存储变量
unsigned int temperature;
// PWM占空比变量
unsigned char pwm_duty;
// DS18B20初始化函数
void ds18b20_init() {
unsigned char i;
DQ = 1;
_nop_();
_nop_();
DQ = 0;
// 拉低总线480us以上
for(i = 0; i < 70; i++);
DQ = 1;
// 等待DS18B20响应
for(i = 0; i < 5; i++);
while(DQ);
for(i = 0; i < 70; i++);
}
// 从DS18B20读取一个字节
unsigned char ds18b20_read_byte() {
unsigned char i, byte = 0;
for(i = 0; i < 8; i++) {
DQ = 0;
byte >>= 1;
DQ = 1;
if(DQ) byte |= 0x80;
// 等待60us以上
for(i = 0; i < 10; i++);
}
return byte;
}
// 向DS18B20写入一个字节
void ds18b20_write_byte(unsigned char byte) {
unsigned char i;
for(i = 0; i < 8; i++) {
DQ = 0;
DQ = byte & 0x01;
// 保持60us以上
for(i = 0; i < 10; i++);
DQ = 1;
byte >>= 1;
}
}
// 读取DS18B20温度
void read_temperature() {
ds18b20_init();
ds18b20_write_byte(0xCC);
ds18b20_write_byte(0x44);
ds18b20_init();
ds18b20_write_byte(0xCC);
ds18b20_write_byte(0xBE);
temperature = ds18b20_read_byte();
temperature |= (ds18b20_read_byte() << 8);
// 转换为实际温度值,这里省略小数部分
temperature = temperature * 0.0625;
}
// 数码管显示函数
void display_temperature() {
unsigned char temp1, temp2, temp3, temp4;
temp1 = temperature / 1000;
temp2 = (temperature % 1000) / 100;
temp3 = (temperature % 100) / 10;
temp4 = temperature % 10;
SEG = SEG_TABLE[temp1];
DIG1 = 0;
_nop_();
_nop_();
DIG1 = 1;
SEG = SEG_TABLE[temp2];
DIG2 = 0;
_nop_();
_nop_();
DIG2 = 1;
SEG = SEG_TABLE[temp3];
DIG3 = 0;
_nop_();
_nop_();
DIG3 = 1;
SEG = SEG_TABLE[temp4];
DIG4 = 0;
_nop_();
_nop_();
DIG4 = 1;
}
// PWM控制函数
void pwm_control() {
if(IR) {
if(temperature < 25) {
pwm_duty = 20;
} else if(temperature < 30) {
pwm_duty = 50;
} else {
pwm_duty = 80;
}
} else {
pwm_duty = 0;
}
}
void main() {
while(1) {
read_temperature();
pwm_control();
display_temperature();
}
}
- 初始化部分:
ds18b20_init函数用来初始化DS18B20温度传感器,通过拉低总线一定时间,然后释放等待传感器响应。这里面的延时控制很关键,得保证符合DS18B20的时序要求。 - 数据读写函数:
ds18b20readbyte和ds18b20writebyte分别用于从DS18B20读取一个字节和向它写入一个字节。在读写过程中,严格按照时序,通过控制DQ引脚的电平变化来传输数据。 - 温度读取函数:
read_temperature函数先初始化DS18B20,然后发送指令让它开始转换温度,再读取转换后的温度数据,并进行简单的转换得到实际温度值。 - 数码管显示函数:
display_temperature把温度值拆分成个位、十位、百位、千位,然后通过控制数码管的段选和位选,依次显示各个数位。 - PWM控制函数:
pwm_control根据红外人体感应模块的状态和温度值来设置PWM占空比。如果有人,温度低时占空比小,温度高时占空比大;没人时占空比直接设为0,关闭风扇。 - 主函数:在
main函数里,通过一个无限循环不断读取温度、控制PWM和显示温度,实现整个系统的持续运行。
通过这样的硬件和软件配合,就能打造出一个超智能的温控风扇啦,是不是还挺有趣的!大家不妨也动手试试。

基于stc89c51单片机的温控风扇(程序代码+原理图) 自动模式下,通过读取ds18b20的温度,并且通过红外人体感应,判断是否有人,如果有人就智能自动设置风扇的pwm输出,达到智能调温的作用,如果感应到没人,自动关闭风扇,然后将当前温度显示在四位数码管上面
更多推荐



所有评论(0)