DS18B20温度传感器简介
DS18B20是一种数字温度传感器。它输出的是数字信号,同时具有体积小,硬件资源耗费少,抗干扰能力强,精度高等特点。
DS18B20温度传感器特点
1、单线接口:DS18B20仅需一条线可实现与微处理器双向通信。
2、测温范围: DS18B20温度传感器的测温范围可达-55℃~+125℃,在-10℃到+85℃范围内误差为±0.4°。
3、支持多点组网功能:多个DS18B20温度传感器可以并联在一条数据线上,最多可以并联8个,实现多点测温。
4、工作电源: 3.0~5.5V/DC ,DS18B20温度传感器可以采用外部独立电源供电,也可以用数据线寄生电源供电。
5、DS18B20温度传感器在应用过程中不需要任何外围元件。
6、DS18B20测量温度的结果以9~12位数字量方式串行传送。
7、掉电保护功能, DS18B20温度传感器内部含有 EEPROM ,通过配置寄存器可以设定数字转换精度和报警温度。在DS18B20温度传感器掉电以后仍可保存分辨率及报警温度的设定值。
8、DS18B20温度传感器返回16位二进制数代表此刻探测的温度值,其高五位代表正负。如果高五位全部为1,则代表返回的温度值为负值。如果高五位全部为0,则代表返回的温度值为正值。后面的11位数据代表温度的绝对值,将其转换为十进制数值之后,再乘以0.0625即可获得此时的温度值。
DS18B20温度传感器引脚说明
DS18B20温度传感器接口电路
液晶1602接口电路
DS18B20测量温度程序源代码
/***************DS18B20测量温度,用1602显示温度值***************
* 单片机:51单片机
* 开发环境:keil
* 功能: DS18B20测量温度,并在LCD1602中显示出来
**********************************************************************/
#include <reg51.h>
#define LCD_Data P0
#define Busy 0x80
#define uchar unsigned char
#define uint unsigned int
uchar code table0[] = {" SL-51A "};
uchar code table1[] = {" TEMP: XX.X "};
uchar temperature[5]; //温度值
uint temp;
sbit LCD_RS = P1^0;
sbit LCD_RW = P1^1;
sbit LCD_E = P2^5;
sbit DS = P2^2;
void Delay5Ms(void);
void delay(uint count);
void WriteDataLCD(unsigned char WDLCD);
void WriteCommandLCD(unsigned char WCLCD,BuysC);
unsigned char ReadDataLCD(void);
unsigned char ReadStatusLCD(void);
void LCDInit(void);
void DisplayOneChar(unsigned char X, unsigned charY, unsigned char DData);
void DisplayListChar(unsigned char X, unsignedchar Y, unsigned char code *DData);
void Info_display(void);
void dsreset(void);
bit tmpreadbit(void);
uchar tmpread(void);
void tmpwritebyte(uchar dat);
void tmpchange(void);
uint tmp();
void delay(uint count)
{
uint i;
while(count)
{i=200;while(i>0)i--;count--;}
}
void dsreset(void) //发复位命令
{
uint i;
DS=0;i=103;while(i>0)i--;
DS=1;i=4;while(i>0)i--;
}
bit tmpreadbit(void) //读取一位
{
uint i;
bit dat;
DS=0;i++;
DS=1;i++;i++;
dat=DS;
i=8;while(i>0)i--;
return(dat);
}
uchar tmpread(void) //读取一个字节
{
uchari,j,dat;
dat=0;
for(i=1;i<=8;i++)
{
j=tmpreadbit();
dat=(j<<7)|(dat>>1); //读出的数据最低位在最前面
}
return(dat);
}
void tmpwritebyte(uchar dat) //向ds18b20写入一个字节
{
uint i;
uchar j;
bit testb;
for(j=1;j<=8;j++)
{
testb=dat&0x01;
dat=dat>>1;
if(testb)
{
DS=0;i++;i++;
DS=1;i=8;while(i>0)i--;
}
else
{
DS=0;i=8;while(i>0)i--;
DS=1;i++;i++;
}
}
}
void tmpchange(void) //DS18B20开始转换
{
dsreset();delay(1);
tmpwritebyte(0xcc); //命令的含义可以查18b20的手册
tmpwritebyte(0x44);
}
uint tmp() //获取温度值
{
float tt;
uchar a,b;
dsreset();delay(1);
tmpwritebyte(0xcc);
tmpwritebyte(0xbe);
a=tmpread();
b=tmpread();
temp=b;
temp<<=8;
temp=temp|a;
tt=temp*0.0625;
temp=tt*10+0.5;
returntemp;
}
/*************************5ms延时函数***************************/
void Delay5Ms(void)
{
unsignedint TempCyc = 3552;
while(TempCyc--);
}
/**************************写数据函数***************************/
void WriteDataLCD(unsigned char WDLCD)
{
ReadStatusLCD(); //检测忙
LCD_Data =WDLCD;
LCD_E = 0; //若晶振速度太高可以在这后加小的延时
LCD_E = 0; //延时
LCD_RS = 1;
LCD_RW = 0;
LCD_E = 1;
LCD_E = 0;
}
/*************************写指令函数****************************/
void WriteCommandLCD(unsigned charWCLCD,BuysC) //BuysC为0时忽略忙检测
{
if (BuysC)ReadStatusLCD(); //根据需要检测忙
LCD_Data =WCLCD;
LCD_E = 0;
LCD_E = 0;
LCD_RS = 0;
LCD_RW = 0;
LCD_E = 1;
LCD_E = 0;
}
/**************************读状态函数***************************/
unsigned char ReadStatusLCD(void)
{
LCD_Data =0xFF;
LCD_RS = 0;
LCD_RW = 1;
LCD_E = 0;
LCD_E = 0;
LCD_E = 1;
while(LCD_Data & Busy); //检测忙信号
return(LCD_Data);
}
/***************************LCD初始化***************************/
void LCDInit(void) //LCD初始化
{
LCD_Data =0;
WriteCommandLCD(0x38,0); //三次显示模式设置,不检测忙信号
Delay5Ms();
WriteCommandLCD(0x38,0);
Delay5Ms();
WriteCommandLCD(0x38,0);
Delay5Ms();
WriteCommandLCD(0x38,1); //显示模式设置, 开始要求每次检测忙信号
WriteCommandLCD(0x08,1); //关闭显示
WriteCommandLCD(0x01,1); //显示清屏
WriteCommandLCD(0x06,1); //显示光标移动设置
WriteCommandLCD(0x0C,1); //显示开及光标设置
}
/**********************按指定位置显示一个字符*********************/
void DisplayOneChar(unsigned char X, unsigned charY, unsigned char DData)
{
Y &=0x1;
X &=0xF; //限制X不能大于15,Y不能大于1
if (Y) X |=0x40; //当要显示第二行时地址码+0x40;
X |=0x80; //算出指令码
WriteCommandLCD(X,0); //这里不检测忙信号,发送地址码
WriteDataLCD(DData);
}
/***********************按指定位置显示一串字符********************/
void DisplayListChar(unsigned char X, unsignedchar Y, unsigned char code *DData)
{
unsignedchar ListLength;
ListLength= 0;
Y &=0x1;
X &=0xF; //限制X不能大于15,Y不能大于1
while(DData[ListLength]>=0x20) //若到达字串尾则退出
{
if (X<= 0xF) //X坐标应小于0xF
{
DisplayOneChar(X, Y, DData[ListLength]);//显示单个字符
ListLength++;
X++;
}
}
}
/*****************************************************************/
void temp_display(unsigned int temp) //显示程序
{
unsignedchar A1,A2,A2t,A3;
A1=temp/100; //百位
A2t=temp%100;
A2=A2t/10; //十位
A3=A2t%10; //个位
temperature[1]=A1 + 0x30;
temperature[2]=A2 + 0x30;
temperature[3]=A3 + 0x30;
DisplayOneChar(9,1,temperature[1]);
DisplayOneChar(10,1,temperature[2]);
DisplayOneChar(12,1,temperature[3]);
}
/******************************************************************/
void init()
{
LCDInit();
DisplayListChar(0,0,table0);
DisplayListChar(0,1,table1);
}
void main()
{
int i;
init();
while(1)
{
tmpchange();
for(i=0;i<=10;i++)
{if(i==10){temp_display(tmp());}}
}
}