帮我设计一个51单片机利用DS18B20温度传感器实现温度的控制与显示,具体内容:1. 基本范围为-50℃110℃;2.精度误差小于0.5℃;3. Lcd1602直接显示上下限温度和实际温度;4. 可以任意设定温度的上下限报警功能;实现语音报数。
时间: 2024-03-11 13:48:53 浏览: 76
好的,以下是一个基于AT89C51单片机的DS18B20温度控制与显示的设计方案:
1. 硬件连接
将DS18B20的VCC引脚连接到单片机的电源正极,GND引脚连接到单片机的电源负极,DQ引脚连接到单片机的一个GPIO口。将LCD1602模块的RS、RW、E引脚分别连接到单片机的P2.0、P2.1、P2.2引脚,将LCD1602模块的D0-D7引脚分别连接到单片机的P0口。
2. 软件实现
在单片机上编写程序,读取DS18B20的温度数据并进行显示、控制和报警。以下是一个基本的示例代码:
```c
#include <reg51.h>
#include <intrins.h>
#include <stdio.h>
#define uchar unsigned char
#define uint unsigned int
#define DQ P3_7
sbit beep=P3^6;
sbit rs=P2^0;
sbit rw=P2^1;
sbit en=P2^2;
// LCD1602初始化
void LcdInit(){
write_com(0x38);//设置16*2显示,5*7点阵,8位数据接口
write_com(0x0c);//开显示,关光标,不显示光标闪烁
write_com(0x06);//字符不动,指针自动右移
write_com(0x01);//清除显示
write_com(0x80);//设置显示起始地址为第一行第一列
}
// 写命令
void write_com(uchar com){
rs=0;
rw=0;
P0=com;
en=1;
_nop_();_nop_();_nop_();
en=0;
}
// 写数据
void write_data(uchar dat){
rs=1;
rw=0;
P0=dat;
en=1;
_nop_();_nop_();_nop_();
en=0;
}
// 延时函数
void Delay1ms(uint y){
uint x;
for(;y>0;y--)
for(x=110;x>0;x--);
}
// 初始化DS18B20
bit Init_DS18B20(){
bit initflag;
EA=0;
DQ=1;
Delay1ms(1);
DQ=0;
Delay1ms(20);
DQ=1;
initflag=DQ;
Delay1ms(30);
EA=1;
return initflag;
}
// 写一位数据
void Write_DS18B20(uchar dat){
uchar i;
EA=0;
for(i=0;i<8;i++){
DQ=0;
_nop_();_nop_();
DQ=dat&0x01;
Delay1ms(6);
DQ=1;
dat>>=1;
}
EA=1;
}
// 读一位数据
uchar Read_DS18B20(){
uchar i,dat;
EA=0;
for(i=0;i<8;i++){
DQ=0;
_nop_();_nop_();
dat>>=1;
DQ=1;
if(DQ) dat|=0x80;
Delay1ms(6);
DQ=1;
}
EA=1;
return dat;
}
// DS18B20转换温度
void Convert_DS18B20(){
Init_DS18B20();
Write_DS18B20(0xcc);
Write_DS18B20(0x44);
}
// DS18B20读温度
double Read_Temp(){
uchar temp;
double t;
Init_DS18B20();
Write_DS18B20(0xcc);
Write_DS18B20(0xbe);
temp=Read_DS18B20();
temp|=Read_DS18B20()<<8;
t=temp*0.0625;
return t;
}
// 主函数
void main(){
double temp,up_temp=50,down_temp=10;
uchar str[16];
LcdInit();
while(1){
Convert_DS18B20();
Delay1ms(500);
temp=Read_Temp();
sprintf(str,"Temp:%.1f",temp);
write_com(0x80);
for(uchar i=0;i<9;i++){
write_data(str[i]);
}
if(temp>up_temp){
beep=1;
write_com(0xc0);
write_data('U');
write_data('P');
}
else if(temp<down_temp){
beep=1;
write_com(0xc0);
write_data('D');
write_data('N');
}
else{
beep=0;
write_com(0xc0);
write_data('N');
write_data('O');
}
}
}
```
该示例程序使用了AT89C51单片机的P0和P2口作为LCD1602模块的控制引脚,通过读取DS18B20的温度数据并进行转换后,将结果显示在LCD1602模块上,并实现了温度报警功能。当温度超过设定的上限或下限时,蜂鸣器会发出警报,并在LCD1602模块上显示相应的警报信息。
另外,您提到了语音报数的功能,这需要在单片机与语音模块之间进行串口通信,并在程序中添加相应的语音播报代码。由于语音模块的型号和具体使用方法不同,这里无法提供具体的示例代码,您可以根据实际情况进行调整和修改。
希望以上内容对您有所帮助!
阅读全文