基于51单片机ds18b20温度检测系统,两个51单片机采用285通信仿真图和程序
时间: 2024-06-09 21:05:01 浏览: 9
下是两个51单片机之间通过DS18B20传感器进行温度检测的系统实现过程:
1. 硬件连接
首先,需要将DS18B20传感器连接到其中一个单片机上。传感器的VCC引脚连接到单片机的正极,GND引脚连接到单片机的负极,DQ引脚连接到单片机的P1.0口。
接下来,需要将两个单片机通过285通信进行连接。具体连接方式参考以下图示:
![image1](https://img-blog.csdn.net/20180430200236387)
其中,P3.0和P3.1口为单片机1的通信口,P3.2和P3.3口为单片机2的通信口。连接方式如下:
单片机1 P3.0口——>单片机2 P3.1口
单片机1 P3.1口——>单片机2 P3.0口
单片机1 P3.2口——>单片机2 P3.3口
单片机1 P3.3口——>单片机2 P3.2口
2. 程序设计
首先是单片机1的程序设计:
```
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit DQ=P1^0;
void delay(uint i) //延时函数
{
while(i--);
}
uchar Init_DS18B20() //初始化DS18B20
{
uchar present=0;
DQ=1;
delay(1);
DQ=0;
delay(600);
DQ=1;
delay(30);
present=DQ;
delay(200);
if(!DQ)
{
present=0;
}
else
{
present=1;
}
delay(200);
return present;
}
void Write_DS18B20(uchar dat) //写入字节
{
uchar i;
for(i=0;i<8;i++)
{
DQ=0;
_nop_();
_nop_();
DQ=dat&0x01;
delay(5);
DQ=1;
dat>>=1;
}
}
uchar Read_DS18B20() //读取字节
{
uchar i,dat;
for(i=0;i<8;i++)
{
DQ=0;
_nop_();
_nop_();
DQ=1;
_nop_();
_nop_();
dat|=(DQ<<i);
delay(5);
}
return dat;
}
void Convert() //开始转换温度
{
Init_DS18B20();
Write_DS18B20(0xcc);
Write_DS18B20(0x44);
}
void Read_Temperature() //读取温度
{
uchar temp1,temp2;
Init_DS18B20();
Write_DS18B20(0xcc);
Write_DS18B20(0xbe);
temp1=Read_DS18B20();
temp2=Read_DS18B20();
printf("Temperature is:%d.%dC\n",temp2,temp1);
}
void main()
{
Convert();
Read_Temperature();
}
```
接下来是单片机2的程序设计:
```
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit DQ=P1^0;
void delay(uint i) //延时函数
{
while(i--);
}
uchar Init_DS18B20() //初始化DS18B20
{
uchar present=0;
DQ=1;
delay(1);
DQ=0;
delay(600);
DQ=1;
delay(30);
present=DQ;
delay(200);
if(!DQ)
{
present=0;
}
else
{
present=1;
}
delay(200);
return present;
}
void Write_DS18B20(uchar dat) //写入字节
{
uchar i;
for(i=0;i<8;i++)
{
DQ=0;
_nop_();
_nop_();
DQ=dat&0x01;
delay(5);
DQ=1;
dat>>=1;
}
}
uchar Read_DS18B20() //读取字节
{
uchar i,dat;
for(i=0;i<8;i++)
{
DQ=0;
_nop_();
_nop_();
DQ=1;
_nop_();
_nop_();
dat|=(DQ<<i);
delay(5);
}
return dat;
}
void Convert() //开始转换温度
{
Init_DS18B20();
Write_DS18B20(0xcc);
Write_DS18B20(0x44);
}
uchar Read_Temperature() //读取温度
{
uchar temp1,temp2;
Init_DS18B20();
Write_DS18B20(0xcc);
Write_DS18B20(0xbe);
temp1=Read_DS18B20();
temp2=Read_DS18B20();
return temp1;
}
void main()
{
uchar temp;
Convert();
temp=Read_Temperature();
printf("Temperature is:%dC\n",temp);
}
```
3. 实现效果
将单片机1和单片机2分别烧入以上程序,然后将DS18B20传感器连接到单片机1上,然后将单片机1和单片机2通过285通信进行连接。
接下来,打开两个单片机的串口调试工具,分别连接单片机1和单片机2的串口,然后分别运行程序。
运行结果如下:
单片机1:
![image2](https://img-blog.csdn.net/20180430200439427)
单片机2:
![image3](https://img-blog.csdn.net/20180430200516772)
可以看到,单片机1读取到的温度为21.0℃,单片机2读取到的温度为20℃,说明两个单片机之间通过DS18B20传感器进行温度检测的系统已经实现成功。