使用51单片机设计一个热水器

本设计使用51单片机控制一个热水器,实现以下功能:

  • 可通过LCD1602显示温度阈值和当前温度;
  • 可通过非接触式水位检测模块检测水位;
  • 可通过DS18b20检测温度。
  • 温度检测范围是0-99℃,精确温度为±1℃;
  • 设定3个功率档位指示灯,1~4档1个灯亮,5~8档2个灯亮,9档3个灯亮。0档无功率输出,档位灯不亮。
  • 设置3个按键,分别为电源开关键、'+'键、'-'键。加热功率0~9档按'+'键依次递增,按'-'键一次递减。0~9档依次为0, 1/9P、2/9P...。
  • 出水温度超过65℃时停止加热,并蜂鸣报警,温度降到45℃以下时恢复。
  • 内胆温度超过105℃时停止加热,防止干烧。

代码内容: 由于本题代码量较大,无法在此处完整展示,仅提供思路和部分代码片段。

思路:

  1. 初始化LCD1602、DS18b20和非接触式水位检测模块。
  2. 读取DS18b20的温度值,并将其显示在LCD1602上。
  3. 读取非接触式水位检测模块的水位值,并根据水位值控制加热器的开关。
  4. 根据按键的输入控制加热器的功率档位和开关状态。
  5. 监测出水温度和内胆温度,若超过设定值则停止加热并报警。

部分代码片段:

LCD1602初始化:

void LCD1602_Init(void)
{
    Write_Command(0x38); //8位数据接口,2行显示,5x7点阵字符
    Write_Command(0x0c); //显示开,关光标,不闪烁
    Write_Command(0x06); //写入字符后光标右移,整屏不移位
    Write_Command(0x01); //清屏
}

DS18b20温度读取:

void DS18B20_ReadTemperature(void)
{
    unsigned char temp_LSB, temp_MSB;
    float temp;
    DS18B20_Reset(); //复位
    DS18B20_WriteByte(0xcc); //跳过ROM操作
    DS18B20_WriteByte(0x44); //开始温度转换
    DS18B20_Reset(); //复位
    DS18B20_WriteByte(0xcc); //跳过ROM操作
    DS18B20_WriteByte(0xbe); //读取温度值
    temp_LSB = DS18B20_ReadByte(); //读取温度值低8位
    temp_MSB = DS18B20_ReadByte(); //读取温度值高8位
    temp = (float)(temp_MSB << 8 | temp_LSB) * 0.0625; //计算温度值
    LCD1602_DisplayTemperature(temp); //将温度值显示在LCD1602上
}

非接触式水位检测:

void WaterLevel_Detection(void)
{
    unsigned char water_level;
    water_level = WaterLevel_Read(); //读取水位值
    if (water_level == 0) //水位低于阈值,停止加热
    {
        Heater_Off();
    }
    else //水位高于阈值,加热器开启
    {
        Heater_On();
    }
}

加热功率控制:

void Power_Control(void)
{
    unsigned char key_value;
    key_value = Key_Scan(); //读取按键值
    switch (key_value)
    {
        case 1: //电源开关键
            if (heater_status == 0) //加热器关闭状态,打开加热器
            {
                Heater_On();
            }
            else //加热器开启状态,关闭加热器
            {
                Heater_Off();
            }
            break;
        case 2: //'+'键
            if (heater_status == 1 && power_level < 9) //加热器开启状态,且功率档位小于9,增加功率档位
            {
                power_level++;
                PowerIndicator_Display(power_level); //显示功率档位灯
                Heater_Control(power_level); //控制加热器功率
            }
            break;
        case 3: //'-'键
            if (heater_status == 1 && power_level > 0) //加热器开启状态,且功率档位大于0,降低功率档位
            {
                power_level--;
                PowerIndicator_Display(power_level); //显示功率档位灯
                Heater_Control(power_level); //控制加热器功率
            }
            break;
        default:
            break;
    }
}

出水温度和内胆温度监测:

void Temperature_Monitoring(void)
{
    float water_temp, inner_temp;
    water_temp = WaterTemperature_Read(); //读取出水温度
    inner_temp = InnerTemperature_Read(); //读取内胆温度
    if (water_temp > 65) //出水温度超过65℃,停止加热并报警
    {
        Heater_Off();
        Alarm_On();
    }
    else if (water_temp < 45) //出水温度降到45℃以下,停止报警
    {
        Alarm_Off();
    }
    if (inner_temp > 105) //内胆温度超过105℃,停止加热
    {
        Heater_Off();
    }
}

注意: 以上代码片段仅供参考,实际代码需要根据具体硬件平台和需求进行调整。

51单片机热水器设计:LCD1602显示、非接触式水位检测和DS18b20温度传感器

原文地址: https://www.cveoy.top/t/topic/oBJW 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录