1. DS18B20温度传感器:DS18B20是一种数字温度传感器,具有高精度、数字输出、单总线通信等特点。它可以直接连接到51单片机的IO口上,通过单总线协议进行数据通信。
2. 单总线协议:单总线协议是一种串行通信协议,通过一根数据线实现数据的传输和控制。在51单片机上使用单总线协议可以减少硬件连接,简化电路设计。
3. 采集流程:在51单片机上实现单总线温度采集的流程通常包括初始化DS18B20传感器、发送温度转换命令、读取温度数据等步骤。通过编写相应的程序,可以实现对DS18B20传感器的读取和温度数据的处理。
4. 应用领域:51单片机单总线温度采集广泛应用于各种温度监测系统,如温室控制、温度报警、环境监测等领域。通过采集环境温度数据,可以实现对环境的实时监测和控制。
总的来说,51单片机单总线温度采集是一种简单且有效的温度监测方案,适用于各种嵌入式系统和物联网应用。通过学习和实践,可以掌握这种温度采集技术,为自己的项目和应用增添新的功能和特性。
DS18B20
DS18B20是一款数字温度传感器,由美国芯片制造商Maxim Integrated公司生产。它采用单总线接口,能够通过数字信号输出温度数据,精度高达±0.5°C。DS18B20具有独特的64位ROM编程地址,可以通过唯一的地址来识别和区分多个传感器。它还具有低功耗特性,适用于各种温度测量应用,如室内温度监控、气象站、工业控制等领域。DS18B20被广泛应用于各种电子设备和系统中,是一款性能稳定可靠的数字温度传感器。
DB18B20通信时序
DS18B20是一种数字温度传感器,采用单总线接口进行通信。下面是DS18B20的通信时序简介:
1. 初始化:主控制器发送初始化信号,即产生一个脉冲信号,持续时间至少480微秒,然后释放总线。
2. 传输指令:主控制器发送指令给DS18B20,指令包括读取温度、写入配置等。
3. 传输数据:DS18B20接收指令后,开始传输数据。数据传输采用脉冲编码方式,每个脉冲持续时间为60微秒,高电平表示逻辑1,低电平表示逻辑0。
代价
向DS18B20写一位数据
void WR_Bit(bit i)
{
DQ=0;//产生写时序
_nop_();
_nop_();//总线拉低持续时间要大于1us
DQ=i;//写数据 ,0和1均可
Delayxus_DS18B20(3);//延时60us,等待ds18b20采样读取
DQ=1;//释放总线
}
DS18B20写字节函数
void WR_Byte(unsigned char dat)
{
unsigned char i="0";
while(i++<8)
{
WR_Bit(dat&0x01);//从最低位写起
dat>>=1; //注意不要写成dat>>1
}
}
4. 数据采集:主控制器接收到DS18B20传输的数据后,进行数据采集和处理,得到温度值。
5. 结束通信:通信结束后,主控制器发送复位信号,即产生一个脉冲信号,持续时间至少480微秒。
以上是DS18B20的通信时序简介,通过这些步骤可以实现主控制器与DS18B20之间的通信和数据传输。
protues仿真图
代码如下
#include "reg51.h"
#include "intrins.h"
#define uchar unsigned char
#define uint unsigned int
#define out P0
sbit smg1=out^4;
sbit smg2=out^5;
sbit DQ=P3^7;
void delay5(uchar);
void init_ds18b20(void);
uchar readbyte(void);
void writebyte(uchar);
uchar retemp(void);
void main(void) //主函数
{
uchar i,temp;
delay5(1000);
while(1)
{
temp=retemp();
for(i=0;i<10;i++) //连续扫描数码管10次
{
out=(temp/10)&0x0f;
smg1=0;
smg2=1;
delay5(1000); //延时5ms
out=(temp%10)&0x0f;
smg1=1;
smg2=0;
delay5(1000); //延时5ms
}
}
}
void delay5(uchar n) //函数功能:延时5µs
{
do
{
_nop_();
_nop_();
_nop_();
n--;
}
while(n);
}
void init_ds18b20(void) //函数功能:18B20初始化
{
uchar x=0;
DQ =0;
delay5(120);
DQ =1;
delay5(16);
delay5(80);
}
uchar readbyte(void) //函数功能:读取1字节数据
{
uchar i=0;
uchar date=0;
for (i=8;i>0;i--)
{
DQ =0;
delay5(1);
DQ =1; //15µs内拉释放总线
date>>=1;
if(DQ)
date|=0x80;
delay5(11);
}
return(date);
}
void writebyte(uchar dat) //函数功能:写1字节
{
uchar i=0;
for(i=8;i>0;i--)
{
DQ =0;
DQ =dat&0x01; //写"1" 在15µs内拉低
delay5(12); //写"0" 拉低60µs
DQ = 1;
dat>>=1;
delay5(5);
}
}
uchar retemp(void) //函数功能:读取温度
{
uchar a,b,tt;
uint t;
init_ds18b20();
writebyte(0xCC);
writebyte(0x44);
init_ds18b20();
writebyte(0xCC);
writebyte(0xBE);
a=readbyte();
b=readbyte();
t=b;
t<<=8;
t=t|a;
tt=t*0.0625;
return(tt);
}
keil波形
总结
在此次学习温度传感器的过程中,了解到了单总线的工作原理,通过通过这次实验,可以验证通信时序的重要性,收益很多,为学习51单片机打下基础。