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

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

难度在于数据分析和单片机为1T,延时需要精确设计;

晶振11.0592,单片机12c5a60s2系列1T单片机,串口速率9600,默认串口max232,连接2416需交叉线,和电脑有不同,要注意。


/*************************************************************** 
  名  称 :AM2301温湿度监测
  功  能 :1602显示采集到的温湿度并用串口发送温湿度数据到上位机
  并接受上位机的控制
    (波特率 9600) 
  说  明 : 无
  修  改 :无
  日  期 :2011-3-18
****************************************************************/ 
//头文件
#include <STC_NEW_8051.H>
#include <intrins.h>
#include <stdio.h> 
#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] != '\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






  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值