找回密码
 立即注册

QQ登录

只需一步,快速开始

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

基于51单片机的蓝牙温湿度测量控制程序 原理图PCB文件

[复制链接]
跳转到指定楼层
楼主
Altium Designer画的原理图和PCB图如下:(51hei附件中可下载工程文件)


程序流程图:


单片机源程序如下:
  1. #include<reg52.h>
  2. #include <stdio.h>
  3. extern unsigned char  F16T,F16RH;                //温湿度数据
  4. unsigned char Rx_buf[4],Rxnum=0,temp,rh;
  5. sbit LED1=P2^0;                                                //投停自动按键
  6. sbit LED2=P2^3;                                                //加温启启指示灯(如果要实现控制,可在这个端口加装上楼层电器模块)
  7. sbit LED3=P2^6;                                                //加湿启启指示灯(如果要实现控制,可在这个端口加装上楼层电器模块)
  8. sbit k1=P1^4;                                                //投停自动按键
  9. sbit k2=P1^5;                                                //加温启停按键
  10. sbit k3=P1^6;                                                //加湿启停按键
  11. sbit bit11=P1^1;                                        //DHT11传感器数据端
  12. unsigned char U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata;
  13. unsigned char F16T,F16RH,n;// read 8 bits onice

  14. void Delay_ms(unsigned int n)//n 毫秒延时
  15. {
  16.         unsigned char j;
  17.         while(n--)
  18.         {
  19.                 for(j=0;j<125;j++);
  20.         }
  21.     if(k1==0)                          //自动、手动切换按键按下判断处理
  22.         {
  23.             while(k1==0);          //再次判断按下否,当放开按键时
  24.                 if(LED1==1)                  //判断自动按停情况:1为手动 0为自动
  25.                 LED1=0;                          //切换为自动开
  26.                 else LED1=1;          //切换为自动关
  27.         }
  28.         if(LED1==1)                          //自动、手动判断 1为手动 0为自动
  29.         {
  30.             if(k2==0)                  //加热启停切换按键按下判断处理
  31.                 {
  32.                     while(k2==0); //再次判断按下否
  33.                         if(LED2==1)          //如果之前是 1为停止(加热关) 0为加热(加热开)
  34.                         LED2=0;                  //则切换为加热状态(加热开)
  35.                         else LED2=1;  //否则切换为停止加热状态(加热关)
  36.                 }
  37.                 if(k3==0)                  //加湿启停切换按键按下判断处理
  38.                 {
  39.                     while(k3==0); //再次判断按下否
  40.                         if(LED3==1)          //如果之前是 1为停止(加湿关) 0为加湿(加湿开)
  41.                         LED3=0;                  //则切换为加湿状态(加湿开)
  42.                         else LED3=1;  //否则切换为停止加湿状态(加湿关)
  43.                 }
  44.         }
  45.         else                                   //自动状态
  46.         {
  47.                  if(F16T>temp)          //温度大于设定值时
  48.                 {
  49.                     LED2=1;                  //停止加热(加热关)
  50.                 }
  51.                 else LED2=0;          //温度低于设定值时,开始加热(加热开)
  52.                 if(F16RH>rh)          //湿度大于设定值时
  53.                 {
  54.                    LED3=1;                  //停止加热(加热关)
  55.                 }
  56.                 else LED3=0;          //湿度低于设定值时,开始加湿(加湿开)
  57.         }
  58. }
  59. void Delay_us(unsigned char n)
  60. {
  61.         n=n/2;
  62.         while(--n);
  63. }//N us 延时函数

  64. //--------------------------------
  65. //-----温湿度读取子程序 ------------
  66. //--------------------------------
  67. //----以下变量均为全局变量--------
  68. //----温度高 8 位== U8T_data_H------
  69. //----温度低 8 位== U8T_data_L------
  70. //----湿度高 8 位== U8RH_data_H-----
  71. //----湿度低 8 位== U8RH_data_L-----
  72. //----校验 8 位 == U8checkdata-----
  73. //----调用相关子程序如下----------
  74. //---- Delay();, Delay_10us();,COM();
  75. //--------------------------------
  76. char  COM(void)
  77. {
  78.         char i,U8temp,U8comdata;           //用于最终读取的温湿度数据
  79.         for(i=0;i<8;i++)
  80.         {
  81.                 while(!bit11);               
  82.                 Delay_us(35);                        //表示读取的高电位延时大于 20 多 us 则读取的是 1 否则读取的是0
  83.                 U8temp=0;               
  84.                 if(bit11)U8temp=1;                //通过 U8FLAG可判断bit11 显示数据的脉长
  85.                 while(bit11);
  86.                 U8comdata<<=1;
  87.                 U8comdata|=U8temp;
  88.                 }//rof
  89.                 return    U8comdata;
  90.         }

  91. void getDHT11(void)
  92. {
  93.         GO1:bit11=0;
  94.         Delay_ms(20);                                 //主机拉低 18ms
  95.         bit11=1;                                        //总线由上拉电阻拉高 主机延时 20us
  96.         Delay_us(60);                                 //主机设为输入

  97.        
  98.         if(!bit11)                               //bit11=1;判断从机响应信号,判断从机是否有低电平响应信号
  99.         {
  100.                 while(!bit11);                        //如不响应则跳出,响应则向下运行
  101.                 while(bit11);
  102.                 U8RH_data_H=COM();                //数据接收状态
  103.                 U8RH_data_L=COM();
  104.                 U8T_data_H=COM();
  105.                 U8T_data_L=COM();
  106.                 U8checkdata=COM();
  107.                 bit11=1;               
  108.                 if((U8T_data_H+U8T_data_L+U8RH_data_H+U8RH_data_L)!=U8checkdata)   //数据校验
  109.                 goto  GO1;
  110.         }//fi
  111.         F16T=U8T_data_H+U8T_data_L/256;                                                                             //change integer to float
  112.         F16RH=U8RH_data_H+U8RH_data_L/256;
  113. }


  114. void InitUART(void)                                 //这是串口的基本配置,配置他的波特率是9600.这些参数都是标准的。
  115. {
  116.     TMOD = 0x20;
  117.     SCON = 0x50;
  118.     TH1 = 0xFD;
  119.     TL1 = TH1;
  120.     PCON = 0x00;
  121.     EA = 1;
  122.     ES = 1;
  123.     TR1 = 1;
  124. }

  125. /*
  126. * UART 发送一字节
  127. */
  128. void UART_send_byte(char dat)
  129. {
  130.         SBUF = dat;
  131.         while (TI == 0);
  132.         TI = 0;
  133. }

  134. /*
  135. * UART 发送字符串
  136. */
  137. void UART_send_string(unsigned char *buf)
  138. {
  139.         while (*buf != '\0')
  140.         {
  141.                 UART_send_byte(*buf++);
  142.         }
  143. }


  144. void main()
  145. {
  146.           unsigned char   Tx_Buf[12];
  147.           unsigned char LEDstatus;//灯的状态
  148.         InitUART();                        //初始化串口
  149.         temp=25;
  150.         rh=60;
  151.         while(1)       
  152.         {
  153.                   getDHT11();                                                 //获取温湿度值
  154.                   Tx_Buf[0]='T';                                                //帧头
  155.                   Tx_Buf[1]=F16T/10%10+0x30;                         //将温湿度数据送往发送数组,送给蓝牙模块让手机APP显示
  156.                   Tx_Buf[2]=F16T%10+0x30;               
  157.                   Tx_Buf[3]=F16RH/10%10+0x30;
  158.                   Tx_Buf[4]=F16RH%10+0x30;
  159.                   Tx_Buf[5]=temp/10%10+0x30;                         //将温湿度数据送往发送数组,送给蓝牙模块让手机APP显示
  160.                  Tx_Buf[6]=temp%10+0x30;               
  161.                   Tx_Buf[7]=rh/10%10+0x30;
  162.                  Tx_Buf[8]=rh%10+0x30;
  163.                   LEDstatus=LED1;
  164.                   Tx_Buf[9]=LEDstatus+0x30;                        //发送自动投停状态到APP显示
  165.                 LEDstatus=LED2;
  166.                 Tx_Buf[10]=LEDstatus+0x30;                    //发送加热状态到APP显示
  167.                 LEDstatus=LED3;
  168.                 Tx_Buf[11]=LEDstatus+0x30;                        //发送加湿状态到APP显示
  169.                   UART_send_string(Tx_Buf);                          //串口发送温湿度数据出去
  170.                 Delay_ms(1000);
  171.         }
  172. }

  173. /*****************串口接收中断函数,接收蓝牙模块的数据****************** ***/
  174. void UARTInterrupt(void) interrupt 4
  175. {       
  176.         ES=0;                                                                        //关闭中断
  177.     if(RI)                                                                          //接收到数据
  178.     {
  179.                 Rx_buf[Rxnum]=SBUF;                                  //接收数据进数组
  180.                 if(Rx_buf[Rxnum]==0x0A)
  181.                 Rxnum=0;
  182.                 else
  183.                 Rxnum++;
  184.                 if(Rx_buf[0]==0x31)                                        //接收到的APP传送来的手动、自动切换指令头部数据
  185.                 {
  186.                         if(Rx_buf[1]==0x30)                                //接收到的APP传送来的切换为自动指令
  187.                         LED1=0;                                                        //自动开
  188.                         if(Rx_buf[1]==0x31)                                //接收到的APP传送来的切换为手动指令
  189.                         LED1=1;                                                        //自动关       
  190.                 }
  191.                 if(Rx_buf[0]==0x32)                                        //接收到的APP传送来的加温指令头部数据
  192.                 {
  193.                         if(Rx_buf[1]==0x30)                                //接收到的APP传送来的加温开指令
  194.                         LED2=0;                                                        //加温开
  195.                         if(Rx_buf[1]==0x31)                                //接收到的APP传送来的加温关指令
  196.                         LED2=1;                                                        //加温关       
  197.                 }
  198.                 if(Rx_buf[0]==0x33)                                        //接收到的APP传送来的加湿指令头部数据
  199.                 {
  200.                         if(Rx_buf[1]==0x30)                                //接收到的APP传送来的加湿开指令
  201.                         {
  202.                                 LED3=0;                                                //加湿开
  203.                         }
  204.                         else
  205.                         if(Rx_buf[1]==0x31)                            //接收到的APP传送来的加湿开指令
  206.                         {
  207.                                 LED3=1;                                                //加湿关       
  208.                         }
  209.                 }
  210.                 if(Rx_buf[0]==0x34)                                   //接收到的APP传送来的温度设置指令头数据
  211.                 {
  212.                         if(Rx_buf[1]==0x31)                           //接收到的APP传送来的温度设置定值加1指令
  213.                         {
  214.                                 temp++;                                           //温度定值加1
  215.                                 if(temp>99)
  216.                                 temp=99;
  217.                         }
  218.                         if(Rx_buf[1]==0x30)                           //接收到的APP传送来的温度设置定值减1指令
  219.                         {
  220.                                 temp--;                                           //温度定值减1
  221.                                 if(temp<1)
  222.                                 temp=1;
  223.                     }
  224.                         Rx_buf[1]=0;                                   //清除指令
  225.                 }
  226.                 if(Rx_buf[0]==0x35)                                  //接收到的APP传送来的湿度设置指令头数据
  227.                 {
  228.                         if(Rx_buf[1]==0x31)                          //接收到的APP传送来的湿度设置定值加1指令
  229.                         {
  230.                                 rh++;                                          //湿度定值加1
  231.                                 if(rh>99)
  232.                                 rh=99;
  233.                         }
  234.                         if(Rx_buf[1]==0x30)                          //接收到的APP传送来的湿度设置定值减1指令
  235.                         {
  236.                                 rh--;                                          //湿度定值减1
  237.                                 if(rh<1)
  238.                                 rh=1;
  239.                         }
  240.                         Rx_buf[1]=0;                                  //清除指令
  241.                 }
  242.         }
  243.     RI=0;
  244.            ES=1;                                                                          //关闭中断
  245. }
复制代码

仿真: 无
代码原理图PCB: LY04A_蓝牙温湿度测量控制.7z (1.01 MB, 下载次数: 15)

评分

参与人数 1黑币 +50 收起 理由
admin + 50

查看全部评分

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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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