2416通过串口采集AM2301温湿度,单片机采用1T单片机

2019-04-15 14:42发布

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] != '