找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1042|回复: 0
打印 上一主题 下一主题
收起左侧

温湿度传感器驱动源码

[复制链接]
跳转到指定楼层
楼主
ID:395175 发表于 2018-9-7 23:11 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
//****************************************************************//
//           DHT21使用范例
//单片机 AT89S52 或 STC89C52RC
//功能   串口发送温湿度数据 晶振 11.0592M 波特率 9600
//硬件   P2.0口为通讯口连接DHT11,DHT11的电源和地连接单片机的电源和地,单片机串口加MAX232连接电脑
//公司  雁凌电子   
//****************************************************************//

#include <reg51.h>
#include <intrins.h>
//
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

//----------------------------------------------//
//----------------IO口定义区--------------------//
//----------------------------------------------//
sbit  P2_0  = P1^0 ;

//----------------------------------------------//
//----------------定义区--------------------//
//----------------------------------------------//
U8  U8FLAG,k;
U8  U8count,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;
U8  outdata[5];  //定义发送的字节数          
U8  indata[5];
U8  count, count_r=0;
U8  str[5]={"RS232"};
U16 U16temp1,U16temp2;
SendData(U8 *a)
{
        U8 i=0,j=0,sum=0;
       
       
       
        ES=0;
        for(i=0;i<5;i++)
        {
                SBUF = a[i];
                while(!TI);
                TI=0;
        }

       
        TI=0;
        ES=1;
}

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  COM(void)//获取数据
      {   
                U8 i;         
                                        for(i=0;i<8;i++)          
                                        {               
                                                U8FLAG=2;       
                                                while((!P2_0)&&U8FLAG++);//等待高电平
                                                Delay_10us();
                                                Delay_10us();
                                                Delay_10us();
                                                U8temp=0;   //判断数据位是0还是1
                                                if(P2_0)    // 如果高电平时间超过预定0的高电平时间则为数据1
                                                        U8temp=1;
                                                U8FLAG=2;
                                                while((P2_0)&&U8FLAG++);//等待低电平
                                                //超时则跳出for循环                  
                                                if(U8FLAG==1)
                                                        break;                                                                              
                                                U8comdata<<=1;
                                                U8comdata|=U8temp;        //0
                                        }
                        }

        //--------------------------------
        //-----湿度读取子程序 ------------
        //--------------------------------
        //----以下变量均为全局变量--------
        //----温度高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)//读取温湿度
        {
          //主机拉低18ms
     P2_0=0;
           Delay(180);
           P2_0=1;
         //总线由上拉电阻拉高 主机延时20us
           Delay_10us();
           Delay_10us();
           Delay_10us();
           Delay_10us();
         //主机设为输入 判断从机响应信号
           P2_0=1;
         //判断从机是否有低电平响应信号 如不响应则跳出,响应则向下运行          
           if(!P2_0)                 //T !          
           {
                         U8FLAG=2;
                 //判断从机是否发出 80us 的低电平响应信号是否结束         
                         while((!P2_0)&&U8FLAG++);//等待高电平
                         U8FLAG=2;
                 //判断从机是否发出 80us 的高电平,如发出则进入数据接收状态
                         while((P2_0)&&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;//校验
                         P2_0=1;
                 //数据校验          
                         U8temp=(U8T_data_H_temp+U8T_data_L_temp+U8RH_data_H_temp+U8RH_data_L_temp);
                         if(U8temp==U8checkdata_temp)
                         {
                                        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;
                         }
           }

        }
       
//----------------------------------------------
//main()功能描述:  AT89C51  11.0592MHz         串口发
//送温湿度数据,波特率 9600
//----------------------------------------------
void Init_com()
{
        /* 系统初始化 */
        TMOD = 0x20;          //定时器T1使用工作方式2
        TH1 = 253;        // 设置初值
        TL1 = 253;
        TR1 = 1;          // 开始计时
        SCON = 0x50;          //工作方式1,波特率9600bps,允许接收   
        ES = 1;
        EA = 1;           // 打开所以中断   
        TI = 0;
        RI = 0;
        SendData(str) ;   //发送到串口
//        P0=0x00;
//        Delay(1);         //延时100US(12M晶振)
}
void main()
{
        Init_com();                                 //串口初始化
        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);
        }
}

void RSINTR() interrupt 4 using 2
{
        U8 InPut3;
        if(TI==1) //发送中断          
        {
                TI=0;
                if(count!=5) //发送完5位数据         
                {
                        SBUF= outdata[count];
                        count++;
                }
        }

        if(RI==1)         //接收中断                  
        {       
                InPut3=SBUF;
                indata[count_r]=InPut3;
                count_r++;
                RI=0;                                                                 
                if (count_r==5)//接收完4位数据
                {
                //数据接收完毕处理。
                        count_r=0;                               
                }
        }
}


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表