51单片机DS18B20测温 lcd显示
时间: 2023-08-01 09:13:19 浏览: 111
好的,我可以为您提供一些关于51单片机和DS18B20测温以及LCD显示的基本知识和代码实现。
1. DS18B20测温原理
DS18B20是一款数字温度传感器,采用单总线接口进行通信,具有精度高、精度可调、线长可达100米等特点,常用于温度测量和控制领域。
DS18B20测温的原理是通过传感器内部的温度传感器将温度转换成数字信号,然后通过单总线接口将数字信号发送到单片机,单片机再将数字信号转化为实际温度值进行处理。
2. 51单片机和DS18B20测温的连接
DS18B20采用单总线接口进行通信,与51单片机的连接如下:
- DS18B20的VCC引脚连接到51单片机的5V电源
- DS18B20的GND引脚连接到51单片机的GND
- DS18B20的DQ引脚连接到51单片机的任意I/O口
需要注意的是,DS18B20的DQ引脚需要使用上拉电阻将其拉高。
3. 51单片机和LCD显示的连接
51单片机和LCD显示的连接如下:
- LCD的VSS引脚连接到51单片机的GND
- LCD的VDD引脚连接到51单片机的5V电源
- LCD的VEE引脚连接到51单片机的可调电位器
- LCD的RS引脚连接到51单片机的任意I/O口
- LCD的RW引脚连接到51单片机的任意I/O口
- LCD的E引脚连接到51单片机的任意I/O口
- LCD的D0-D7引脚连接到51单片机的任意I/O口
需要注意的是,LCD的VEE引脚需要通过可调电位器进行调节,以控制LCD显示的亮度。
4. 代码实现
下面是51单片机通过DS18B20测温并通过LCD显示温度值的代码实现:
```
#include <reg52.h>
#include <intrins.h>
#define LCD_DPORT P0
sbit LCD_RS = P1^0;
sbit LCD_RW = P1^1;
sbit LCD_E = P1^2;
sbit DQ = P3^7;
void delay(unsigned int i) //延时函数
{
while(i--);
}
void lcd_init() //LCD初始化函数
{
delay(1000);
lcd_cmd(0x38);
lcd_cmd(0x0c);
lcd_cmd(0x06);
lcd_cmd(0x01);
}
void lcd_cmd(unsigned char cmd) //LCD指令函数
{
LCD_RS = 0;
LCD_RW = 0;
LCD_DPORT = cmd;
delay(5);
LCD_E = 1;
_nop_();
_nop_();
LCD_E = 0;
delay(5);
}
void lcd_data(unsigned char dat) //LCD数据函数
{
LCD_RS = 1;
LCD_RW = 0;
LCD_DPORT = dat;
delay(5);
LCD_E = 1;
_nop_();
_nop_();
LCD_E = 0;
delay(5);
}
void lcd_string(unsigned char *str) //LCD字符串函数
{
while(*str != '\0')
{
lcd_data(*str);
str++;
}
}
void lcd_float(float f) //LCD浮点数函数
{
unsigned char str[16];
sprintf(str, "%f", f);
lcd_string(str);
}
unsigned char ds18b20_read() //DS18B20读取函数
{
unsigned char i;
unsigned char dat = 0;
for(i = 0; i < 8; i++)
{
DQ = 0;
_nop_();
_nop_();
dat >>= 1;
DQ = 1;
_nop_();
_nop_();
if(DQ == 1)
{
dat |= 0x80;
}
_nop_();
_nop_();
}
return dat;
}
void ds18b20_write(unsigned char dat) //DS18B20写入函数
{
unsigned char i;
for(i = 0; i < 8; i++)
{
DQ = 0;
_nop_();
_nop_();
if(dat & 0x01)
{
DQ = 1;
}
dat >>= 1;
_nop_();
_nop_();
DQ = 1;
_nop_();
_nop_();
}
}
void ds18b20_convert() //DS18B20转换函数
{
ds18b20_write(0xcc);
ds18b20_write(0x44);
}
void main() //主函数
{
unsigned char temp_l, temp_h;
int temp;
float ftemp;
lcd_init();
while(1)
{
ds18b20_convert();
delay(1000);
ds18b20_write(0xcc);
ds18b20_write(0xbe);
temp_l = ds18b20_read();
temp_h = ds18b20_read();
temp = temp_h;
temp <<= 8;
temp |= temp_l;
ftemp = (float)temp / 16.0;
lcd_cmd(0x01);
lcd_string("Temp: ");
lcd_float(ftemp);
lcd_string(" C");
delay(1000);
}
}
```
上述代码实现了通过DS18B20测温并通过LCD显示温度值。其中ds18b20_convert()函数用于触发DS18B20转换温度值,ds18b20_write()函数用于向DS18B20写入命令或数据,ds18b20_read()函数用于从DS18B20读取温度值。同时,lcd_float()函数可以将浮点数转化为字符串并在LCD上显示。
阅读全文