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

最近玩了个挺有意思的项目——基于stc89c51单片机的温控风扇,今天就来和大家分享分享。这个小风扇可不一般,它能自动调节温度,还能根据是否有人来决定工作状态,超智能!

一、整体原理

咱先来说说整体思路,在自动模式下,得靠DS18B20温度传感器读取环境温度,同时利用红外人体感应模块判断周围是否有人。要是有人,就根据读取到的温度智能设置风扇的PWM输出,从而调节温度。要是没人,风扇就自动关闭,节省能源。最后,把当前温度显示在四位数码管上,让咱能直观看到温度情况。

二、原理图

下面简单讲讲原理图。

  1. 单片机部分:核心就是STC89C51单片机啦,它负责协调各个模块工作,接收传感器数据,处理后控制风扇和数码管显示。
  2. DS18B20温度传感器:通过单线与单片机连接,向单片机传输温度数据。它的优点是精度高,使用方便。
  3. 红外人体感应模块:一般有三个引脚,分别是VCC、GND和信号输出引脚。当检测到有人时,信号输出引脚会输出高电平,单片机通过检测这个引脚电平状态来判断是否有人。
  4. 风扇控制部分:利用PWM控制风扇转速。通过单片机的一个IO口输出不同占空比的PWM信号,连接到风扇驱动电路,从而控制风扇转速。
  5. 四位数码管显示:数码管一般采用共阴极或共阳极,通过单片机的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();
    }
}
  1. 初始化部分ds18b20_init函数用来初始化DS18B20温度传感器,通过拉低总线一定时间,然后释放等待传感器响应。这里面的延时控制很关键,得保证符合DS18B20的时序要求。
  2. 数据读写函数ds18b20readbyteds18b20writebyte分别用于从DS18B20读取一个字节和向它写入一个字节。在读写过程中,严格按照时序,通过控制DQ引脚的电平变化来传输数据。
  3. 温度读取函数read_temperature函数先初始化DS18B20,然后发送指令让它开始转换温度,再读取转换后的温度数据,并进行简单的转换得到实际温度值。
  4. 数码管显示函数display_temperature把温度值拆分成个位、十位、百位、千位,然后通过控制数码管的段选和位选,依次显示各个数位。
  5. PWM控制函数pwm_control根据红外人体感应模块的状态和温度值来设置PWM占空比。如果有人,温度低时占空比小,温度高时占空比大;没人时占空比直接设为0,关闭风扇。
  6. 主函数:在main函数里,通过一个无限循环不断读取温度、控制PWM和显示温度,实现整个系统的持续运行。

通过这样的硬件和软件配合,就能打造出一个超智能的温控风扇啦,是不是还挺有趣的!大家不妨也动手试试。

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

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