51单片机DS18B20lcd显示温度
时间: 2023-07-29 09:06:13 浏览: 93
好的,我可以为你提供一个简单的 51 单片机程序,用于将 DS18B20 温度传感器读取的温度值显示在 LCD1602 液晶屏上。
首先需要连接硬件:将 DS18B20 温度传感器的 DQ 引脚连接到 51 单片机的 P2.7 引脚,将 LCD1602 液晶屏的 RS、RW、E 引脚分别连接到单片机的 P0.0、P0.1、P0.2 引脚,将液晶屏的 D0-D7 引脚分别连接到单片机的 P1.0-P1.7 引脚。
接下来看一下程序:
```c
#include <reg51.h> //头文件
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit DQ = P2^7; //定义DS18B20的数据线
void delay(uint i) //延时函数
{
while(i--);
}
uchar init_ds18b20() //初始化DS18B20
{
uchar i;
DQ = 1;
_nop_();
_nop_();
_nop_();
_nop_();
DQ = 0;
delay(60);
DQ = 1;
delay(10);
i = DQ;
delay(500);
return i;
}
void write_ds18b20(uchar dat) //向DS18B20写入一个字节的数据
{
uchar i;
for(i=0; i<8; i++)
{
DQ = 0;
_nop_();
_nop_();
DQ = dat & 0x01;
dat >>= 1;
delay(5);
DQ = 1;
_nop_();
_nop_();
}
}
uchar read_ds18b20() //从DS18B20读取一个字节的数据
{
uchar i, dat = 0;
for(i=0; i<8; i++)
{
DQ = 0;
_nop_();
_nop_();
dat >>= 1;
if(DQ) dat |= 0x80;
delay(5);
DQ = 1;
_nop_();
_nop_();
}
return dat;
}
void convert_ds18b20() //启动DS18B20温度转换
{
init_ds18b20();
write_ds18b20(0xcc); //跳过ROM操作
write_ds18b20(0x44); //启动温度转换
}
int read_temperature_ds18b20() //从DS18B20读取温度值
{
uchar temh, templ;
int temp;
init_ds18b20();
write_ds18b20(0xcc); //跳过ROM操作
write_ds18b20(0xbe); //读取温度寄存器
templ = read_ds18b20();
temh = read_ds18b20();
temp = temh;
temp <<= 8;
temp |= templ;
return temp;
}
void write_lcd1602(uchar dat, bit cmd) //向LCD1602写入一个字节的数据或命令
{
RS = cmd;
RW = 0;
P0 = dat;
delay(5);
E = 1;
_nop_();
_nop_();
E = 0;
}
void init_lcd1602() //初始化LCD1602
{
write_lcd1602(0x38, 1); //8位数据总线,2行显示,5×7点阵字符
write_lcd1602(0x0c, 1); //开显示,不显示光标和闪烁
write_lcd1602(0x06, 1); //光标右移,字符不移动
write_lcd1602(0x01, 1); //清屏
}
void main()
{
int temperature;
uchar i, j, k, dis_data[4];
init_lcd1602();
while(1)
{
convert_ds18b20(); //启动温度转换
delay(200);
temperature = read_temperature_ds18b20(); //读取温度值
temperature >>= 4;
if(temperature < 0) //如果为负数,转换为补码形式
{
temperature = ~temperature + 1;
temperature |= 0x800;
}
dis_data[0] = temperature / 100; //计算并转换显示数据
dis_data[1] = temperature % 100 / 10;
dis_data[2] = temperature % 10;
dis_data[3] = 'C';
write_lcd1602(0x80, 1); //第一行第一列
for(i=0; i<4; i++) //显示温度值
{
write_lcd1602(dis_data[i]+'0', 0);
}
write_lcd1602(0xc0, 1); //第二行第一列
for(j=0; j<8; j++) //显示提示信息
{
write_lcd1602(' ', 0);
}
write_lcd1602('T', 0);
write_lcd1602('e', 0);
write_lcd1602('m', 0);
write_lcd1602('p', 0);
write_lcd1602(':', 0);
for(k=0; k<8; k++) //显示提示信息
{
write_lcd1602(' ', 0);
}
delay(500);
}
}
```
该程序的主要流程为:初始化LCD1602液晶屏和DS18B20温度传感器,然后循环读取温度值并将其转换为需要显示的格式,最后在LCD1602液晶屏上显示出来。
注意,该程序中的延时函数可能需要根据硬件设备的实际情况进行调整。
阅读全文