资料下载地址:单片机+DS18B20温度控制程序仿真与原理图PCB文件 可设上下限
目录
1、项目介绍
2、实物图
3、电路原理图
4、仿真原理图
5、部分代码
1、项目介绍
基于51单片机温度控制,使用18b20来做温度传感器,四位共阳数码管显示。功能说明书:系统启动后默认温度下限28℃、上限30℃。当温度低于设定下限温度时继电器开启、加热指示灯亮起,当温度达到设定上限温度时蜂鸣器响起、保温指示灯亮起,当温度高于设定下限温度低于上限温度时蜂鸣器关闭保温指示灯继续亮起,温度低于下限温度时切换继电器开启加热指示灯亮起。(假设设置烧水,温度下限设置在90℃、上限设置100℃就行)
2、实物图
3、电路原理图
4、仿真原理图
5、部分代码
void scan()
{
int j;
for(j=0;j<4;j++)
{
switch(j)
{
case 0:
dm=table_dm[display[0]];;
w0=0; //打开数码管显示小数数字的数码管位选端
delay(50);
w0=1; //关闭数码管显示小数数字的数码管位选端
case 1:
dm=table_dm1[display[1]];
w1=0; //打开数码管显示个位数字的数码管位选端
delay(50);
w1=1; //关闭数码管显示个位数字的数码管位选端
case 2:
dm=table_dm[display[2]];
w2=0; //打开数码管显示十位数字的数码管位选端
delay(50);
w2=1; //关闭数码管显示十位数字的数码管位选端
case 3:
dm=table_dm[display[3]];
w3=0; //打开数码管显示百位数字的数码管位选端
delay(50);
w3=1; //关闭数码管显示百位数字的数码管位选端
}
}
}
/****温度传感器采用的是DS18b20,此传感器采用的
是“单总线”来传输数据。****/
/**************DS18B20初始化**************/
ow_reset(void) //初始化
{
char presence=1;
while(presence)
{
while(presence)
{
DQ=1;_nop_();_nop_(); //将数据线拉高并延时
DQ=0; //将DQ(P1.0)引脚拉低。请注意,这里的DQ不是变量,而是单片机的引脚!!!
delay(50); //延时
DQ=1; //将DS拉高
delay(6);
presence=DQ;
}
delay(45);
presence=~DQ;
}
DQ=1;
return presence;
}
/****************写命令函数*****************/
void write_byte(uchar val)
{
uchar i;
for(i=8;i>0;i--)
{
DQ=1;_nop_();_nop_(); //将数据线拉高并延时
DQ=0;_nop_();_nop_();_nop_();_nop_(); //将数据线拉低并延时
DQ=val&0x01;
delay(6);
val=val>>1;
}
DQ=1;
delay(1);
}
/****************读一个字节函数*******************/
uchar read_byte(void)
{
uchar i;
uchar value=0;
for(i=8;i>0;i--) //采用for 循环,读取原始温度数据
{
DQ=1;_nop_();_nop_();
value>>=1;
DQ=0;_nop_();_nop_();_nop_();_nop_();
DQ=1;_nop_();_nop_();_nop_();_nop_();
if(DQ)value|=0x80;
delay(6);
}
DQ=1;
return value;
}
/***************读取温度函数***************/
read_temp() //读取18b20传感器函数
{
ow_reset();
delay(200);
write_byte(0xcc);
write_byte(0x44);
ow_reset();
delay(1);
write_byte(0xcc);
write_byte(0xbe);
temp_data[0]=read_byte();
temp_data[1]=read_byte();
temp=temp_data[1];
temp<<=8;
temp=temp|temp_data[0];
return temp;
}