基于单片机的四点温湿度监测系统 - 图文

更新时间:2024-05-20 07:30:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

目录

第1章 绪论 .............................................................................................................................. 5

1.1 温湿度监测的应用介绍 .............................................................................................. 5 1.2 论文的组织结构 .......................................................................................................... 5 第2章 DHT11产品介绍 ......................................................................................................... 7

2.1 概述 .............................................................................................................................. 7 2.2 应用电路连接说明 ...................................................................................................... 8 2.3 DHT11的数据结构 ...................................................................................................... 8 2.4 DHT11的传输时序 ...................................................................................................... 9

2.4.1 DHT11开始发送数据流程 ................................................................................ 9 2.4.2 单片机复位信号和DHT11响应信号 ............................................................ 10 2.4.3 数字?0?信号表示方法 ..................................................................................... 10 2.4.4 数字?1?信号表示方法 ..................................................................................... 10

第3章 单片机STC89C52 ..................................................................................................... 11

3.1 概述 ............................................................................................................................ 11 3.2 STC89C52单片机的工作模式 .................................................................................. 11 3.3 STC89C52芯片引脚介绍 .......................................................................................... 12 第4章 蓝牙模块HC-05 ........................................................................................................ 14

4.1 概述 ............................................................................................................................ 14 4.2 HC-05模块引脚功能介绍 ...................................................................................... 14 4.3 HC-05模块指示灯说明 .......................................................................................... 15 第5章 系统整体结构设计 .................................................................................................... 16

5.1 本设计的整体结构 .................................................................................................... 16 5.2 系统整体硬件电路设计 ............................................................................................ 17 5.3 系统硬件电路与PC机通信设计 ............................................................................. 17 5.4 温湿度数据的实时显示 ............................................................................................ 19 第6章 总结 ............................................................................................................................ 22

参考文献 .................................................................................................................................. 23 附录 .......................................................................................................................................... 24

四点无线温湿度检测系统

摘要

本文所设计温湿度监测系统只需使用一个单片机,而所能达到的最大观测点数却能达到四个,并且单片机与监控室的通信方式为无线通信方式。观测四个点的温室度就需要四个温湿度传感器,本文选用的是新型温湿度传感器DHT11, DHT11采集四个观测点的温湿度值,然后将温湿度的模拟信号转换为数字信号,用单片机STC89C52来完成对采集到的四个观测点的温湿度数据的分析与处理。同时,采集到的各观测点温湿度数据可通过蓝牙模块HC-05依次上传到PC机,在PC机软件界面上一次显示四个观测点的温湿度数据。通过上位机软件界面设定温度的最大和最小值,以达到温度报警功能。

关键词:温湿度监测系统,四点采集,无线传输,传感器,蓝牙

Four-point Wireless Temperature and Humidity Monitoring System

Abstract

In this text, the design of temperature and humidity monitoring system only use a SCM, the maximum observation point of the system can reach to four points. The way of communication between the control room and microcontroller is wireless communication. Four observation points requires four temperature and humidity sensors, and this text choose a kind of new optional temperature and humidity sensors DHT11. DHT11 collected the temperature and humidity values of four observation points, and then the temperature and humidity of the analog signal is converted to a digital signal. MCU STC89C52 complete the analysis and processing of temperature and humidity data collected from the four observation points. Meanwhile, the temperature and humidity data collected for each observation point can turn uploaded by HC-05 Bluetooth module to a PC, and the display the temperature and humidity data from four observation point on the PC software interface. Set maximum and minimum temperature values on the PC software interface can achieve the temperature alarm function.

Key words: temperature and humidity monitoring system,four-point acquisition,wireless

transmission,sensor,bluetooth

第1章 绪论

1.1 温湿度监测的应用介绍

当前许多行业都需要贮藏非常重要的物品,如:烟草、纺织原料、药物、食材等,所以产品生产、产品管理和产品贮藏越来越被重视。为了保证仓库产品的质地完整不受环境影响,应当设法满足适宜于产品贮藏的外部条件,当外部温湿度满足产品存储的要求时,就要控制避免室外气候对仓库内温湿度环境造成变化;当监测到仓库里的温湿度不适合商品贮藏时,就要采取合理的办法使仓库内的温湿度恢复到满足贮藏条件的状态。因此,为了时刻了解仓库内的温湿度值,就要建立合理的温湿度监控系统,已完成监测控制仓库内温湿度的任务,同时还可以储存所有监测过程的温湿度值,这些都已经进入了行业规范。

