51单片机实现温湿度传感器实时监控并LCD显示的解决方案
简介:
51单片机STC89C52RC是本方案的选用芯片,以其8位处理和极低的价格来看,是很适合进行本次实验。LCD显示屏本次选用的型号是1602A。
在实现51单片机实现温湿度传感器实时监控并LCD显示的基础功能后,还可以通过单片机的串口通信和WIFI模块或者Zigbee模块进行物联网连接,使设备连接互联网,再通过TCP连接进行物联网的一整套方案,包括手机APP实时监控数据,也可以是手机APP远程开启风扇来调节温度或者湿度,但这些不在本次方案中细说,本人已经实现上述功能,只是技术不完善,所以不在此公布。
Protues8仿真图:
51单片机完整程序(代码很长,但是完整,可以直接复制使用):
//****************************************************************//
//
//
//
//
//
//****************************************************************//
#include <reg52.h>
#include <intrins.h>
#include <lcd.c>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
//
typedef unsigned char U8; /* defined for unsigned 8-bits integer variable 无符号8位整型变量 */
typedef signed char S8; /* defined for signed 8-bits integer variable 有符号8位整型变量 */
typedef unsigned int U16; /* defined for unsigned 16-bits integer variable 无符号16位整型变量 */
typedef signed int S16; /* defined for signed 16-bits integer variable 有符号16位整型变量 */
typedef unsigned long U32; /* defined for unsigned 32-bits integer variable 无符号32位整型变量 */
typedef signed long S32; /* defined for signed 32-bits integer variable 有符号32位整型变量 */
typedef float F32; /* single precision floating point variable (32bits) 单精度浮点数(32位长度) */
typedef double F64; /* double precision floating point variable (64bits) 双精度浮点数(64位长度) */
//
#define uchar unsigned char
#define uint unsigned int
#define Data_0_time 4
//----------------------------------------------//
//----------------IO口定义区--------------------//
//----------------------------------------------//
sbit P2_0 = P2^0 ;
//----------------------------------------------//
//----------------定义区--------------------//
//----------------------------------------------//
U8 U8FLAG,k;
U8 U8count,U8temp;
U8 U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata;
U8 U8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_temp;
U8 U8comdata;
U8 outdata[5]; //定义发送的字节数
U8 indata[5];
U8 count, count_r=0;
U8 str[5]={"RS232"};
U16 U16temp1,U16temp2;
U8 a[]={"Temperature: "};
U8 b[]={"Humidity: "};
U8 wd_sw,wd_gw,sd_sw,sd_gw;
void Delay(U16 j)
{
U8 i;
for(;j>0;j--)
{
for(i=0;i<27;i++);
}
}
void Delay_10us(void)
{
U8 i;
i--;
i--;
i--;
i--;
i--;
i--;
}
void COM(void)
{
U8 i;
for(i=0;i<8;i++)
{
U8FLAG=2;
while((!P2_0)&&U8FLAG++);
Delay_10us();
Delay_10us();
Delay_10us();
U8temp=0;
if(P2_0)U8temp=1;
U8FLAG=2;
while((P2_0)&&U8FLAG++);
//超时则跳出for循环
if(U8FLAG==1)break;
//判断数据位是0还是1
// 如果高电平高过预定0高电平值则数据位为 1
U8comdata<<=1;
U8comdata|=U8temp; //0
}//rof
}
//--------------------------------
//-----湿度读取子程序 ------------
//--------------------------------
//----以下变量均为全局变量--------
//----温度高8位== U8T_data_H------
//----温度低8位== U8T_data_L------
//----湿度高8位== U8RH_data_H-----
//----湿度低8位== U8RH_data_L-----
//----校验 8位 == U8checkdata-----
//----调用相关子程序如下----------
//---- Delay();, Delay_10us();,COM();
//--------------------------------
void RH(void)
{
//主机拉低18ms
P2_0=0;
Delay(180);
P2_0=1;
//总线由上拉电阻拉高 主机延时20us
Delay_10us();
Delay_10us();
Delay_10us();
Delay_10us();
//主机设为输入 判断从机响应信号
P2_0=1;
//判断从机是否有低电平响应信号 如不响应则跳出,响应则向下运行
if(!P2_0) //T !
{
U8FLAG=2;
//判断从机是否发出 80us 的低电平响应信号是否结束
while((!P2_0)&&U8FLAG++);
U8FLAG=2;
//判断从机是否发出 80us 的高电平,如发出则进入数据接收状态
while((P2_0)&&U8FLAG++);
//数据接收状态
COM();
U8RH_data_H_temp=U8comdata;
COM();
U8RH_data_L_temp=U8comdata;
COM();
U8T_data_H_temp=U8comdata;
COM();
U8T_data_L_temp=U8comdata;
COM();
U8checkdata_temp=U8comdata;
P2_0=1;
//数据校验
U8temp=(U8T_data_H_temp+U8T_data_L_temp+U8RH_data_H_temp+U8RH_data_L_temp);
if(U8temp==U8checkdata_temp)
{
U8RH_data_H=U8RH_data_H_temp;
U8RH_data_L=U8RH_data_L_temp;
U8T_data_H=U8T_data_H_temp;
U8T_data_L=U8T_data_L_temp;
U8checkdata=U8checkdata_temp;
}//fi
}//fi
}
void main()
{
U8 i,j;
LcdInit();
Delay(1); //延时100US(12M晶振)
while(1)
{
RH();//调用温湿度读取子程序
str[0]=U8T_data_H;
str[1]=U8T_data_L;
str[2]=U8RH_data_H;
str[3]=U8RH_data_L;
str[4]=U8checkdata;
wd_sw=U8T_data_H/10%10+0x30;
wd_gw=U8T_data_H%10+0x30;
sd_sw=U8RH_data_H/10%10+0x30;
sd_gw=U8RH_data_H%10+0x30;
a[12]=wd_sw;
a[13]=wd_gw;
a[14]=0xdf;
a[15]='C';
a[16]='\0';
LcdWriteCom(0x00+0x80);
for(i=0;i<16;i++)
{
LcdWriteData(a[i]);
}
b[9]=sd_sw;
b[10]=sd_gw;
b[11]='\%';
b[12]='\0';
LcdWriteCom(0x42+0x80);
for(i=0;i<12;i++)
{
LcdWriteData(b[i]);
}
//读取模块数据周期不易小于 2S
Delay(30000);
}
}
一款基于单片机的智能温度预警系统
随着社会的发展特别是工业的发展,人民生活的改善,安全问题变得更加重要。目前,在许多情况下,都需要对环境的温度进行限定,其中包括人的生活工作环境、仪器设备的工作环境以及动植物的生长环境等。
如果环境温度超过或低于限定值,必定对所处环境的人和设备造成影响,甚至给个人和社会造成巨大的损失。随着单片机技术的飞速发展,利用单片机设计温控系统成为控制技术发展的需要。本文提出了一种基于单片机的温度预警系统的设计方案,并采用PROTEUS进行了仿真。该系统不仅可以高精度的测量温度,同时对温度进行实时监控并做到超温报警,有较高的实用价值。
2.系统设计的总体方案
本设计方案总体框图如图1所示,它是由单片机、四路数据采集模块、集成功放模块、人机交互界面和系统电源等组成。
本设计系统以AT89C52单片机作为控制核心,数据采集部分由温度传感器DS18B20组成;人机交互界面为4×4矩阵键盘输入和LCD1602液晶显示,可以方便的输入数据和直观的显示。系统电源为+5V电源供电。软件部分采用C语言进行编程,实现了该设计的全部控制功能。该温度预警系统的测量范围为-55℃~+125℃。当检测的温度高于最高或最低温度设定值时,实现报警功能。
3.电路设计
3.1 单片机
AT89S52单片机是ATMEL公司推出的高档型AT89S系列单片机中的增强型产品。AT89S52是一个低功耗、高性能CMOS8为单片机,片内含8K Bytes ISP的可反复擦写1000次的Flash只读程序存储器。期间采用ATMEL公司的高密度、非易失性存储技术制造,兼容标准MCS-51指令系统及80C51引脚结构。芯片内集成了通用8位中央处理器和ISP Flash存储单元,功能强大的微型计算机的AT89S52可为许多嵌入式控制应用系统提供高性价比的解决方案。
3.2 温度采集电路
由单片机获取非电信号的温度信息,必须通过温度传感器。传统的温度测量多以热敏电阻作为温度传感器,但是,热敏电路可靠性较差,测量温度精度低,因此使用DS18B20温度传感器采集温度。DS18B20是美国达拉斯(Dallas)公司的单数字温度传感器芯片,DS18B20具有体积小,功耗低,抗干扰能力强,易于微处理器连接等特点,其测量范围-55℃~+125℃,最大分辨率为0.0625℃,在-25℃~+85℃范围内其测温标准度为±0.5℃。
DS18B20只有三个引脚,一个接地,一个接电源,一个数字输入/输出引脚,由于DS18B20采用单总线结构,本系统的四个温度传感器并联在三线上,数据输入/输出接单片机的P1.7口,电源与数字输入输出脚间需要接一个4.7K的电阻,实现多点组网功能。
3.3 报警电路设计
本系统报警电路使用L M 3 8 6作为报警器的功率放大器。LM386是一种音频集成功放,具有自身功耗低、电压增益可调整、电源电压范围大、外接元件少和总谐波失真小等优点,广泛应用于录音机和收音机之中。
LM386的输入端接单片机的P3.4引脚,输出端接扬声器,电路图如图2所示。当实际温度超过或低于设置的温度值时,单片机相应引脚输出一定频率的信号,信号经过音频功放放大之后,发出报警声。
3.4 显示接口电路设计
系统采用液晶显示模块来显示4路温度采集值及温度设定值。本系统采用LCD12864液晶显示模块。LCD12864是一种具有4位/ 8位并行、2线或三线串行多接口方式,内部含有国际一级、二级简体中文字库的点阵图形液晶显示模块,其显示分辨率为128×64,可以显示8×4行16×16点阵的汉字。同时又具有低电压低功耗等特点。
在本系统,LCD12864的3个控制端RS(数据/命令选择端)、R/W(读/写选择端)、E(使能信号)分别连接单片机的P 3 . 7、P3.0、P3.3,用来对LCD12864进行控制;LCD12864的8个数据端连接单片机的P0口,用来向LCD12864写入数据。液晶的第3引脚为液晶显示偏压信号,用来调节显示的对比度;第1、2引脚为液晶的电源接口;第19、20引脚是显示器背光灯的电源接口。
3.5 键盘接口电路设计
键盘在单片机应用系统中能够实现向单片机输入数据、传送命令等功能,是人干预单片机的主要手段。本系统采用了4×4矩阵键盘实现对温度值和功能键的设定。四条行线接单片机P2口的高4位,四条列线接单片机P2口的低4位。初始化时键盘行线为高电平,列线为低电平。键盘的行线接4输入与门,4输入与门的输出接单片机的外部中断0引脚P3.2口。当有键按下时,将产生中断,在中断程序里对按键进行扫描,得到按键的键值。
3.6 电源电路的设计
电源是整个系统的能量来源,它直接关系到系统能否运行。在本系统中单片机、液晶显示、报警等电路需要5V的电源,因此电路中选用稳压芯片7805,其最大输出电流为1.5A,能够满足系统的要求。
4.软件设计
主程序先对系统资源进行初始化,调用LCD显示子程序,然后进入键盘设置界面。
当设置键按下后,开始设置各点的温度,如果确认键按下,则系统开始工作。首先调用DS18B20初始化子程序,再发送ROM命令,读取DS18B20转换的温度值。当读取的温度大于设置的温度值时,报警器开始报警,LCD显示温度的实际值、设置值、路数、状态。
接下来对第二、三、四路温度进行采集,处理,显示。
5.系统PROTEUS仿真
Proteus 软件是来自用过LabcenterElectronics公司,基于SPICEF5 仿真引擎的很合电路仿真软件,是一款含有大量的系统资源、丰富的硬件接口电路,具有强大的调试功能和软硬件相结合的仿真系统。它很好地解决了硬件设计和软件调试的问题,不仅能够仿真模拟、数字电路以及模数混合电路,还能够仿真基于单片机的电子系统。本系统PROTEUS仿真图如图3所示。
6.结论
本方案以AT89C52为控制核心,DS18B20采集温度、LCD12864显示温度和LM3386驱动报警等设计了一款智能温度预报警系统,并通过PROTEUS仿真,得到了很好的效果,证实了本系统具有结构简单、功耗低、智能调节等优点。本系统可以应用于粮仓、工厂、浴室等场合,具有很强的实用价值。
相关问答
protues7.8 单片机温度 检测?Proteus7.8单片机温度检测是基于51单片机的温度监控仿真设计,程序编译器为keil4/5,编程语言为C语言。该设计主要功能有:显示温度0-99,上电默认高温报警35...
单片机温度 传感器作用?温度传感器的作用:用物质各种物理性质随温度变化的规律把温度转换为电量。温度传感器是温度测量仪表的核心部分,品种繁多。按测量方式可分为接触式和非接触式...
单片机温度 传感器不显示示数?如果单片机温度传感器不显示示数,可能有几个原因。首先,检查传感器是否正确连接到单片机,并确保电源供应正常。其次,检查传感器的引脚是否正确配置,并确保...
c51 单片机温度 报警器灯不亮?是致命错误。问题原因:编译工具及相关库文件在KEIL的tool.ini初始化文件指定的路径不存在或者指定的路径下的文件找不到。解决方案,有两种:1、安装KEIL...
用 单片机 检测室外 温度 ,用哪个型号 温度 传感器好?也不能用体温计。你想啊,人体差那么零点几度就是高烧了。因而如果你对精度无要求的话首选18B20,因为可以用单片机直接读出温度,不用外加电路。而如果你对精...
单片机 内部测 温度 原理?内部主要有ROM.RAM和温度传感器。DS18B20是使用一根数据线进行通信,首先你要先向它发送一系列脉冲信号。一般我们用的步骤大致为:初始化--跳过ROM操作--启动温...
DS18B20 温度 传感器,51 单片机 ,通过NRF24L01发射、接收,最...新浪共享上有源码和电路图,去下载即可已通过测试
单片机 怎么判断 温度 稳定下来?去找(购)一只温度传感器,帖在热水器的输出管道壁上,这时就可用它的信号来控制单片机对热水器(电磁阀)进行开关或大小的控制天气量了。再配上适当的显示示和...
单片机 热敏电阻怎么检测他的 温度 的?突然...如果是最老式的电饭锅(某宝上50元以内就能买一个),就那个开关通过杠杆连着一个磁体,你按下去的时候会吸住,开始加热,然后这种磁体在105度的时候磁性会...
做了一个 单片机 NTC 温度 检测 系统 ,NTC部分电路图如下,为什么焊...4条回答:【推荐答案】焊接完成后测量包括与电路其他部分的连接,应该考虑其他相连电路对测量的影响。拆下R1和R4,量下它们线路板上安装的两点间电阻是多少。