11.0592MHz的51单片机和DS18B20和ADC1602,实现温度采集显示,显示格式为WD:温度值带摄氏度单位,以初学者身份编写代码并详细注释
时间: 2023-12-20 15:06:33 浏览: 64
基于DS18B20与51单片机实现温度检测
以下是基于51单片机、DS18B20和ADC1602的温度采集显示代码,其中包括详细的注释:
```C
#include <reg52.h> // 51单片机头文件
#include <stdio.h> // 标准输入输出库
sbit DSPORT = P3^7; // DS18B20数据线连接的IO口
sbit RS = P0^0; // LCD1602的RS引脚连接的IO口
sbit RW = P0^1; // LCD1602的RW引脚连接的IO口
sbit EN = P0^2; // LCD1602的EN引脚连接的IO口
// 声明函数
void Init_DS18B20();
void Write_DS18B20(unsigned char dat);
unsigned char Read_DS18B20();
void Convert_DS18B20();
int Get_DS18B20();
void Init_ADC1602();
void Write_Command(unsigned char cmd);
void Write_Data(unsigned char dat);
void Display_Temperature(int temperature);
void Delay_us(unsigned int i); // 延时函数
void main()
{
int temperature; // 存储温度值
Init_DS18B20(); // 初始化DS18B20
Init_ADC1602(); // 初始化LCD1602
while(1)
{
Convert_DS18B20(); // 转换温度值
temperature = Get_DS18B20(); // 获取温度值
Display_Temperature(temperature); // 显示温度值
}
}
// 初始化DS18B20
void Init_DS18B20()
{
unsigned char i;
DSPORT = 1; // 先将总线拉高
Delay_us(1);
DSPORT = 0; // 拉低总线,开始通信
Delay_us(500); // 延时500us
DSPORT = 1; // 恢复总线
Delay_us(60); // 等待DS18B20发出响应信号
i = Read_DS18B20(); // 读取DS18B20的响应信号
Delay_us(60); // 等待DS18B20完成复位操作
}
// 向DS18B20写入数据
void Write_DS18B20(unsigned char dat)
{
unsigned char i;
for(i = 0; i < 8; i++)
{
DSPORT = 0; // 拉低总线
Delay_us(1); // 等待一段时间
DSPORT = dat & 0x01; // 将数据写入总线
dat >>= 1; // 右移一位
Delay_us(60); // 等待DS18B20读取数据
DSPORT = 1; // 恢复总线
}
}
// 从DS18B20读取数据
unsigned char Read_DS18B20()
{
unsigned char i, dat = 0;
for(i = 0; i < 8; i++)
{
DSPORT = 0; // 拉低总线
Delay_us(1); // 等待一段时间
DSPORT = 1; // 恢复总线
Delay_us(1); // 等待一段时间
dat |= DSPORT << i; // 读取总线上的数据
Delay_us(60); // 等待DS18B20发送下一个数据位
}
return dat;
}
// 转换温度值
void Convert_DS18B20()
{
Write_DS18B20(0xcc); // 跳过ROM操作
Write_DS18B20(0x44); // 启动温度转换
}
// 获取温度值
int Get_DS18B20()
{
unsigned char tl, th;
int temperature;
Write_DS18B20(0xcc); // 跳过ROM操作
Write_DS18B20(0xbe); // 发送读取指令
tl = Read_DS18B20(); // 读取温度值的低8位
th = Read_DS18B20(); // 读取温度值的高8位
temperature = th;
temperature <<= 8;
temperature |= tl; // 合并温度值
return temperature;
}
// 初始化LCD1602
void Init_ADC1602()
{
Write_Command(0x38); // 设置16*2显示,5*7点阵,8位数据接口
Write_Command(0x0c); // 关闭光标显示
Write_Command(0x06); // 光标右移,字符不移动
Write_Command(0x01); // 清屏
}
// 向LCD1602发送命令
void Write_Command(unsigned char cmd)
{
RS = 0; // RS引脚为低电平,表示写入命令
RW = 0; // RW引脚为低电平,表示写入操作
EN = 0; // 先将EN引脚设置为低电平
P2 = cmd; // 将命令写入P2口
Delay_us(5); // 等待一段时间
EN = 1; // 将EN引脚设置为高电平
Delay_us(5); // 等待一段时间
EN = 0; // 将EN引脚设置为低电平
}
// 向LCD1602发送数据
void Write_Data(unsigned char dat)
{
RS = 1; // RS引脚为高电平,表示写入数据
RW = 0; // RW引脚为低电平,表示写入操作
EN = 0; // 先将EN引脚设置为低电平
P2 = dat; // 将数据写入P2口
Delay_us(5); // 等待一段时间
EN = 1; // 将EN引脚设置为高电平
Delay_us(5); // 等待一段时间
EN = 0; // 将EN引脚设置为低电平
}
// 显示温度值
void Display_Temperature(int temperature)
{
char str[16]; // 存储温度值字符串
sprintf(str, "WD:%dC", temperature); // 将温度值转换为字符串
Write_Command(0x80); // 光标移动到第一行第一个位置
for(int i = 0; i < 8; i++)
{
Write_Data(str[i]); // 将字符串写入LCD1602
}
}
// 延时函数,延时us微秒
void Delay_us(unsigned int i)
{
while(i--);
}
```
以上代码实现了温度采集和显示功能,其中主要的功能函数包括:
- Init_DS18B20:初始化DS18B20传感器,包括发送复位信号和读取响应信号;
- Write_DS18B20:向DS18B20传感器写入数据;
- Read_DS18B20:从DS18B20传感器读取数据;
- Convert_DS18B20:启动DS18B20传感器进行温度转换;
- Get_DS18B20:读取DS18B20传感器转换后的温度值;
- Init_ADC1602:初始化LCD1602液晶屏,包括设置显示格式、关闭光标显示、光标右移、清屏等操作;
- Write_Command:向LCD1602发送命令;
- Write_Data:向LCD1602发送数据;
- Display_Temperature:将温度值转换为字符串并在LCD1602上显示;
- Delay_us:延时函数,用于提供一定的延时。
需要注意的是,DS18B20传感器的数据线需要连接到单片机的一个IO口,而LCD1602液晶屏需要连接到单片机的P2口。在编写代码时,需要根据实际情况修改这些引脚的定义。
阅读全文