在限定的温湿度条件下贮藏药物,人体组织,血袋,疫苗等,为保证病患在医院的安全和提高医院对病患治疗效果起到了决定性的作用。然而,有时医疗部门因条件限制,并不能做到合理贮藏医用物品,相关部门已经就需要特别保存对待的医用物品对医疗部门提出了监测要求。现在,温湿度监测广泛运用于洁净厂房、生物制药、电信银行、无菌室、文物馆、资料室、图书馆、计算机机房监测、智能楼台等各界需要温湿度监测的环境。

现在温湿度监测在各个领域的应用都有一些共同特性:温湿度采集都使用高性能的温湿度传感器,具有工作性能稳定和采集数据准确度高的特点;数字信号传输为大多数系统采用的信号传输方式,有利于远距离传输信号,易布线;系统基本都采用开放式通信规约,易扩展;为提高系统的稳定性,系统都具有功能丰富、应用方便的组态软件界面。

1.2 论文的组织结构

本篇论文的各章组织结构如下:

第1章 绪论。主要介绍了温湿度监测的必要性、温湿度监测的应用以及温湿度监测的特点;

第2章 DHT11产品介绍。主要介绍了DHT11温湿度传感器的引脚说明、电路连接、

数据格式以及传输时序;

第3章 单片机STC89C52。主要介绍了系统的核心芯片STC89C52的常用引脚的说明和单片机的工作模式;

第4章 蓝牙模块HC-05。主要介绍了完成系统无线接收发送功能的蓝牙模块HC-05的引脚说明和指示灯说明;

第5章 系统整体结构设计。详细介绍了系统的工作流程、硬件电路连接、无线传输的实现以及PC机界面的显示和报警;

第6章 总结。总结概括了本篇论文设计的系统的优点以及需要继续改进的地方;

第2章 DHT11产品介绍

2.1 概述

DHT11温湿度传感器是一种数字温湿度传感器,这种温湿度传感器属于复合型传感器,它的内部电路里包含已经校对过的数字信号输出电路。它使用一个专门的数字模块,具有特有的采集技术和温湿度传感技术,保证了采录到的数据具有很高的可靠性,产品也具有良好的长期稳定性。DHT11数字温湿度传感器,其内部包含电阻式感湿部件和NTC温度测量部件。因此,此款产品具品质优良、响应迅速、抗干扰能力强、性价比高等优势[1]。在传感器内部有一个OTP存储器,OTP存储器内储存了用来描述校对系数的程序,传感器内部在检测湿度信号的过程中会使用这些储存在OTP存储器中用来描述校对系数的程序。为了使系统集成变得更简单和快捷,DHT11数字温湿度传感器在串口方面采用了单线串行接口。超小尺寸、低功耗、信号传输距离20米以上,使DHT11数字温湿度传感器成为了各种苛刻的应用场合的最佳选择[2]。该产品使用4针排引脚的方式封装。

图2.1 DHT11传感器实物图

主要性能性能指标如下:

?工作电压范围:3.5V-5.5V ?工作电流 :平均0.5mA ?湿度测量范围:20-90%RH ?温度测量范围:0-50℃ ?湿度分辨率 :1%RH 8位

?温度分辨率 :1℃8位 ?采样周期 :1S ?单总线结构 ?与TTL兼容(5V)

图2.2管脚排列

2.2 应用电路连接说明

由于数字温湿度传感器DHT11的操作简单,电路连接方便,多以在很多温湿度采集电路中得到了广泛应用。数字温湿度传感器DHT11的第一引脚为电源正极,第二引脚为数据端,第三引脚为空脚,第四引脚为电源负极。第二引脚的数据端可以直接连单片机的I/O口,第三引脚的空脚在连接过程中通常的处理办法为悬空不用。 2.3 DHT11的数据结构

