久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1288|回復: 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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日本在线播放一区二区 | 色综合99 | 国产激情视频网址 | 99视频| 性高朝久久久久久久3小时 av一区二区三区四区 | 一级片在线观看 | 在线视频三区 | 亚洲国产欧美一区 | 欧美久久影院 | 中文字幕加勒比 | 99亚洲精品| 在线观看成年视频 | 午夜小视频在线播放 | 婷婷综合色| 午夜视频在线免费观看 | 国产精品69久久久久水密桃 | 男人的天堂在线视频 | 91看片| 国产午夜精品一区二区三区嫩草 | 国产精品久久国产精品 | 日韩欧美亚洲 | 欧美xxxx黑人又粗又长 | 免费国产一区 | 国产精品福利网站 | 鲁大师一区影视 | 国产日韩精品一区 | 国产在线精品区 | 久亚州在线播放 | 久久久久资源 | 亚洲+变态+欧美+另类+精品 | 乱码av午夜噜噜噜噜动漫 | 亚洲一区二区精品视频在线观看 | 欧美第一区 | 麻豆一区二区三区精品视频 | 99久热| 欧美乱做爰xxxⅹ久久久 | 国产精品一区在线观看你懂的 | 激情 一区 | 91亚洲精| 成人自拍视频 | 欧美日韩在线精品 |