基于51单片机+DS18B20温度测温器将温度在LCD1602显示代码
时间: 2023-10-29 12:59:57 浏览: 408
下面是基于51单片机和DS18B20温度传感器的温度测量和LCD1602显示的代码:
```c
#include <reg52.h>
#include <intrins.h>
#define DQ P2_0 // DS18B20数据线连接到单片机的P2.0口
#define LCD P0 // LCD1602数据线连接到单片机的P0口
sbit rs = P3^5; // LCD1602的RS引脚连接到单片机的P3.5口
sbit rw = P3^6; // LCD1602的RW引脚连接到单片机的P3.6口
sbit en = P3^7; // LCD1602的EN引脚连接到单片机的P3.7口
typedef unsigned char uchar;
typedef unsigned int uint;
uchar code table[] = "Temperature:"; // 温度显示的字符串
void delay(uint x) // 短暂延时函数
{
uint i, j;
for (i = x; i > 0; i--)
for (j = 110; j > 0; j--);
}
void init_ds18b20() // 初始化DS18B20
{
uchar i;
DQ = 1;
delay(1);
DQ = 0;
delay(80);
DQ = 1;
delay(20);
i = DQ;
delay(20);
}
void write_ds18b20(uchar dat) // 向DS18B20写入一个字节的数据
{
uchar i;
for (i = 0; i < 8; i++) {
DQ = 0;
_nop_();
DQ = dat & 0x01;
delay(6);
DQ = 1;
dat >>= 1;
}
}
uchar read_ds18b20() // 从DS18B20读取一个字节的数据
{
uchar i, dat = 0;
for (i = 0; i < 8; i++) {
dat >>= 1;
DQ = 0;
_nop_();
DQ = 1;
delay(1);
if (DQ) dat |= 0x80;
delay(6);
}
return dat;
}
int get_temperature() // 获取温度数据
{
uchar i;
int temp = 0;
init_ds18b20();
write_ds18b20(0xcc); // 跳过ROM操作
write_ds18b20(0x44); // 启动温度转换
delay(100);
init_ds18b20();
write_ds18b20(0xcc);
write_ds18b20(0xbe); // 读取温度数据
temp |= read_ds18b20();
temp |= (read_ds18b20() << 8);
return temp;
}
void write_lcd1602(uchar dat, uchar cmd) // 向LCD1602写入一个字节的数据或指令
{
rw = 0;
LCD = cmd;
rs = 0;
en = 1;
_nop_();
en = 0;
delay(5);
rs = 1;
LCD = dat;
en = 1;
_nop_();
en = 0;
delay(5);
}
void init_lcd1602() // 初始化LCD1602
{
write_lcd1602(0x38, 0);
write_lcd1602(0x0c, 0);
write_lcd1602(0x06, 0);
write_lcd1602(0x01, 0);
}
void main()
{
int temp;
uchar i;
init_lcd1602();
while (1) {
temp = get_temperature();
write_lcd1602(0x80, 0); // 设置光标位置为第一行第一列
for (i = 0; i < 12; i++) // 显示温度字符串
write_lcd1602(table[i], 1);
write_lcd1602((temp >> 8) + '0', 1); // 显示温度的高八位
write_lcd1602((temp & 0xff) / 10 + '0', 1); // 显示温度的低八位的十位
write_lcd1602((temp & 0xff) % 10 + '0', 1); // 显示温度的低八位的个位
delay(500); // 延时一段时间再进行下一次温度测量和显示
}
}
```
这段代码通过DS18B20温度传感器获取温度数据,然后通过LCD1602显示器显示温度数据。在主函数中,我们不断循环获取温度数据并进行显示。需要注意的是,DS18B20的数据线连接到单片机的P2.0口,而LCD1602的数据线连接到单片机的P0口。在代码中使用了一些简单的函数来实现DS18B20的读写和LCD1602的初始化和写入数据。
阅读全文