11.05926MHz的51单片机和DS18B20和LCD1602和三个按键,实现功能为显示采集的温度,显示温度格式为WD:采集的温度保留小数点后两位并带有摄氏度单位,一个按键设置报警温度值的设定,在按一下完成设置,一个按键对报警温度值设定加调整,一个按键对设定报警温度值减调整
时间: 2024-01-24 15:17:17 浏览: 53
以下是基于51单片机的代码实现,需要注意的是,由于不知道具体硬件连接,代码中的引脚定义需要根据实际情况进行修改。
```c
#include <reg51.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define uchar unsigned char
#define uint unsigned int
sbit DQ = P1^0;
sbit RS = P2^0;
sbit RW = P2^1;
sbit EN = P2^2;
sbit KEY1 = P3^0;
sbit KEY2 = P3^1;
sbit KEY3 = P3^2;
void Init_DS18B20();
uchar Read_DS18B20();
void Write_DS18B20(uchar dat);
void Display_Temperature(float t);
void Display_Alarm_Temperature(float t);
uchar Get_Key();
void Delay(uint t);
void main()
{
float temperature = 0.0;
float alarm_temperature = 25.0;
uchar key = 0;
uchar display_alarm_temperature_flag = 0;
Init_DS18B20();
while (1)
{
temperature = Read_DS18B20();
Display_Temperature(temperature);
key = Get_Key();
if (key == 1)
{
display_alarm_temperature_flag = 1;
while (Get_Key() == 1);
while (display_alarm_temperature_flag)
{
Display_Alarm_Temperature(alarm_temperature);
key = Get_Key();
if (key == 1)
{
display_alarm_temperature_flag = 0;
while (Get_Key() == 1);
}
else if (key == 2)
{
alarm_temperature += 0.1;
while (Get_Key() == 2);
}
else if (key == 3)
{
alarm_temperature -= 0.1;
while (Get_Key() == 3);
}
}
}
if (temperature > alarm_temperature)
{
// 报警处理
}
Delay(1000);
}
}
void Init_DS18B20()
{
uchar i;
DQ = 1;
Delay(5);
DQ = 0;
Delay(500);
DQ = 1;
Delay(70);
Write_DS18B20(0xCC); // 跳过ROM指令
Write_DS18B20(0x44); // 温度转换指令
}
uchar Read_DS18B20()
{
uchar i, j;
uchar ds18b20_data[9];
float temperature;
uchar negative_flag = 0;
Write_DS18B20(0xCC); // 跳过ROM指令
Write_DS18B20(0xBE); // 读取指令
for (i = 0; i < 9; i++)
{
ds18b20_data[i] = Read_DS18B20();
}
temperature = ds18b20_data[1] << 8 | ds18b20_data[0];
if (temperature & 0x8000) // 判断温度是否为负
{
temperature = ~temperature + 1;
negative_flag = 1;
}
temperature = temperature * 0.0625;
if (negative_flag)
{
temperature = -temperature;
}
return temperature;
}
void Write_DS18B20(uchar dat)
{
uchar i;
for (i = 0; i < 8; i++)
{
DQ = 0;
DQ = dat & 0x01;
Delay(5);
DQ = 1;
dat >>= 1;
}
}
uchar Read_DS18B20()
{
uchar i;
uchar dat = 0;
for (i = 0; i < 8; i++)
{
DQ = 0;
DQ = 1;
Delay(2);
dat |= DQ << i;
Delay(5);
}
return dat;
}
void Display_Temperature(float t)
{
uchar temperature_string[16];
sprintf(temperature_string, "WD:%.2fC", t);
// 在LCD1602上显示温度
}
void Display_Alarm_Temperature(float t)
{
uchar temperature_string[16];
sprintf(temperature_string, "ALARM:%.2fC", t);
// 在LCD1602上显示报警温度
}
uchar Get_Key()
{
if (KEY1 == 0)
{
return 1;
}
else if (KEY2 == 0)
{
return 2;
}
else if (KEY3 == 0)
{
return 3;
}
else
{
return 0;
}
}
void Delay(uint t)
{
uint i, j;
for (i = 0; i < t; i++)
{
for (j = 0; j < 120; j++);
}
}
```
需要注意的是,代码中的温度转换及计算部分是根据DS18B20的数据手册进行编写,可能需要根据具体型号进行修改。同时,LCD1602的显示部分需要根据具体连接方式进行修改。
阅读全文