DHT11数字温湿度传感器采用的是单总线数据格式,在数据信号传送过程中,单个数据引脚端口完成了输入输出双向传送的功能的[3]。DHT11的数据包有5字节Byte(40比特Bit)组成。数据由整数和小数两部分构成。

传感器输出的数据形式是没有经过编码的二进制数据形式。如果某次读取到5Byte数据如下:

byte4

00101101 00000000 00011100 00000000 01001001

byte3

byte2

byte1

byte0

整数 小数 整数 小数 校验和 湿度 温度 校验和 通过以上数据可以得到温湿度的具体值,计算方法如下: 湿度=byte4.byte3=45.0(%RH)

温度=byte2.Byte1=28.0(℃)

校验= byte4+ byte3+byte2+byte1=73(=湿度+温度)(校验正确) 2.4 DHT11的传输时序 2.4.1 DHT11开始发送数据流程

在通信过程中,单片机发送起始信号之后,由于延迟的影响,大概需要等待20 us-40us后,单片机才会开始读DHT11的响应信号,如果单片机读到总线的信号是低电平,那么表示温湿度传感器发送了一个响应信号。此时,温湿度传感器准备完毕,可以开始读取数据。每一比特的数据都以低水平为开始的数据。如果单片机读到的总线的信号是高电平,那么DHT11无响应,表示不能进行温湿度数据的采集和传送,这就需要检查电路连接是否正常[4]。

2.4.2 单片机复位信号和DHT11响应信号

2.4.3 数字‘0’信号表示方法

2.4.4 数字‘1’信号表示方法

第3章 单片机STC89C52

3.1 概述

STC89C52是STC公司生产的一种单片机,它具有低功耗、高性能两大基本特点[5]。STC89C52继承了常用的MCS-51单片机的核心,但在MCS-51单片机做了很多优化改良,使其拥有了许多传统的MCS-51单片机没有的功能。STC89C52的标准功能包括8 kbyte的Flash存储器和512byte的内存,在接口线方面支持32位的I / O接口线,全双工串行端口,同时还具有看门狗定时器。在STC89C52内部有4 kb EPROM和MAX810的复位电路,同时还具有四个外部中断、三个16位的定时器/计数器和一个7向量的四级中断结构[6]。STC89C52的最高工作频率是35 Mhz[7]。

图3.1 STC89C52实物图

3.2 STC89C52单片机的工作模式 STC89C52单片机有以下三个工作模式: 工作模式:典型功耗4mA~7mA 空闲模式:典型功耗2mA 掉电模式:典型功耗小于0.1uA

3.3 STC89C52芯片引脚介绍

图3.2 STC89C52芯片引脚图

P0端口(P0.0 ~ P0.7, 32 ~39引脚):P0端口是一个双向的I / O端口,是一个8位端口。P0端口在电路结构上采用的是漏极开路结构。当使用P0口的输出功能时每个引脚可以承受8个TTL负载,当把“1”写入P0端口时,可以用作高阻抗输入。在校对的过程中,P0口输出的是指令字节。

P1端口(P1.0 ~ P1.7,1 ~ 8引脚):P1端口也是一个8位的双向I / O端口,在电路结构上其内部具有上拉电阻。当使用P1端口的输出功能时每个引脚可以承受4个TTL负载。当把“1”写入P1口时,P1端口的电位会由于其内部上拉电阻的作用而提到高电位,这时是作为一个输入端口。

P2端口(P2.0 ~ P2.7,21 ~ 28引脚) 和P3端口(P3.0 ~ P3.7,10 ~ 17引脚)的功能与P1端口的功能相同,此处不再赘述。 VCC:电源端

VSS:地端

第4章 蓝牙模块HC-05

4.1 概述

HC-05是一款主从一体蓝牙串口模块。HC-05模块的性能强,应用范围广,可与各种带蓝牙功能的电脑、移动通信模块、PDA、PSP等智能终端连接进行数据传输。当HC-05模块与其他蓝牙模块成功配对后并可提供串口服务时,二者无需连接串口线通讯设备就可以进行无线通讯。蓝牙模块与单片机通讯是HC-05的广泛应用之一。蓝牙模块与单片机需要通讯是,只需将两者之间的VCC、TXD、RXD、GND分别相接即可完成硬件连接[8]。

图4.1 HC-05模块实物图

