基于51单片机的温度控制器 根据设定的温度阈值,控制两个继电器开关。 温度高,制冷,温度低,加热。 ds18b20采集温度,adc0832对温度阈值调节上下限。 lcd1602显示。 提供protues仿真,原理图。

今天咱们来玩点硬核的——用老当益壮的51单片机做个智能温控系统。别看这芯片年纪大,调教好了照样能打。咱们这个系统能自动切换加热制冷,还能手动调阈值,简直就是宿舍空调的丐版平替。

先看硬件架构(Proteus里连好线的工程我放文末了)。STC89C52核心板挂载了三个关键外设:DS18B20负责测温,ADC0832处理阈值旋钮,LCD1602显示实时数据。两个继电器分别接在P2.6和P2.7,用来控制加热片和小风扇。

温度采集是重头戏。DS18B20这个单总线器件用起来是真香,但时序要求严格。上代码:

float get_temp(){
    uchar TL,TH;
    init_ds18b20();
    write_byte(0xCC); // 跳过ROM
    write_byte(0x44); // 启动转换
    delay(800);      // 12位精度需750ms
    init_ds18b20();
    write_byte(0xCC);
    write_byte(0xBE); // 读暂存器
    TL = read_byte();  // 低字节
    TH = read_byte();  // 高字节
    return (TH<<8|TL)*0.0625; // 转换实际温度
}

这里有个坑要注意:DS18B20的转换时间与精度相关。12位模式必须等够750ms,实测发现延时不够会读出85℃这个错误值。建议在初始化时配置寄存器确定分辨率,别依赖默认设置。

基于51单片机的温度控制器 根据设定的温度阈值,控制两个继电器开关。 温度高,制冷,温度低,加热。 ds18b20采集温度,adc0832对温度阈值调节上下限。 lcd1602显示。 提供protues仿真,原理图。

阈值调节用的ADC0832是双通道8位ADC,通过电位器分压获取设定值。看这段采集代码:

uchar read_adc(bit channel){
    uchar i,dat=0;
    CLK = 0; _nop_();
    DI = 1; // 起始信号
    CLK = 1; _nop_();
    CLK = 0; _nop_();
    DI = channel ? 1 : 0; // 选择通道
    CLK = 1; _nop_();
    CLK = 0; 
    DI = 1; // 释放数据线
    for(i=0;i<8;i++){
        dat <<= 1;
        if(DO) dat |= 0x01;
        CLK = 1; _nop_();
        CLK = 0; _nop_();
    }
    return dat;
}

这个两位半的ADC驱动挺有意思——CLK信号要手动翻转,数据分两次传输。实际调试时发现,当电位器调到两端时ADC值会有±3的抖动,解决方法是在代码里做软件滤波,连续三次采样一致才更新阈值。

显示部分用LCD1602做经典两行显示。这里有个实用技巧:温度符号℃需要自定义字库。在初始化时写入:

uchar celsius[] = {0x18,0x18,0x03,0x04,0x04,0x04,0x03,0x00}; // ℃符号
lcd_write_cmd(0x40);
for(i=0;i<8;i++) lcd_write_data(celsius[i]);

这样在需要显示时直接输出0x00这个自定义字符即可,比用16x2液晶自带的字符灵活得多。

控制逻辑是核心算法:

void control_relay(float temp){
    if(temp > high_threshold){
        HEAT_OFF();  // 关加热
        COOL_ON();   // 开制冷
    }else if(temp < low_threshold){
        COOL_OFF();  // 关制冷
        HEAT_ON();   // 开加热
    }else{
        HEAT_OFF();
        COOL_OFF();  // 维持区不做动作
    }
}

这里有个反常识设计:当温度处于死区时同时关闭两个继电器。实测发现如果设置回差太小,系统会在阈值附近频繁切换,导致继电器啪啪响。建议死区宽度至少设置2℃以上,保护继电器触点。

最后说下硬件注意事项:

  1. 继电器线圈必须反并联二极管,我用的是1N4007
  2. DS18B20的电源引脚要加104瓷片电容
  3. 调试时可用杜邦线临时连接,但正式使用建议做PCB或焊接洞洞板

整套系统在Proteus里跑得挺稳,但实际搭电路时被电源坑过——当继电器动作时电压波动会导致单片机复位。后来在7805前端加了个470μF的电解电容才解决问题。完整工程和源码已打包,关注后私信"温控"获取。下期可能搞个WiFi远程监控版,看点赞情况吧(笑)。

Logo

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

更多推荐