基于51单片机的ds18b20测量温度并用lcd1602显示
时间: 2023-09-02 09:07:02 浏览: 94
以下是基于51单片机的ds18b20测量温度并用lcd1602显示的代码:
```
#include <reg51.h>
#include <intrins.h>
#define LCD_DB P2 // LCD数据口定义
sbit LCD_RS = P3^5; // LCD命令端口定义
sbit LCD_RW = P3^6;
sbit LCD_E = P3^4;
sbit DQ = P1^0; // DS18B20数据线定义
// 函数声明
void delay(int i);
void InitLcd(); // 初始化LCD
void WriteCmdLcd(int cmd); // 写LCD命令
void WriteDataLcd(int dat); // 写LCD数据
void WriteLcdString(char *s); // 写字符串
void WriteLcdChar(char dat); // 写字符
unsigned char ReadByte(void); // 读一个字节
void WriteByte(unsigned char dat); // 写一个字节
void DelayUs2x(unsigned char t); // 延时函数
void main()
{
unsigned char temp_low, temp_high, temp_value;
int temp_decimal, temp_integer;
char buffer[16];
InitLcd(); // 初始化LCD
while(1)
{
WriteCmdLcd(0x01); // 清屏
WriteLcdString("Temp: "); // 写字符串
WriteByte(0xCC); // 跳过ROM操作
WriteByte(0x44); // 启动温度转换
DelayUs2x(200); // 延时
WriteByte(0xCC); // 跳过ROM操作
WriteByte(0xBE); // 读取温度
temp_low = ReadByte(); // 读低8位温度
temp_high = ReadByte(); // 读高8位温度
temp_value = temp_high << 4; // 将高8位左移4位,腾出4位存放低4位
temp_value |= (temp_low >> 4); // 将低8位右移4位,将高4位放入temp_value的低4位
// 计算温度整数和小数
temp_integer = temp_value >> 1; // 温度整数
if(temp_value & 0x01) // 如果temp_value的最低位为1,说明温度有0.5度
temp_decimal = 5; // 温度小数为0.5度
else
temp_decimal = 0; // 温度小数为0度
// 将温度整数和小数转换为字符串
sprintf(buffer, "%d.%d", temp_integer, temp_decimal);
WriteLcdString(buffer); // 写温度整数和小数
DelayUs2x(200); // 延时
}
}
// 初始化LCD
void InitLcd()
{
WriteCmdLcd(0x38); // 显示模式设置:16×2显示,5×7点阵,8位数据接口
WriteCmdLcd(0x0c); // 显示开关控制:显示开,光标关,光标闪烁关
WriteCmdLcd(0x06); // 光标/显示移动设置:光标右移,字符不移动
WriteCmdLcd(0x01); // 显示清屏
}
// 写LCD命令
void WriteCmdLcd(int cmd)
{
LCD_RS = 0; // RS=0,写命令
LCD_RW = 0; // RW=0,写入模式
LCD_E = 0; // 使能清零
LCD_DB = cmd; // 写命令
DelayUs2x(1); // 延时
LCD_E = 1; // 使能置1
DelayUs2x(5); // 延时
LCD_E = 0; // 使能清零
}
// 写LCD数据
void WriteDataLcd(int dat)
{
LCD_RS = 1; // RS=1,写数据
LCD_RW = 0; // RW=0,写入模式
LCD_E = 0; // 使能清零
LCD_DB = dat; // 写数据
DelayUs2x(1); // 延时
LCD_E = 1; // 使能置1
DelayUs2x(5); // 延时
LCD_E = 0; // 使能清零
}
// 写字符串
void WriteLcdString(char *s)
{
while(*s)
WriteDataLcd(*s++);
}
// 写字符
void WriteLcdChar(char dat)
{
WriteDataLcd(dat);
}
// 读一个字节
unsigned char ReadByte(void)
{
unsigned char dat, i;
for(i=8; i>0; i--)
{
DQ = 0; // 发出读时序
dat >>= 1; // 读入数据
DQ = 1;
if(DQ) // 判断数据位
dat |= 0x80;
DelayUs2x(1); // 延时
}
return dat;
}
// 写一个字节
void WriteByte(unsigned char dat)
{
unsigned char i;
for(i=8; i>0; i--)
{
DQ = 0; // 发出写时序
DQ = dat & 0x01; // 写入数据
_nop_(); // 等待时序完成
DQ = 1;
dat >>= 1; // 右移一位
}
}
// 延时函数
void DelayUs2x(unsigned char t)
{
while(--t);
}
void delay(int i)
{
int j,k;
for(j=0; j<i; j++)
for(k=0; k<110; k++);
}
```
在这个程序中,我们首先对LCD进行初始化,然后循环读取DS18B20的温度,并将温度值显示在LCD上。在读取温度的过程中,我们需要向DS18B20发送一系列指令,并读取返回的温度值。最后,我们将温度值转换为字符串,并将其显示在LCD上。
阅读全文