主要性能性能指标如下:

?接口说明:TTL电平,兼容3.3/5V单片机

?波特率 :4800/9600/19200/38400/57600/115200/230400/460800/921600/138240 ?通讯距离:10m(空旷地)

?对外接口:6pin排针(2.54间距) ?工作电压:3.3~5V

?工作电流:配对中:30~40mA 配对完毕未通信:1~8mA 通讯中:5~20mA 4.2 HC-05模块引脚功能介绍

表4-1 HC-05引脚功能表 名称 VCC GND TXD RXD KEY LED 说明 电源(3.3V~5V) 地 模块串口发送引脚 模块串口接受引脚 低电平或者悬空时进入正常状态,高电平时进入AT状态。 配对成功输出到电平,未成功输出低电平。 4.3 HC-05模块指示灯说明

在给HC-05通电的同时(或者之前),如果将KEY引脚接高电平,指示灯闪烁方式为慢闪(1秒亮一次),表示此模块将会进入AT状态,此刻频率固定为38400。

在给HC-05通电的同时,如果将KEY引脚作悬空或者接地处理,指示灯的闪烁方式为快闪(1秒2次),表示此模块进入可配对状态。此时如果将KEY引脚接高电平,那么HC-05也会进入AT状态,但是指示灯指示灯的闪烁方式不会改变,仍旧为快闪。

在HC-05模块与其他蓝牙设备配对成功后,指示灯的闪烁方式为双闪状态(一次闪2下,2秒闪一次)。

图5.7 2号仓库温度低于下限值时的报警状态

第6章 总结

本篇论文通过设计实现了基于一个单片机的四点温湿度实时监测,并通过蓝牙模块实现了单片机与上位机的无线通信,上位机的软件设计为操作人员提供了动态可视化操作界面。系统的硬件电路整体结构合理明了,电路连接简易。系统的软件部分可扩展性和实时性强,可根据操作人员和不同环境的不同要求对软件进行修改扩展。

当然,本片论文设计的温湿度监测系统在理论部分已经完成,但在实际运用上还存在几点不足。分布在各个观测点的温湿度传感器通过有线方式与系统唯一的一个单片机进行信号传送,当各个观测点之间的距离较远时,传感器与单片机之间的连线会加长,这样会带来不便,长距离甚至会影响信号的质量。单片机与机房的PC机之间的无线通信方式采用的是蓝牙,而蓝牙的最大有效传输距离较短,当单片机与机房相距较远时会超出蓝牙的最大有效传输距离,单片机不能与PC机的蓝牙软件建立连接进行通信,采集的温湿度数据不能传送回监控室。本系统只是实现了温湿度的检测,并没有实现对温湿度的自动控制,当发现观测点的温湿度值不满足预期要求时,需要人工进行相应的操作来完成温湿度的调节控制。这几点本篇论文设计系统的不足之处,还需要在原有基础上进一步完善。

参考文献

[1] 雷娟. 基于CAN总线技术的监测控制局域网研究[J].安徽农业大学,2011

[1] 杨小平.基于AT89S52和DHT21的温湿度测量系统设计[J].无锡职业技术学院学报,2011

[1] 裴忠诚.基于STC89C52温湿度显示仪的设计[J].技术与市场,2013 [1] 占宇.基于无线传输的多功能温度检测系统的开发[J].沈阳理工大学,2011 [1] 邓魁. 基于声卡虚拟示波器设计[J].数字技术与应用,2012

[1] 龚根华. 轮式移动机器人控制系统设计与研究[J].南京航空航天大学,2014 [1] 张磊.Teradyne Ultra FLEX的测试程序调试[J].微机原理,2012

[1] 王彩峰. 基于蓝牙技术和GSM网络的数据传输研究[J].西南科技大学,2008 [1] 康玮. 基于.NET的DCS组态软件研究与设计[J].湖南大学,2006

附录

系统程序

alarm.c:

#include \#include \ #include \ //报警标志位 void CheckAlarm() //检测是否报警 {

if((dat[0]>=dat[4])||(dat[0]<=dat[5])) {dat[6]=1; LED=0; } else

{dat[6]=0; LED=1;} }

void CheckAlarm1() //检测是否报警 {

