找回密码
 立即注册

QQ登录

只需一步,快速开始

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

蓝牙温湿度监测系统设计 单片机程序+原理+仿真

[复制链接]
跳转到指定楼层
楼主
//****************************************************************//
//       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  = P2^0 ;
sbit  LED = P3^7;
extern void InitLcd1602();
extern void LcdShowStr(unsigned char x, unsigned char y, unsigned char *str);
void ConfigUART(unsigned int baud);
//----------------------------------------------//
//----------------定义区--------------------//
//----------------------------------------------//
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 str_T[15];
U8 str_H[15];



       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;
         if(P2_0)U8temp=1;
            U8FLAG=2;
         while((P2_0)&&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)
    {
      //主机拉低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;
       }//fi
       }//fi

    }
//向串口发送一个字符  
void send_char_com(unsigned char ch)
  {     
  SBUF=ch;   
  while(TI==0);   
  TI=0;
  }
//向串口发送一个字符串,strlen为该字符串长度   
void send_string_com(unsigned char *str,unsigned int strlen)
{
   unsigned int k=0;   
   do
   {  
   send_char_com(*(str + k));   
   k++;     
   }
   while(k < strlen);
}
   
//----------------------------------------------
//main()功能描述:  AT89C51  11.0592MHz     串口发
//送温湿度数据,波特率 9600
//----------------------------------------------
void main()
{   
    ConfigUART(9600);  //配置波特率为9600
    InitLcd1602();     //初始化液晶

    while(1)
    {  

       //------------------------
       //调用温湿度读取子程序
       RH();
       //串口显示程序
       //--------------------------
       str_T[0] = 'T';
       str_T[1] = 'e';
       str_T[2] = 'm';
       str_T[3] = ':';                         // 温度
       str_T[4]=U8T_data_H%100/10+0x30;    // 整数十位
       str_T[5]=U8T_data_H%10+0x30;        // 整数个位
       str_T[6] = '.';  
       str_T[7]=U8T_data_L%100/10+0x30;    // 小数后一位
       str_T[8]=U8T_data_L%10+0x30;        // 小数后两位
       str_T[9] = ' ' ;
       str_T[10] = 'C' ;
       str_T[11] = ' ' ;
       str_T[12] = ' ' ;
      
       str_H[0] = 'H';
       str_H[1] = 't';
       str_H[2] = 'y';
       str_H[3] = ':';                       // 湿度
       str_H[4]=U8RH_data_H%100/10+0x30;   // 整数十位
       str_H[5]=U8RH_data_H%10+0x30;          // 整数个位
       str_H[6] = '.';
       str_H[7]=U8RH_data_L%100/10+0x30;      // 小数后一位
       str_H[8]=U8RH_data_L%10+0x30;          // 小数后两位
       str_H[9]= ' ';
       str_H[10]= '%';
       str_H[11]= 'R';
       str_H[12]= 'H';
       str_H[13]= ' ';
       str_H[14]= ' ';      
       str_H[15]= '\x0a';                                    
      
       send_string_com(str_T,13);
       send_string_com(str_H,16);

       LcdShowStr(0, 0, str_T);        //显示到液晶屏上
       LcdShowStr(0, 1, str_H);        //显示到液晶屏上
       LED =~LED;
       //读取模块数据周期不宜小于 2S
       Delay(20000);
    }//elihw
   
}

/* 串口配置函数,baud-通信波特率 */
void ConfigUART(unsigned int baud)
{
    SCON  = 0x50;  //配置串口为模式1
    TMOD &= 0x0F;  //清零T1的控制位
    TMOD |= 0x20;  //配置T1为模式2
    TH1 = 256 - (11059200/12/32)/baud;  //计算T1重载值
    TL1 = TH1;     //初值等于重载值
    ET1 = 0;       //禁止T1中断
    TR1 = 1;       //启动T1
}


51hei截图_20200529100941.png (230.94 KB, 下载次数: 37)

51hei截图_20200529100941.png
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:707687 发表于 2020-6-23 00:13 | 只看该作者
有文件吗,求文件
回复

使用道具 举报

板凳
ID:769099 发表于 2020-6-23 09:51 | 只看该作者
真不错,谢谢楼主
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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