ds18b20温度传感器用LCD液晶屏显示代码51
时间: 2024-05-13 19:16:35 浏览: 90
以下是使用 DS18B20 温度传感器和 LCD 液晶屏显示温度数据的 8051 单片机代码:
```
#include <reg51.h>
// 定义 DS18B20 温度传感器的引脚
sbit DQ = P2^0;
// 定义 LCD 液晶屏的引脚
sbit RS = P1^0;
sbit RW = P1^1;
sbit EN = P1^2;
// 函数声明
void Init_DS18B20();
void Write_DS18B20(unsigned char dat);
unsigned char Read_DS18B20();
void Start_DS18B20();
void Convert_DS18B20();
unsigned int Read_Temp_DS18B20();
void Delay5us();
void Delay500ms();
void Delay1s();
void Init_LCD();
void Write_Command(unsigned char command);
void Write_Data(unsigned char dat);
void Display_Temp(unsigned int temp);
void main()
{
unsigned int temp;
Init_DS18B20();
Init_LCD();
while (1)
{
Start_DS18B20();
Convert_DS18B20();
temp = Read_Temp_DS18B20();
Display_Temp(temp);
Delay1s();
}
}
// 初始化 DS18B20 温度传感器
void Init_DS18B20()
{
DQ = 1;
Delay5us();
DQ = 0;
Delay500ms();
DQ = 1;
Delay5us();
}
// 向 DS18B20 写入一个字节的数据
void Write_DS18B20(unsigned char dat)
{
unsigned char i;
for (i = 0; i < 8; i++)
{
DQ = 0;
_nop_();
DQ = dat & 0x01;
dat >>= 1;
Delay5us();
DQ = 1;
}
}
// 从 DS18B20 读取一个字节的数据
unsigned char Read_DS18B20()
{
unsigned char i, dat = 0;
for (i = 0; i < 8; i++)
{
DQ = 0;
_nop_();
DQ = 1;
_nop_();
dat >>= 1;
if (DQ)
dat |= 0x80;
Delay5us();
}
return dat;
}
// 启动 DS18B20 温度转换
void Convert_DS18B20()
{
Start_DS18B20();
Write_DS18B20(0xcc);
Write_DS18B20(0x44);
}
// 读取 DS18B20 温度数据
unsigned int Read_Temp_DS18B20()
{
unsigned char lsb, msb;
unsigned int temp;
Start_DS18B20();
Write_DS18B20(0xcc);
Write_DS18B20(0xbe);
lsb = Read_DS18B20();
msb = Read_DS18B20();
temp = msb;
temp <<= 8;
temp |= lsb;
temp = temp * 0.625;
return temp;
}
// 延时 5us
void Delay5us()
{
unsigned char i;
for (i = 0; i < 1; i++)
{
_nop_();
}
}
// 延时 500ms
void Delay500ms()
{
unsigned char i, j;
for (i = 0; i < 250; i++)
for (j = 0; j < 200; j++);
}
// 延时 1s
void Delay1s()
{
unsigned char i, j;
for (i = 0; i < 100; i++)
for (j = 0; j < 200; j++);
}
// 启动 DS18B20
void Start_DS18B20()
{
DQ = 1;
Delay5us();
DQ = 0;
Delay5us();
DQ = 1;
Delay5us();
}
// 初始化 LCD 液晶屏
void Init_LCD()
{
Write_Command(0x38); // 初始化
Write_Command(0x0c); // 开启显示,光标不显示
Write_Command(0x06); // 光标右移
Write_Command(0x01); // 清屏
}
// 向 LCD 液晶屏写入命令
void Write_Command(unsigned char command)
{
RS = 0;
RW = 0;
P0 = command;
EN = 1;
Delay5us();
EN = 0;
}
// 向 LCD 液晶屏写入数据
void Write_Data(unsigned char dat)
{
RS = 1;
RW = 0;
P0 = dat;
EN = 1;
Delay5us();
EN = 0;
}
// 在 LCD 液晶屏上显示温度数据
void Display_Temp(unsigned int temp)
{
unsigned char dat[5];
sprintf(dat, "%d.%dC", temp / 10, temp % 10);
Write_Command(0x80); // 光标移到第一行第一列
while (*dat)
Write_Data(*dat++);
}
```
上述代码中,我们先通过 `Init_DS18B20()` 函数初始化 DS18B20 温度传感器的引脚,然后通过 `Init_LCD()` 函数初始化 LCD 液晶屏的引脚。在主函数中,我们通过循环不断读取 DS18B20 温度传感器的数据,然后将其显示在 LCD 液晶屏上。具体实现过程请参考代码注释。需要注意的是,本代码中使用的是 4 位数据总线的 LCD 液晶屏。如果您使用的是 8 位数据总线的 LCD 液晶屏,需要相应地修改代码。
阅读全文