ds18b20温度传感器51代码在液晶显示屏显示
时间: 2023-10-31 08:04:35 浏览: 45
好的,这个问题我可以回答。以下是一个简单的51单片机程序,使用DS18B20温度传感器读取温度并在液晶显示屏上显示:
```c
#include <reg52.h>
#define LCD_RS P1_0
#define LCD_RW P1_1
#define LCD_E P1_2
#define LCD_DATA P2
sbit DS18B20 = P3^7;
void delay(unsigned int t);
unsigned char ds18b20_read_byte(void);
void ds18b20_write_byte(unsigned char dat);
void ds18b20_init(void);
void ds18b20_start(void);
void ds18b20_write(unsigned char dat);
unsigned char ds18b20_read(void);
void lcd_init(void);
void lcd_cmd(unsigned char dat);
void lcd_show(unsigned char dat);
void main()
{
unsigned char high, low;
float temp;
lcd_init();
ds18b20_init();
while(1)
{
ds18b20_start();
ds18b20_write(0xcc);
ds18b20_write(0x44);
delay(1000);
ds18b20_start();
ds18b20_write(0xcc);
ds18b20_write(0xbe);
low = ds18b20_read_byte();
high = ds18b20_read_byte();
temp = (float)((high << 8) | low) * 0.0625;
lcd_show((unsigned char)temp);
lcd_show('.');
lcd_show((unsigned char)(temp * 10) % 10);
delay(1000);
}
}
void delay(unsigned int t)
{
unsigned int i, j;
for(i=0; i<t; i++)
for(j=0; j<114; j++);
}
unsigned char ds18b20_read_byte(void)
{
unsigned char i, dat = 0;
for(i=0; i<8; i++)
{
dat >>= 1;
if(ds18b20_read())
dat |= 0x80;
}
return dat;
}
void ds18b20_write_byte(unsigned char dat)
{
unsigned char i;
for(i=0; i<8; i++)
{
ds18b20_write(dat & 0x01);
dat >>= 1;
}
}
void ds18b20_init(void)
{
DS18B20 = 1;
delay(2);
DS18B20 = 0;
delay(80);
DS18B20 = 1;
delay(10);
}
void ds18b20_start(void)
{
DS18B20 = 0;
delay(2);
DS18B20 = 1;
delay(10);
}
void ds18b20_write(unsigned char dat)
{
unsigned char i;
DS18B20 = 0;
for(i=0; i<8; i++)
{
DS18B20 = dat & 0x01;
delay(2);
DS18B20 = 1;
dat >>= 1;
}
}
unsigned char ds18b20_read(void)
{
unsigned char dat;
DS18B20 = 0;
delay(2);
DS18B20 = 1;
delay(2);
dat = DS18B20;
delay(60);
return dat;
}
void lcd_init(void)
{
lcd_cmd(0x38);
lcd_cmd(0x0c);
lcd_cmd(0x06);
lcd_cmd(0x01);
}
void lcd_cmd(unsigned char dat)
{
LCD_RS = 0;
LCD_RW = 0;
LCD_E = 0;
LCD_DATA = dat;
delay(1);
LCD_E = 1;
delay(1);
LCD_E = 0;
}
void lcd_show(unsigned char dat)
{
LCD_RS = 1;
LCD_RW = 0;
LCD_E = 0;
LCD_DATA = dat;
delay(1);
LCD_E = 1;
delay(1);
LCD_E = 0;
}
```
这个程序使用了一个LCD1602液晶显示屏,将温度显示在屏幕上。首先定义了LCD_RS、LCD_RW、LCD_E和LCD_DATA这四个宏,分别代表LCD的寄存器选择、读写选择、使能和数据口。然后定义了一个DS18B20的引脚,用来连接温度传感器。
在程序的主函数中,初始化LCD和DS18B20传感器,然后进入一个循环中。在循环中,先向DS18B20发送开始转换温度的命令,然后等待一段时间。接着再向DS18B20发送读取温度的命令,并读取高位和低位的数据。最后将读取到的数据转换为温度并显示在LCD上。
需要注意的是,这个程序中没有实现DS18B20的CRC校验,如果需要更加精确的温度测量,需要在程序中增加CRC校验的代码。