• DHL11温湿度模块代码


      1 //****************************************************************//
      2 //                    DHT21使用范例 
      3 //单片机 : AT89S52 或 STC89C52RC 
      4 // 功能  :串口发送温湿度数据  波特率 9600 
      5 //硬件连接: P2.0口为通讯口连接DHT11,DHT11的电源和地连接单片机的电源和地,单片机串口加MAX232连接电脑 
      6 // 公司  :奥松电子    
      7 //****************************************************************//
      8 
      9 #include <reg51.h>
     10 #include <intrins.h> 
     11 //
     12 typedef unsigned char  U8;       /* defined for unsigned 8-bits integer variable       无符号8位整型变量  */
     13 typedef signed   char  S8;       /* defined for signed 8-bits integer variable          有符号8位整型变量  */
     14 typedef unsigned int   U16;      /* defined for unsigned 16-bits integer variable       无符号16位整型变量 */
     15 typedef signed   int   S16;      /* defined for signed 16-bits integer variable       有符号16位整型变量 */
     16 typedef unsigned long  U32;      /* defined for unsigned 32-bits integer variable       无符号32位整型变量 */
     17 typedef signed   long  S32;      /* defined for signed 32-bits integer variable       有符号32位整型变量 */
     18 typedef float          F32;      /* single precision floating point variable (32bits) 单精度浮点数(32位长度) */
     19 typedef double         F64;      /* double precision floating point variable (64bits) 双精度浮点数(64位长度) */
     20 //
     21 #define uchar unsigned char
     22 #define uint unsigned int
     23 #define   Data_0_time    4
     24 
     25 //----------------------------------------------//
     26 //----------------IO口定义区--------------------//
     27 //----------------------------------------------//
     28 sbit  P2_0  = P2^0 ;
     29 sbit  P2_1  = P2^1 ;
     30 sbit  P2_2  = P2^2 ;
     31 sbit  P2_3  = P2^3 ;
     32 //----------------------------------------------//
     33 //----------------定义区--------------------//
     34 //----------------------------------------------//
     35 U8  U8FLAG,k;
     36 U8  U8count,U8temp;
     37 U8  U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata;
     38 U8  U8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_temp;
     39 U8  U8comdata;
     40 U8  outdata[5];  //定义发送的字节数       
     41 U8  indata[5];
     42 U8  count, count_r=0;
     43 U8  str[5]={"RS232"};
     44 U16 U16temp1,U16temp2;
     45 SendData(U8 *a)
     46 {
     47     outdata[0] = a[0]; 
     48     outdata[1] = a[1];
     49     outdata[2] = a[2];
     50     outdata[3] = a[3];
     51     outdata[4] = a[4];
     52     count = 1;
     53     SBUF=outdata[0];
     54 }
     55 
     56        void Delay(U16 j)
     57     {      U8 i;
     58         for(;j>0;j--)
     59       {     
     60         for(i=0;i<27;i++);
     61 
     62       }
     63     }
     64        void  Delay_10us(void)
     65       {
     66         U8 i;
     67         i--;
     68         i--;
     69         i--;
     70         i--;
     71         i--;
     72         i--;
     73        }
     74     
     75         void  COM(void)
     76       {
     77      
     78             U8 i;
     79        for(i=0;i<8;i++)       
     80         {
     81         
     82                U8FLAG=2;
     83            //----------------------
     84              P2_1=0 ;  //T
     85              P2_1=1 ;  //T
     86         //---------------------- 
     87     
     88            while((!P2_0)&&U8FLAG++);
     89             Delay_10us();
     90             Delay_10us();
     91         //    Delay_10us();
     92               U8temp=0;
     93          if(P2_0)U8temp=1;
     94             U8FLAG=2;
     95          while((P2_0)&&U8FLAG++);
     96              
     97         //----------------------
     98               P2_1=0 ;  //T
     99               P2_1=1 ;  //T
    100        //----------------------
    101            //超时则跳出for循环          
    102             if(U8FLAG==1)break;
    103            //判断数据位是0还是1     
    104               
    105         // 如果高电平高过预定0高电平值则数据位为 1 
    106             
    107            U8comdata<<=1;
    108               U8comdata|=U8temp;        //0
    109          }//rof
    110        
    111     }
    112 
    113     //--------------------------------
    114     //-----湿度读取子程序 ------------
    115     //--------------------------------
    116     //----以下变量均为全局变量--------
    117     //----温度高8位== U8T_data_H------
    118     //----温度低8位== U8T_data_L------
    119     //----湿度高8位== U8RH_data_H-----
    120     //----湿度低8位== U8RH_data_L-----
    121     //----校验 8位 == U8checkdata-----
    122     //----调用相关子程序如下----------
    123     //---- Delay();, Delay_10us();,COM(); 
    124     //--------------------------------
    125 
    126     void RH(void)
    127     {
    128       //主机拉低18ms 
    129        P2_0=0;
    130        Delay(180);
    131        P2_0=1;
    132      //总线由上拉电阻拉高 主机延时20us
    133        Delay_10us();
    134        Delay_10us();
    135        Delay_10us();
    136        Delay_10us();
    137      //主机设为输入 判断从机响应信号 
    138        P2_0=1;
    139      //判断从机是否有低电平响应信号 如不响应则跳出,响应则向下运行      
    140        if(!P2_0)         //T !      
    141        {
    142        U8FLAG=2;
    143      //判断从机是否发出 80us 的低电平响应信号是否结束     
    144        while((!P2_0)&&U8FLAG++);
    145        U8FLAG=2;
    146      //判断从机是否发出 80us 的高电平,如发出则进入数据接收状态
    147        while((P2_0)&&U8FLAG++);
    148      //数据接收状态         
    149        COM();
    150        U8RH_data_H_temp=U8comdata;
    151        COM();
    152        U8RH_data_L_temp=U8comdata;
    153        COM();
    154        U8T_data_H_temp=U8comdata;
    155        COM();
    156        U8T_data_L_temp=U8comdata;
    157        COM();
    158        U8checkdata_temp=U8comdata;
    159        P2_0=1;
    160      //数据校验 
    161      
    162        U8temp=(U8T_data_H_temp+U8T_data_L_temp+U8RH_data_H_temp+U8RH_data_L_temp);
    163        if(U8temp==U8checkdata_temp)
    164        {
    165              U8RH_data_H=U8RH_data_H_temp;
    166              U8RH_data_L=U8RH_data_L_temp;
    167           U8T_data_H=U8T_data_H_temp;
    168              U8T_data_L=U8T_data_L_temp;
    169              U8checkdata=U8checkdata_temp;
    170        }//fi
    171        }//fi
    172 
    173     }
    174     
    175 //----------------------------------------------
    176 //main()功能描述:  AT89C51  11.0592MHz     串口发 
    177 //送温湿度数据,波特率 9600 
    178 //----------------------------------------------
    179 void main()
    180 {
    181     U8  i,j;
    182     
    183     //uchar str[6]={"RS232"};
    184     /* 系统初始化 */
    185     TMOD = 0x20;      //定时器T1使用工作方式2
    186     TH1 = 253;        // 设置初值
    187     TL1 = 253;
    188     TR1 = 1;          // 开始计时
    189     SCON = 0x50;      //工作方式1,波特率9600bps,允许接收   
    190     ES = 1;
    191     EA = 1;           // 打开所以中断   
    192     TI = 0;
    193     RI = 0;
    194     SendData(str) ;   //发送到串口 
    195     Delay(1);         //延时100US(12M晶振)
    196     while(1)
    197     {  
    198 
    199        //------------------------
    200        //调用温湿度读取子程序 
    201        RH();
    202        //串口显示程序 
    203        //--------------------------
    204 
    205        str[0]=U8RH_data_H;
    206        str[1]=U8RH_data_L;
    207        str[2]=U8T_data_H;
    208        str[3]=U8T_data_L;
    209        str[4]=U8checkdata;
    210        SendData(str) ;  //发送到串口  
    211        //读取模块数据周期不易小于 2S 
    212        Delay(20000);
    213     }//elihw
    214     
    215 }// main
    216 
    217 void RSINTR() interrupt 4 using 2
    218 {
    219     U8 InPut3;
    220     if(TI==1) //发送中断      
    221     {
    222         TI=0;
    223         if(count!=5) //发送完5位数据     
    224         {
    225             SBUF= outdata[count];
    226             count++;
    227         }
    228     }
    229 
    230     if(RI==1)     //接收中断          
    231     {    
    232         InPut3=SBUF;
    233         indata[count_r]=InPut3;
    234         count_r++;
    235         RI=0;                                 
    236         if (count_r==5)//接收完4位数据 
    237         {
    238         //数据接收完毕处理。
    239             count_r=0;
    240         str[0]=indata[0];
    241          str[1]=indata[1];
    242            str[2]=indata[2];
    243              str[3]=indata[3];
    244                  str[4]=indata[4];
    245                  P0=0;
    246         }
    247     }
    248 }
  • 相关阅读:
    递归 例子 c
    Static和extern关键字 c
    typedef的作用
    预编译指令包括:宏定义;条件编译;文件包含(就是include)
    枚举 c
    结构体 可以由多个不同类型的数据构成
    变量类型 c
    指针类型:非常重要 c
    设计模式学习--原型模式
    设计模式学习--工厂方法模式
  • 原文地址:https://www.cnblogs.com/zhouyuqing1024/p/12096037.html
Copyright © 2020-2023  润新知