AM2301温湿度
/***************************************************************
名 称 :AM2301温湿度监测
功 能 :1602显示采集到的温湿度并用串口发送温湿度数据到上位机
并接受上位机的控制
(波特率 9600)
说 明 : 无
修 改 :无
日 期 :2011-3-18
****************************************************************/
//头文件
#include
#include
#include
#include "LCD1602.h"
#include "uart.h"
//宏定义
typedef unsigned char U8; /* 无符号8位整型变量 */ typedef signed char S8; /* 有符号8位整型变量 */ typedef unsigned int U16; /* 无符号16位整型变量 */ typedef signed int S16; /* 有符号16位整型变量 */ typedef unsigned long U32; /* 无符号32位整型变量 */ typedef signed long S32; /* 有符号32位整型变量 */ typedef float F32; /* 单精度浮点数(32位长度) */ typedef double F64; /* 双精度浮点数(64位长度) */
#define uchar unsigned char #define uint unsigned int
//----------------IO口定义-------------------//
sbit DHT = P2^0 ; //AM2301端口定义
sbit JDQ = P2^7; //继电器端口定义
//----------------全局变量--------------------// bit flagtemp;//温度正负标志位,k U8count, bit flagsendtemp;//发送温度的标志位
U8 U8FLAG;
U8 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_te
mp;
U8 U8comdata;
U16 DHTData1,DHTData2;
U8 outdata[5]; //定义发送的字节数
U8 indata[5];
U8 count, count_r=0;
U8 RevData;//串口数据接收
U8 str[5];
U8 data tab[6]={0x00,0x00,0x00,0x00,0x00,0x00};//存储温湿度数据 U8 code dis1[]={"Humdity: % "} ; U8 code dis2[]={"Temper: c "} ;
/*********************************************************
函数名称 : 延时子程序
功 能 : 延时
说 明 : 无
*********************************************************/
void Delay(U16 j)
{ U8 i;
for(;j>0;j--)
{
for(i=0;i<27;i++);
}
}
void Delay_10us(void)//延时10uS
{
U8 i;
i--;
i--;
i--;
i--;
i--;
i--;
}
/*********************************************************
函数名称 : 读温湿度字节函数
功 能 : 读取温湿度每个字节
说 明 : 无
*********************************************************/
void COM(void)//读字节
{
U8 i;
for(i=0;i<8;i++)
{
U8FLAG=2;
while((!DHT)&&U8FLAG++);
Delay_10us();
Delay_10us();
Delay_10us();
U8temp=0;
if(DHT)U8temp=1;
U8FLAG=2;
while((DHT)&&U8FLAG++);
//超时则跳出for循环
if(U8FLAG==1)break;
//判断数据位是0还是1
// 如果高电平高过预定0高电平值则数据位为 1
U8comdata<<=1;
U8comdata|=U8temp; //0
}//end i
}
//--------------------------------------------------------------
//--------------------------------
//-----湿度读取子程序 ------------
//--------------------------------
//----以下变量均为全局变量--------
//----温度高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)//读取温湿度
{
//主机拉低 1-5ms
DHT=0;
Delay(5);
DHT=1;
//总线由上拉电阻拉高 主机延时40us
Delay_10us();
Delay_10us();
Delay_10us();
Delay_10us();
//主机设为输入 判断从机响应信号
DHT=1;
//判断从机是否有低电平响应信号 如不响应则跳出,响应则向下运行
if(!DHT) //T !
{
U8FLAG=2;
//判断从机是否发出 80us 的低电平响应信号是否结束
while((!DHT)&&U8FLAG++);
U8FLAG=2;
//判断从机是否发出 80us 的高电平,如发出则进入数据接收状态
while((DHT)&&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;
DHT=1;
//数据校验
U8temp=(U8T_data_H_temp+U8T_data_L_temp+U8RH_data_H_temp+U8RH_data_L_temp);
if(U8temp==U8checkdata_temp)
if(1)
{
U8RH_data_H = U8RH_data_H_temp;//湿度
U8RH_data_L = U8RH_data_L_temp;
DHTData1 = U8RH_data_H;
DHTData1 <<= 8;
DHTData1 |= U8RH_data_L;//获得完整的湿度
tab[0]=DHTData1/100+0x30; //湿度百位
tab[1]=DHTData1%100/10+0x30;//湿度十位
tab[2]=DHTData1%10+0x30; //湿度个位
U8T_data_H = U8T_data_H_temp;//温度
U8T_data_L = U8T_data_L_temp;
DHTData2 = U8T_data_H;
DHTData2<<=8;
DHTData2 |= U8T_data_L;//获得完整的温度
if(DHTData2&0x8000)//如果温度为负值
{
flagtemp=1;
DHTData2&=0x7FFF;
}
tab[3]=DHTData2/100+0x30;
tab[4]=DHTData2%100/10+0x30;
tab[5]=DHTData2%10+0x30;//
U8checkdata=U8checkdata_temp;
}//fi
}//fi
}
/*********************************************************
函数名称 : 显示温湿度函数
功 能 : 显示温湿度数据
说 明 : 无
*********************************************************/
void display()
{
U8 m;
//====显示湿度======
m = 0 ;
writecmd(0x80);
while(dis1[m] != '\0')//显示字符
{
writedata(dis1[m]) ;
m++ ;
}
writecmd(0x89);
writedata(tab[0]);
writedata(tab[1]);
writedata('.');
writedata(tab[2]);
//=====显示温度=====
m = 0 ;
writecmd(0xc0);
while(dis1[m] != '\0')//显示字符
{
writedata(dis2[m]) ;
m++ ;
}
writecmd(0xC8);
if(flagtemp)writedata('-');
else writedata('+');
writecmd(0xC9);
writedata(tab[3]);
writedata(tab[4]);
writedata('.');
writedata(tab[5]);
}
/*---------------------------------------------------
函数名称 :主函数 mani()
功 能 :将采集到的温湿度数据用1602显示并发送到上位机 说 明 :无
----------------------------------------------------*/
void main()
{
// U8 buff[4];
U8 timecount;
UART_Init();
init_LCD();
while(1)
{
RH();//调用温湿度读取子程序
display(); //1602显示数据
//发送数据到上位机
timecount++;
if(timecount/2==0)flagsendtemp=1;
if(timecount>6)
{
timecount=0;
UART_Send_Byte('R');//上位机识别湿度的标志
UART_Send_Byte(tab[0]);
UART_Send_Byte(tab[1]);
UART_Send_Byte('.');
UART_Send_Byte(tab[2]);
// UART_Send_Byte('E');//上位机结束标志
}
if(flagsendtemp)
{
flagsendtemp=0;
UART_Send_Byte('T');//上位机识别温度的标志
UART_Send_Byte(tab[3]);
UART_Send_Byte(tab[4]);
UART_Send_Byte('.');
UART_Send_Byte(tab[5]); // UART_Send_Byte('E');//上位机结束标志
}
Delay(20000);//读取模块数据周期不易小于 2S
}//end of whie
}// end of main
/*********************************************************
函数名称 : 串口接收中断服务子程序
功 能 : 接收上位机发来的数据并驱动继电器工作 说 明 : 控制湿度有两个分机构成,此为其中之一
为加大湿度
*********************************************************/
void serial() interrupt 4 {
RevData = SBUF;
RI = 0;
switch (RevData)
{
case 'a': //加大湿度
JDQ = 0;
break;
/* case 'm': //降低湿度
JDQ = 0;
break;*/
case 's': //停止
JDQ = 1;
break;
default:
break;
}
}
本文档为【AM2301温湿度】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑,
图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。