DS18B20测量温度液晶1602显示

DS18B20是一款数字温度传感器,以其单线接口、宽温范围、多点组网和高精度等特点被广泛使用。传感器能进行-55℃~+125℃的温度测量,并可在-10℃到+85℃区间达到±0.4℃的精度。它支持在一条数据线上连接多个传感器,且无需额外外围元件,数据以9-12位数字量方式传送。程序示例展示了如何在51单片机上使用DS18B20读取温度并在LCD1602上显示。

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());}}

}

}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嵌入式硬件与代码

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值