51单片机热水器设计:LCD1602显示、非接触式水位检测和DS18b20温度传感器
使用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℃时停止加热,防止干烧。
代码内容: 由于本题代码量较大,无法在此处完整展示,仅提供思路和部分代码片段。
思路:
- 初始化LCD1602、DS18b20和非接触式水位检测模块。
- 读取DS18b20的温度值,并将其显示在LCD1602上。
- 读取非接触式水位检测模块的水位值,并根据水位值控制加热器的开关。
- 根据按键的输入控制加热器的功率档位和开关状态。
- 监测出水温度和内胆温度,若超过设定值则停止加热并报警。
部分代码片段:
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();
}
}
注意: 以上代码片段仅供参考,实际代码需要根据具体硬件平台和需求进行调整。
原文地址: https://www.cveoy.top/t/topic/oBJW 著作权归作者所有。请勿转载和采集!