2416通过串口采集AM2301温湿度,单片机采用1T单片机
难度在于数据分析和单片机为1T,延时需要精确设计;
晶振11.0592,单片机12c5a60s2系列1T单片机,串口速率9600,默认串口max232,连接2416需交叉线,和电脑有不同,要注意。
/***************************************************************
名 称 :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 = P1^0 ; //AM2301端口定义
//----------------全局变量--------------------//
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_temp;
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--; */
unsigned char a,b;
for(b=1;b>0;b--)
for(a=52;a>0;a--);
}
/*********************************************************
函数名称 : 读温湿度字节函数
功 能 : 读取温湿度每个字节
说 明 : 无
*********************************************************/
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] != '