ds18b20温度传感器代码51 lcd1602显示
时间: 2023-10-07 18:04:25 浏览: 161
【51单片机】温度传感器DS18B20程序LCD1602显示.doc
5星 · 资源好评率100%
以下是基于51单片机和LCD1602的DS18B20温度传感器代码:
```
#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit DQ=P2^1;//DS18B20数据线接口
void delay(uint x)//延时函数
{
uint i,j;
for(i=x;i>0;i--)
for(j=110;j>0;j--);
}
void write_byte(uchar dat)//向DS18B20写一个字节
{
uchar i;
for(i=0;i<8;i++)
{
DQ=0;//每写一位数据先把数据线拉低1us
_nop_();//空指令
_nop_();
DQ=dat&0x01;//然后写入数据的最低位
_nop_();
_nop_();
DQ=1;//写完最低位后把数据线拉高
dat>>=1;//将数据右移一位,准备写下一个数据位
}
}
uchar read_byte()//从DS18B20读取一个字节
{
uchar i,dat=0;
for(i=0;i<8;i++)
{
dat>>=1;//每次先把数据移一位,然后再读取数据线上的数据
DQ=0;//拉低数据线1us
_nop_();
_nop_();
DQ=1;//拉高数据线
_nop_();
_nop_();
if(DQ) dat|=0x80;//如果数据线上有数据,则将最高位赋为1
}
return dat;//返回读取到的数据
}
void init_ds18b20()//初始化DS18B20
{
DQ=1;//初始化前先把数据线拉高
delay(50);//延时50us
DQ=0;//然后把数据线拉低
delay(500);//延时500us,保持低电平
DQ=1;//最后拉高数据线
delay(50);//延时50us
}
void main()
{
uchar tmp=0;
uchar temp[2];//定义存储温度的数组
init_ds18b20();//初始化DS18B20
write_byte(0xcc);//跳过ROM操作命令
write_byte(0x44);//启动温度转换命令
delay(1000);//等待1s温度转换完成
init_ds18b20();//再次初始化DS18B20
write_byte(0xcc);//跳过ROM操作命令
write_byte(0xbe);//读取温度寄存器命令
temp[0]=read_byte();//读取温度的低8位
temp[1]=read_byte();//读取温度的高8位
tmp=temp[1]>>4;//将高8位的前4位去掉
tmp|=(temp[0]&0x0f)<<4;//将低8位的后4位加上
temp[0]=tmp;//将合并后的数据存到temp[0]中
tmp=temp[1]&0x0f;//将高8位的后4位存到tmp中
tmp|=(temp[0]&0xf0);//将低8位的前4位加上
temp[1]=tmp;//将合并后的数据存到temp[1]中
write_byte(0xcc);//跳过ROM操作命令
write_byte(0xbe);//读取温度寄存器命令
temp[0]=read_byte();//读取温度的低8位
temp[1]=read_byte();//读取温度的高8位
tmp=temp[1]>>4;//将高8位的前4位去掉
tmp|=(temp[0]&0x0f)<<4;//将低8位的后4位加上
temp[0]=tmp;//将合并后的数据存到temp[0]中
tmp=temp[1]&0x0f;//将高8位的后4位存到tmp中
tmp|=(temp[0]&0xf0);//将低8位的前4位加上
temp[1]=tmp;//将合并后的数据存到temp[1]中
write_byte(0xcc);//跳过ROM操作命令
write_byte(0x44);//启动温度转换命令
delay(1000);//等待1s温度转换完成
while(1)//将温度数据显示在LCD1602上
{
write_byte(0xcc);//跳过ROM操作命令
write_byte(0xbe);//读取温度寄存器命令
temp[0]=read_byte();//读取温度的低8位
temp[1]=read_byte();//读取温度的高8位
tmp=temp[1]>>4;//将高8位的前4位去掉
tmp|=(temp[0]&0x0f)<<4;//将低8位的后4位加上
temp[0]=tmp;//将合并后的数据存到temp[0]中
tmp=temp[1]&0x0f;//将高8位的后4位存到tmp中
tmp|=(temp[0]&0xf0);//将低8位的前4位加上
temp[1]=tmp;//将合并后的数据存到temp[1]中
write_byte(0xcc);//跳过ROM操作命令
write_byte(0xbe);//读取温度寄存器命令
temp[0]=read_byte();//读取温度的低8位
temp[1]=read_byte();//读取温度的高8位
tmp=temp[1]>>4;//将高8位的前4位去掉
tmp|=(temp[0]&0x0f)<<4;//将低8位的后4位加上
temp[0]=tmp;//将合并后的数据存到temp[0]中
tmp=temp[1]&0x0f;//将高8位的后4位存到tmp中
tmp|=(temp[0]&0xf0);//将低8位的前4位加上
temp[1]=tmp;//将合并后的数据存到temp[1]中
write_byte(0x38);//显示屏设置为16*2,5*7点阵,8位数据线
write_byte(0x0c);//显示屏开启,光标关闭
write_byte(0x06);//显示屏写入数据后光标自动右移
write_byte(0x80);//设置光标位置为第1行第1列
write_byte(temp[1]/10+'0');//将温度的十位数写入显示屏
write_byte(temp[1]%10+'0');//将温度的个位数写入显示屏
write_byte('.');//在显示屏上写入小数点
write_byte(temp[0]/10+'0');//将温度的十分位数写入显示屏
write_byte(temp[0]%10+'0');//将温度的百分位数写入显示屏
delay(1000);//延时1s后再次读取温度数据
}
}
```
需要注意的是,这里只是简单地读取温度传感器的数据并显示在LCD1602上,没有进行温度校准和误差修正。如果需要更精确的温度测量,可以参考DS18B20的数据手册进行相关的校准和修正。
阅读全文