基于51单片机的三型温度控制器
时间: 2023-12-12 10:03:28 浏览: 46
基于51单片机的三型温度控制器可以通过以下步骤实现:
1.硬件设计:该控制器需要使用三个DS18B20温度传感器,一个AT89C51单片机,一个LCD1602液晶显示屏,一个继电器模块和一些电阻、电容等元器件。其中,三个温度传感器分别采集三个不同地方的温度,AT89C51单片机进行数据处理,LCD1602液晶显示屏显示所测量温度,继电器模块控制加热或制冷设备的开关。
2.软件设计:该控制器需要进行温度控制,具体实现方法如下:
- 读取三个温度传感器的温度值,并将其显示在LCD1602液晶显示屏上。
- 根据设定的温度范围,判断当前温度是否需要加热或制冷。
- 如果需要加热,则控制继电器模块闭合,开启加热设备;如果需要制冷,则控制继电器模块断开,开启制冷设备。
- 循环执行上述步骤,实现温度控制。
以下是基于51单片机的三型温度控制器的代码示例:
```c
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit DSPORT=P3^7; // DS18B20数据线连接的单片机IO口
sbit RELAY=P1^0; // 继电器模块连接的单片机IO口
uchar code table[]="Temperature:"; // LCD1602液晶显示屏上显示的文字
void delay(uint i) // 延时函数
{
while(i--);
}
void write_ds18b20(uchar dat) // 向DS18B20写入一个字节的数据
{
uchar i;
for(i=0;i<8;i++)
{
DSPORT=0; // 拉低数据线
_nop_();
_nop_();
DSPORT=dat&0x01; // 写入数据
dat>>=1;
_nop_();
_nop_();
DSPORT=1; // 释放数据线
}
}
uchar read_ds18b20() // 从DS18B20读取一个字节的数据
{
uchar i,dat=0;
for(i=0;i<8;i++)
{
DSPORT=0; // 拉低数据线
_nop_();
_nop_();
dat>>=1;
DSPORT=1; // 释放数据线
if(DSPORT) dat|=0x80; // 读取数据
_nop_();
_nop_();
}
return dat;
}
void init_ds18b20() // 初始化DS18B20
{
uchar i;
DSPORT=1;
delay(8);
DSPORT=0;
delay(80);
DSPORT=1;
delay(8);
i=read_ds18b20();
write_ds18b20(0xcc);
write_ds18b20(0x44);
}
void display_temperature(uchar temp1, uchar temp2, uchar temp3) // 在LCD1602液晶显示屏上显示温度
{
uchar i;
LCD1602_Write_Command(0x80); // 设置光标位置为第一行第一列
for(i=0;i<12;i++)
{
LCD1602_Write_Data(table[i]); // 显示文字
}
LCD1602_Write_Command(0x8a); // 设置光标位置为第一行第十三列
LCD1602_Write_Data(temp1/10+'0'); // 显示第一个温度传感器的十位数
LCD1602_Write_Data(temp1%10+'0'); // 显示第一个温度传感器的个位数
LCD1602_Write_Data('.'); // 显示小数点
LCD1602_Write_Data(temp2/10+'0'); // 显示第二个温度传感器的十位数
LCD1602_Write_Data(temp2%10+'0'); // 显示第二个温度传感器的个位数
LCD1602_Write_Data('.'); // 显示小数点
LCD1602_Write_Data(temp3/10+'0'); // 显示第三个温度传感器的十位数
LCD1602_Write_Data(temp3%10+'0'); // 显示第三个温度传感器的个位数
LCD1602_Write_Data(0xdf); // 显示温度符号
LCD1602_Write_Data('C'); // 显示单位
}
void main()
{
uchar temp1,temp2,temp3;
init_ds18b20(); // 初始化DS18B20
LCD1602_Init(); // 初始化LCD1602液晶显示屏
while(1)
{
write_ds18b20(0xcc);
write_ds18b20(0x44);
delay(1000); // 等待温度转换完成
write_ds18b20(0xcc);
write_ds18b20(0xbe);
temp1=read_ds18b20(); // 读取第一个温度传感器的温度值
read_ds18b20();
temp2=read_ds18b20(); // 读取第二个温度传感器的温度值
read_ds18b20();
temp3=read_ds18b20(); // 读取第三个温度传感器的温度值
display_temperature(temp1,temp2,temp3); // 在LCD1602液晶显示屏上显示温度
if(temp1>30 || temp2>30 || temp3>30) // 如果任意一个温度传感器的温度超过30度
{
RELAY=1; // 继电器闭合,开启加热设备
}
else if(temp1<20 || temp2<20 || temp3<20) // 如果任意一个温度传感器的温度低于20度
{
RELAY=0; // 继电器断开,开启制冷设备
}
}
}
```