通过PIC单片机使用DHT21温度传感器

2019-04-15 12:31发布

//****************************************************************//
//                 DHT21使用范例
//单片机 : AT89S52 或 STC89C52RC
// 功能  :串口发送温湿度数据  波特率 9600
// 公司  :奥松电子   
//****************************************************************// #include
#include
//
typedef unsigned char  U8;       /* defined for unsigned 8-bits integer variable    无符号8位整型变量  */
typedef signed   char  S8;       /* defined for signed 8-bits integer variable    有符号8位整型变量  */
typedef unsigned int   U16;      /* defined for unsigned 16-bits integer variable    无符号16位整型变量 */
typedef signed   int   S16;      /* defined for signed 16-bits integer variable    有符号16位整型变量 */
typedef unsigned long  U32;      /* defined for unsigned 32-bits integer variable    无符号32位整型变量 */
typedef signed   long  S32;      /* defined for signed 32-bits integer variable    有符号32位整型变量 */
typedef float          F32;      /* single precision floating point variable (32bits) 单精度浮点数(32位长度) */
typedef double         F64;      /* double precision floating point variable (64bits) 双精度浮点数(64位长度) */
//
#define uchar unsigned char
#define uint unsigned int
#define   Data_0_time    4
#define LATA4               LATAbits.LATA4
#define RA4                 PORTAbits.RA4
#define TRISA4    TRISAbits.TRISA4 //----------------------------------------------//
//----------------IO口定义区--------------------//
//----------------------------------------------//
//sbit  P2_0  = P2^0 ;
//sbit  P2_1  = P2^1 ;
//sbit  P2_2  = P2^2 ;
//sbit  P2_3  = P2^3 ;
//----------------------------------------------//
//----------------定义区--------------------//
//----------------------------------------------//
U8  U8FLAG,k;
U8  U8count,U8temp;
U8  U8T_data_H = 0x01,U8T_data_L = 0x02,U8RH_data_H = 0x03,U8RH_data_L = 0x04,U8checkdata = 0x05;
U8  U8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_temp;
U8  U8comdata;
U8  outdata[5];  //定义发送的字节数   
U8  indata[5];
U8  count, count_r=0;
U8  str[5];
U16 U16temp1,U16temp2;        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 initial()
{
 INTCON = 0x00;
 ADCON1 = 0x07;
 PIE1 = 0;
 PIE2 = 0;
} void EUSART_Init()
{
 TXSTA = 0xA4;
 RCSTA = 0x90;
 BAUDCON =0x00;
 TRISC = TRISC|0x80;
 TRISC = TRISC&0xBF;
 SPBRG = 25;
} void send_ch(U8 d)
{
 PIR1bits.TXIF = 0;
 TXREG = d;
 while(TXSTAbits.TRMT == 0);
}
        void  COM(void)
      {
    
         U8 i;
       for(i=0;i<8;i++)   
     {
  
         U8FLAG=2;
     while((!RA4)&&U8FLAG++);
   Delay_10us();
   Delay_10us();
//   Delay_10us();
     U8temp=0;
      if(RA4)U8temp=1;
      U8FLAG=2;
   while((RA4)&&U8FLAG++);
     //超时则跳出for循环   
      if(U8FLAG==1)break;
     //判断数据位是0还是1 
       
  // 如果高电平高过预定0高电平值则数据位为 1
     
     U8comdata<<=1;
        U8comdata|=U8temp;        //0
      }//rof
   
 }  //--------------------------------
 //-----湿度读取子程序 ------------
 //--------------------------------
 //----以下变量均为全局变量--------
 //----温度高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
  TRISA4 = 0;
          LATA4=0;
    Delay(5);
    LATA4=1;
  //总线由上拉电阻拉高 主机延时40us
    Delay_10us();
    Delay_10us();
//    Delay_10us();
//    Delay_10us();
  //主机设为输入 判断从机响应信号
    LATA4=1;
  TRISA4 = 1;
  //判断从机是否有低电平响应信号 如不响应则跳出,响应则向下运行  
    if(!RA4)   //T !  
    {
    U8FLAG=2;
  //判断从机是否发出 80us 的低电平响应信号是否结束 
    while((!RA4)&&U8FLAG++);
    U8FLAG=2;
  //判断从机是否发出 80us 的高电平,如发出则进入数据接收状态
    while((RA4)&&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;
//    LATA4=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;
       U8T_data_H=U8T_data_H_temp;
       U8T_data_L=U8T_data_L_temp;
       U8checkdata=U8checkdata_temp;
    }//fi
    }//fi  }
//----------------------------------------------
//main()功能描述:  AT89C51  11.0592MHz  串口发
//送温湿度数据,波特率 9600
//----------------------------------------------
void main()
{
 U8  i,j;
//  unsigned int T;
 initial();
 EUSART_Init();
// TRISAbits.TRISA4 = 0;
 while(1)
 {      //------------------------
    //调用温湿度读取子程序
    RH();
    //串口显示程序
    //--------------------------     str[0]=U8RH_data_H;
    str[1]=U8RH_data_L;
    str[2]=U8T_data_H;
    str[3]=U8T_data_L;
    str[4]=U8checkdata;
//    SendData(str) ;  //发送到串口 
    //读取模块数据周期不易小于 2S
//    Delay(20000);
    for(i = 0;i < 5;i++)
    {
   send_ch(str[i]);
  }
  Delay(20000);
 }//elihw
 
}