技术文档

单片机温度监控系统 51单片机实现温湿度传感器实时监控并LCD显示的解决方案

小编 2024-10-06 技术文档 23 0

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,量下它们线路板上安装的两点间电阻是多少。

猜你喜欢