if((dat[7]>=dat[11])||(dat[7]<=dat[12])) {dat[13]=1; LED1=0; } else

{dat[13]=0; LED1=1;} }

void CheckAlarm2() //检测是否报警 {

if((dat[14]>=dat[18])||(dat[14]<=dat[19])) {dat[20]=1; LED2=0; } else

{dat[20]=0; LED2=1;} }

void CheckAlarm3() //检测是否报警 {

if((dat[21]>=dat[25])||(dat[21]<=dat[26])) {dat[27]=1; LED3=0; } else

{dat[27]=0; LED3=1;} }

DHT11.C:

#include \#include \ U8 U8FLAG,k; U8 U8temp; U8 U8comdata;

uchar U8checkdata;

uchar temperature[]=\℃\

void Data_to_Str(uchar data_H,uchar* str) {

str[0]=(char)(data_H/10+0x30); str[1]=(char)(data_H+0x30); }

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 COM1(void) {

U8 i;

for(i=0;i<8;i++) {

U8FLAG=2;

while((!DHT12)&&U8FLAG++); Delay_10us();

Delay_10us(); Delay_10us(); U8temp=0;

if(DHT12)U8temp=1; U8FLAG=2; while((DHT12)&&U8FLAG++); //超时则跳出for循环 if(U8FLAG==1)break; //判断数据位是0还是1 // 如果高电平高过预定0高电平值则数据位为 1 U8comdata<<=1;

U8comdata|=U8temp; //0 }//rof }

void COM2(void) {

U8 i;

for(i=0;i<8;i++) {

U8FLAG=2;

while((!DHT13)&&U8FLAG++); Delay_10us(); Delay_10us(); Delay_10us(); U8temp=0;

if(DHT13)U8temp=1; U8FLAG=2; while((DHT13)&&U8FLAG++); //超时则跳出for循环 if(U8FLAG==1)break; //判断数据位是0还是1 // 如果高电平高过预定0高电平值则数据位为 1 U8comdata<<=1;

U8comdata|=U8temp; //0 }//rof }

void COM3(void) {

U8 i;

for(i=0;i<8;i++) {

U8FLAG=2;

while((!DHT14)&&U8FLAG++); Delay_10us(); Delay_10us(); Delay_10us(); U8temp=0;

if(DHT14)U8temp=1; U8FLAG=2; while((DHT14)&&U8FLAG++); //超时则跳出for循环 if(U8FLAG==1)break; //判断数据位是0还是1 // 如果高电平高过预定0高电平值则数据位为 1 U8comdata<<=1;

U8comdata|=U8temp; //0 }//rof }

void COM(void) {

U8 i;

for(i=0;i<8;i++) {

U8FLAG=2;

while((!DHT11)&&U8FLAG++); Delay_10us(); Delay_10us(); Delay_10us(); U8temp=0;

if(DHT11)U8temp=1; U8FLAG=2;

while((DHT11)&&U8FLAG++); //超时则跳出for循环 if(U8FLAG==1)break; //判断数据位是0还是1 // 如果高电平高过预定0高电平值则数据位为 1 U8comdata<<=1;

U8comdata|=U8temp; //0 }//rof }

void RH(void) { U8

U8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_temp;

//主机拉低18ms DHT11=0; Delay(180); DHT11=1;

//总线由上拉电阻拉高 主机延时20us Delay_10us(); Delay_10us(); Delay_10us(); Delay_10us();

//主机设为输入 判断从机响应信号 DHT11=1;

//判断从机是否有低电平响应信号 如不响应则跳出,响应则向下运行 if(!DHT11) //T ! {

U8FLAG=2;

//判断从机是否发出 80us 的低电平响应信号是否结束 while((!DHT11)&&U8FLAG++); U8FLAG=2;

//判断从机是否发出 80us 的高电平,如发出则进入数据接收状态 while((DHT11)&&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; DHT11=1; //数据校验

U8temp=(U8T_data_H_temp+U8T_data_L_temp+U8RH_data_H_temp+U8RH_data_L_temp);

if(U8temp==U8checkdata_temp) {

dat[2]=U8RH_data_H_temp; dat[3]=U8RH_data_L_temp; dat[0]=U8T_data_H_temp; dat[1]=U8T_data_L_temp;

U8checkdata=U8checkdata_temp; Data_to_Str(dat[0],temperature); Data_to_Str(dat[2],humidity); } }

} void RH1(void) { U8

U8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_temp;

//主机拉低18ms DHT12=0; Delay(180); DHT12=1;

//总线由上拉电阻拉高 主机延时20us Delay_10us(); Delay_10us(); Delay_10us(); Delay_10us();

//主机设为输入 判断从机响应信号 DHT12=1;

//判断从机是否有低电平响应信号 如不响应则跳出,响应则向下运行 if(!DHT12) //T ! {

U8FLAG=2;

//判断从机是否发出 80us 的低电平响应信号是否结束 while((!DHT12)&&U8FLAG++); U8FLAG=2;

//判断从机是否发出 80us 的高电平,如发出则进入数据接收状态 while((DHT12)&&U8FLAG++); //数据接收状态 COM1();

U8RH_data_H_temp=U8comdata; COM1();

U8RH_data_L_temp=U8comdata; COM1();

U8T_data_H_temp=U8comdata; COM1();

U8T_data_L_temp=U8comdata; COM1();

U8checkdata_temp=U8comdata; DHT12=1; //数据校验

U8temp=(U8T_data_H_temp+U8T_data_L_temp+U8RH_data_H_temp+U8RH_data_L_temp);

if(U8temp==U8checkdata_temp) {

dat[9]=U8RH_data_H_temp; dat[10]=U8RH_data_L_temp; dat[7]=U8T_data_H_temp; dat[8]=U8T_data_L_temp;

U8checkdata=U8checkdata_temp; // Data_to_Str(dat[0],temperature); // Data_to_Str(dat[2],humidity); } }

} void RH2(void) { U8

U8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkda

ta_temp;

//主机拉低18ms DHT13=0; Delay(180); DHT13=1;

//总线由上拉电阻拉高 主机延时20us Delay_10us(); Delay_10us(); Delay_10us(); Delay_10us();

//主机设为输入 判断从机响应信号 DHT13=1;

//判断从机是否有低电平响应信号 如不响应则跳出,响应则向下运行 if(!DHT13) //T ! {

U8FLAG=2;

//判断从机是否发出 80us 的低电平响应信号是否结束 while((!DHT13)&&U8FLAG++); U8FLAG=2;

//判断从机是否发出 80us 的高电平,如发出则进入数据接收状态 while((DHT13)&&U8FLAG++); //数据接收状态 COM2();

U8RH_data_H_temp=U8comdata; COM2();

U8RH_data_L_temp=U8comdata; COM2();

U8T_data_H_temp=U8comdata; COM2();

U8T_data_L_temp=U8comdata; COM2();

U8checkdata_temp=U8comdata; DHT13=1; //数据校验

U8temp=(U8T_data_H_temp+U8T_data_L_temp+U8RH_data_H_temp+U8RH_data_L_temp);

if(U8temp==U8checkdata_temp) {

dat[16]=U8RH_data_H_temp; dat[17]=U8RH_data_L_temp; dat[14]=U8T_data_H_temp; dat[15]=U8T_data_L_temp;

U8checkdata=U8checkdata_temp; // Data_to_Str(dat[0],temperature); // Data_to_Str(dat[2],humidity); } }

}

void RH3(void) { U8

U8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_temp;

//主机拉低18ms DHT14=0; Delay(180); DHT14=1;

//总线由上拉电阻拉高 主机延时20us Delay_10us(); Delay_10us(); Delay_10us(); Delay_10us();

//主机设为输入 判断从机响应信号 DHT14=1;

//判断从机是否有低电平响应信号 如不响应则跳出,响应则向下运行 if(!DHT14) //T ! {

U8FLAG=2;

//判断从机是否发出 80us 的低电平响应信号是否结束 while((!DHT14)&&U8FLAG++); U8FLAG=2;

//判断从机是否发出 80us 的高电平,如发出则进入数据接收状态 while((DHT14)&&U8FLAG++); //数据接收状态 COM3();

U8RH_data_H_temp=U8comdata; COM3();

U8RH_data_L_temp=U8comdata; COM3();

U8T_data_H_temp=U8comdata; COM3();

U8T_data_L_temp=U8comdata; COM3();

U8checkdata_temp=U8comdata;

DHT14=1; //数据校验

U8temp=(U8T_data_H_temp+U8T_data_L_temp+U8RH_data_H_temp+U8RH_data_L_temp);

if(U8temp==U8checkdata_temp) {

dat[23]=U8RH_data_H_temp; dat[24]=U8RH_data_L_temp; dat[21]=U8T_data_H_temp; dat[22]=U8T_data_L_temp;

U8checkdata=U8checkdata_temp; // Data_to_Str(dat[0],temperature); // Data_to_Str(dat[2],humidity); } }

}

Kongview.c:

#include \

uchar dat[28]={20,7,3,4,10,30,0,8,9,10}; uchar recbuf[20];

uchar sendbuf[10]={0x40,0x30,0x31,0x30,0x31,0,0,0,0,0x0d}; //sendbuf[1-2]本机地址位,多机修改此处

uchar sendbuf1[12]={0x40,0x30,0x31,0x30,0x32,0x30,0x30,0x30,0x31,0x30,0x30,0x0d,}; uchar Answer[8]={0x40,0x30,0x31,0,0,0,0,0x0d}; uchar count=0; bit flag=0; bit recok=0; bit startrec=0;

void serial_init() {

SCON=0x50; TMOD=0X20; TH1=0xfd; TL1=0xfd; TR1=1; EA=1; ES=1; }

void uartsends(uchar buff[],uchar len) {

uchar i;

for(i=0;i

uchar read_write_flag() {

uchar temp;

if(recbuf[4]>0x40)

temp=(recbuf[4]-0x37)&0x0f; else temp=(recbuf[4]-0x30)&0x0f; return temp; }

uchar data_num() { //data_num=2 byte; data_num=4,short; uchar temp;

if(recbuf[10]>0x40)

temp=(recbuf[10]-0x37)&0x0f; else temp=(recbuf[10]-0x30)&0x0f; return temp; }

uchar Dat_trans(uchar hight_v,uchar low_v) {

uchar value,hight,low; if(hight_v>0x40) hight=hight_v-0x37; else hight=hight_v-0x30; if(low_v>0x40) low=low_v-0x37; else low=low_v-0x30; value=(hight&0x0f)<<4; value+=(low&0x0f); return value;

}

void write_inform(uchar dat) {

uchar xordat,i,ctmp1,ctmp2,send_temp; Answer[3]=dat; Answer[4]=dat; xordat=0;

for(i=1;i<5;i++) xordat^=Answer[i]; send_temp=xordat;

ctmp1=(send_temp>>4)&0x0f;

if(ctmp1>9)Answer[5]=ctmp1%9+0x40; else Answer[5]=ctmp1+0x30; ctmp2=send_temp&0x0f;

if(ctmp2>9)Answer[6]=ctmp2%9+0x40; else Answer[6]=ctmp2+0x30; uartsends(Answer,8); }

void AddrInit() {

uchar ctmp;

ctmp=(MyAddr>>4); if(ctmp>9) {

sendbuf[1]=0x40+ctmp%9; sendbuf1[1]=0x40+ctmp%9; } else {

sendbuf[1]=ctmp+0x30; sendbuf1[1]=ctmp+0x30; }

ctmp=MyAddr&0x0f; if(ctmp>9) {

sendbuf[2]=0x40+ctmp%9; sendbuf1[2]=0x40+ctmp%9; } else {

sendbuf[2]=ctmp+0x30; sendbuf1[2]=ctmp+0x30;

} }

void KongviewInit() {

AddrInit(); serial_init(); }

void Read_byte() {

uchar ctmp,ctmp1,xordat,i; uint send_temp;

send_temp=dat[Dat_trans(recbuf[7],recbuf[8])]; if(data_num()==1) {

ctmp=(send_temp>>4); if(ctmp>9)

sendbuf[5]=0x40+ctmp%9; else sendbuf[5]=ctmp+0x30; ctmp=send_temp&0x0f; if(ctmp>9)

sendbuf[6]=0x40+ctmp%9; else sendbuf[6]=ctmp+0x30; xordat=0;

for(i=1;i<7;i++) xordat^=sendbuf[i]; send_temp=xordat;

ctmp=(send_temp>>4)&0x0f; if(ctmp>9)

sendbuf[7]=ctmp%9+0x40; else sendbuf[7]=ctmp+0x30; ctmp=send_temp&0x0f; if(ctmp>9)

sendbuf[8]=ctmp%9+0x40; else sendbuf[8]=ctmp+0x30; sendbuf[4]=0x31; sendbuf[9]=0x0d; uartsends(sendbuf,10); }

else if(data_num()==2) {

ctmp=(send_temp>>8)&0x00ff; ctmp1=(ctmp>>4)&0x0f;

if(ctmp1>9)

sendbuf1[5]=0x40+ctmp1%9; else sendbuf1[5]=ctmp1+0x30; ctmp1=ctmp&0x0f; if(ctmp1>9)

sendbuf1[6]=0x40+ctmp1%9; else sendbuf1[6]=ctmp1+0x30; ctmp=send_temp; ctmp1=(ctmp>>4); if(ctmp1>9)

sendbuf1[7]=0x40+ctmp1%9; else sendbuf1[7]=ctmp1+0x30; ctmp1=ctmp&0x0f; if(ctmp1>9)

sendbuf1[8]=0x40+ctmp1%9; else sendbuf1[8]=ctmp1+0x30; xordat=0;

for(i=1;i<9;i++) xordat^=sendbuf1[i]; send_temp=xordat;

ctmp=(send_temp>>4)&0x0f; if(ctmp>9)

sendbuf[9]=ctmp%9+0x40; else sendbuf1[9]=ctmp+0x30; ctmp=send_temp&0x0f; if(ctmp>9)

sendbuf1[10]=ctmp%9+0x40; else sendbuf1[10]=ctmp+0x30; sendbuf1[11]=0x0d; uartsends(sendbuf1,12); } }

bit check_CRC() {

uchar xordat,i,ctmp1,ctmp2,temp; if(((read_write_flag())&0x01)==Read) temp=11;

else if(((read_write_flag())&0x01)==Write) temp=13;

xordat=recbuf[1]; for(i=2;i

ctmp1=xordat&0xf0; ctmp1>>=4; ctmp1+=0x30;

ctmp2=xordat&0x0f; ctmp2+=0x30;

if((ctmp1==recbuf[temp])&& ctmp2==recbuf[temp+1]) return 1; else return 0; }

void Write_byte() {

uint temp;

if(data_num()==1) {

temp=Dat_trans(recbuf[11],recbuf[12]); dat[Dat_trans(recbuf[7],recbuf[8])]=temp; }

else if(data_num()==2) {

temp=Dat_trans(recbuf[11],recbuf[12]); temp=(temp<<8)&0xff00;

temp=temp|Dat_trans(recbuf[13],recbuf[14]); dat[Dat_trans(recbuf[7],recbuf[8])]=temp; }

write_inform('#'); }

void recive() interrupt 4 {

uchar sbuf; sbuf=SBUF; if(sbuf==Start) flag=1; if(flag==1) { recbuf[count]=sbuf; count++; if(sbuf==End) {

recok=1; count=0; flag=0; if(recok) { recok=0; if(check_CRC()||Dat_trans(recbuf[1],recbuf[2])==MyAddr) { switch(read_write_flag()&0x01) { case Read: Read_byte();break; case Write: Write_byte();break; } } else write_inform('*'); } } } RI=0; }

main.c:

#include #include \#include\#include \

/********************* sbit DHT11 = P2^0 ;

sbit LED=P0^1; //报警位 低电平报警 接继电器或LED灯

dat[0]温度整数, dat[1]温度小数 dat[2]湿度整数,dat[3]温度小数,dat[4]高温报警,dat[5]低温报警 dat[6]报警标志位 ***********************/

void main() {

KongviewInit(); while(1) {

RH(); //获取温湿度数据 RH1();

RH2(); RH3();

CheckAlarm(); CheckAlarm1(); CheckAlarm2(); CheckAlarm3(); } }

//检测是否超温。超温则报警

本文来源:https://www.bwwdw.com/article/9bi7.html

Top