将其用 lcd1602 显示
时间: 2023-07-29 09:07:37 浏览: 80
要将DS18B20采集到的温度数据通过LCD1602显示出来,需要在上述代码中添加LCD1602的驱动程序。
下面是一个简单的示例代码,用于将DS18B20采集到的温度数据显示在LCD1602上:
```c
#include <reg52.h>
#include <intrins.h>
sbit DQ = P1^4; // DQ连接单片机的P1.4口
sbit RS = P0^0; // RS接LCD1602的RS口
sbit RW = P0^1; // RW接LCD1602的RW口
sbit EN = P0^2; // EN接LCD1602的E口
#define LCD1602_PORT P2 // LCD1602的数据口
unsigned int temp; // 保存温度数据的变量
void delay(unsigned int t) // 延时函数
{
while(t--);
}
void init_ds18b20() // 初始化DS18B20
{
DQ = 1; // 置高电平,准备发送复位脉冲
delay(500); // 延时500us
DQ = 0; // 发送复位脉冲
delay(80); // 延时80us
DQ = 1; // 释放总线
delay(500); // 等待DS18B20回应
}
void write_ds18b20(unsigned char dat) // 向DS18B20写入一个字节
{
unsigned char i;
for(i=0; i<8; i++)
{
DQ = 0; // 拉低总线
DQ = dat & 0x01; // 发送数据位
delay(5); // 等待时序
DQ = 1; // 恢复总线
dat >>= 1; // 准备发送下一位数据
}
}
unsigned char read_ds18b20() // 从DS18B20读取一个字节
{
unsigned char i, dat = 0;
for(i=0; i<8; i++)
{
DQ = 0; // 拉低总线
dat >>= 1; // 准备接收数据位
if(DQ) dat |= 0x80; // 如果总线为高电平,接收数据位为1
delay(5); // 等待时序
DQ = 1; // 恢复总线
}
return dat;
}
void get_temp() // 获取温度数据
{
init_ds18b20(); // 初始化DS18B20
write_ds18b20(0xcc); // 跳过ROM操作
write_ds18b20(0x44); // 启动温度转换
delay(100); // 等待转换完成
init_ds18b20(); // 再次初始化DS18B20
write_ds18b20(0xcc); // 跳过ROM操作
write_ds18b20(0xbe); // 发送读取温度命令
temp = read_ds18b20(); // 读取温度低字节
temp |= read_ds18b20() << 8; // 读取温度高字节
}
void lcd_write_cmd(unsigned char cmd) // 向LCD1602写入命令
{
LCD1602_PORT = cmd;
RS = 0; // RS置低,选择命令模式
RW = 0; // RW置低,选择写入模式
EN = 1; // E置高,使能LCD1602
_nop_(); // 稍作延时
EN = 0; // E置低,完成命令写入
delay(10); // 延时10us
}
void lcd_write_data(unsigned char dat) // 向LCD1602写入数据
{
LCD1602_PORT = dat;
RS = 1; // RS置高,选择数据模式
RW = 0; // RW置低,选择写入模式
EN = 1; // E置高,使能LCD1602
_nop_(); // 稍作延时
EN = 0; // E置低,完成数据写入
delay(10); // 延时10us
}
void lcd_init() // 初始化LCD1602
{
lcd_write_cmd(0x38); // 设置数据总线为8位,显示模式为2行×16列
lcd_write_cmd(0x0c); // 显示开,光标关闭
lcd_write_cmd(0x06); // 显示字符不移动,光标右移
lcd_write_cmd(0x01); // 清屏
}
void lcd_display_temp() // 在LCD1602上显示温度数据
{
unsigned char str[8];
lcd_write_cmd(0x80); // 设置光标位置为第一行第一列
sprintf(str, "Temp:%dC", temp); // 将温度数据格式化为字符串
while(*str) // 逐个字符写入LCD1602
{
lcd_write_data(*str++);
}
}
void main()
{
lcd_init(); // 初始化LCD1602
while(1)
{
get_temp(); // 获取温度数据
temp >>= 4; // 将温度数据右移4位,去掉小数部分
// 进行温度转换,具体公式见DS18B20的数据手册
temp = (temp * 625) / 100;
lcd_display_temp(); // 在LCD1602上显示温度数据
delay(1000); // 延时1秒
}
}
```
需要注意的是,以上代码仅供参考,实际使用时需要根据具体情况进行修改。同时,LCD1602的驱动程序也比较复杂,需要仔细阅读其数据手册并进行实验验证。
阅读全文