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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5869|回復: 5
打印 上一主題 下一主題
收起左側

stm32f4xx系列的DHT11+HCSR04超聲波+LCD1602顯示溫濕度和超聲波數值仿真程序

  [復制鏈接]
跳轉到指定樓層
樓主
先說這次的實驗:這次實驗歷經了差不多兩個周,所獲不少。最后實現了,還是有點小激動的,這同時也是我的課程設計。這次的設計主要是通過讀取DHT11和HCSR04的數值,(Proteus的傳感器貌似這兩款好用一點)把讀取的DHT11和HCSR04數值通過轉化在lcd1602中顯示出來,還有就是可以設置通過按鍵設置DHT11的溫濕度閾值。

仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)

運行結果圖:

按下K1,K2為加1設置,K3為減1設置

調整濕度最小值要為88%


濕度低于88%;警報響,紅燈亮

在調DHT11使它正常,同時也跳一下超聲波,看數據傳輸是否正常




當超過閾值時警報,紅燈亮起,綠燈滅。下面是主要代碼:

主要代碼:
  1. #include <stm32f4xx.h>
  2. #include "delay.h"
  3. #include "DHT11.h"
  4. #include "LCD1602.h"
  5. #include "SOUN.h"
  6. #include "KEY_ExitInit.h"
  7. #include "LED_INIT.h"
  8. #include "HCSR04.h"
  9. unsigned char move = 0x82;
  10. unsigned char RH,RL,TH,TL;
  11. unsigned char h0 = 0X38,h1 = 0X36;
  12. unsigned char t0 = 0X32,t1 = 0X38;
  13. unsigned char DATA[4];//存溫濕度數據
  14. unsigned char Leg[4];//存超聲波
  15. unsigned char R[7] = "SD:";
  16. unsigned char H[7] = "WD:";
  17. unsigned char L[7] = "Legth:";
  18. unsigned char r[2] = "%";
  19. unsigned char h[2] = "C";
  20. ////////////////////////// 讀DHT11數據及數據轉換 ///////////////////////////////////////
  21. int DHT11_ReadDATA(void)
  22. {
  23.         int i;
  24.         unsigned char RHTH[5]={0};
  25.         DHT11_Start();//開始信號

  26.         for(i=0;i<5;i++)
  27.         {
  28.           RHTH[i] = DHT11_ReadByte();//循環讀5次一字節  剛好40bit
  29.         }

  30.         if(RHTH[0]+RHTH[1]+RHTH[2]+RHTH[3] == RHTH[4])
  31.         {
  32.        RH = RHTH[0];
  33.            RL = RHTH[1];
  34.            TH = RHTH[2];
  35.            TL = RHTH[3];
  36.    DATA[0]='0'+(RH/10);//數據顯示處理
  37.    DATA[1]='0'+(RH%10);
  38.    DATA[2]='0'+(TH/10);
  39.    DATA[3]='0'+(TH%10);
  40.                 return 0;
  41.         }
  42.         else
  43.         {
  44.         
  45.                 return -1;
  46.         }
  47. }
  48. ///////////////////////////// END  //////////////////////////////////////////


  49. //////////////////////////// 獲取超聲波數據及轉換////////////////////////
  50. void HCSR04_data(void)
  51. {
  52.         int        a = 0;
  53.         a = HCSR04_GetLength();
  54.     Leg[0]='0'+(a/10);
  55.     Leg[1]='0'+(a%10);
  56.         a = a*100;
  57.         Leg[2] = '0'+(a%100)/10;
  58.         Leg[3] = '0';  // '0'+(a%1000) 只顯示到第三位,所以第四位寫入0
  59. }
  60. /////////////////////////// END ///////////////////////////////////////////


  61. //////////////////////////// 顯示設定的閾值 ////////////////////////////////
  62. void LCD_Config(void)
  63. {
  64.                     LCD_WRITE_StrDATA(1,1,"H:");
  65.                         LCD_WRITE_char(1,3,h0);
  66.                         LCD_WRITE_char(1,4,h1);
  67.                     LCD_WRITE_StrDATA(2,1,"T:");
  68.                         LCD_WRITE_char(2,3,t0);
  69.                         LCD_WRITE_char(2,4,t1);
  70.                  delay_ms(9);
  71. }
  72. ///////////////////////////  END ///////////////////////////////////////


  73. ////////////////////////////  顯示溫濕度和超聲波數值,及超過閾值后警報 ///////////////////////////////////
  74. void LCD_Show(void)
  75. {
  76.    while(1)
  77.         {
  78.                 HCSR04_data();
  79.                 delay_ms(30);

  80.                 if(DHT11_ReadDATA() == 0)//讀取溫濕度成功
  81.                 {
  82.                         delay_ms(80);
  83.             LCD_WRITE_CMD( 0x0C );                        
  84.                         DHT11_ReadDATA();        //接受數據
  85.                         LCD_WRITE_StrDATA(1,1,R);
  86.                         LCD_WRITE_StrDATA(2,1,H);
  87.                         LCD_WRITE_char(1,4,DATA[0]);
  88.                         LCD_WRITE_char(1,5,DATA[1]);
  89.                         LCD_WRITE_StrDATA(1,6,r);
  90.                         LCD_WRITE_StrDATA(1,9,L);
  91.                         
  92.                         LCD_WRITE_char(2,4,DATA[2]);
  93.                         LCD_WRITE_char(2,5,DATA[3]);
  94.                         LCD_WRITE_char(2,6,0XDF);
  95.                         LCD_WRITE_StrDATA(2,7,h);
  96.                         
  97.                         LCD_WRITE_char(2,9,Leg[0]);
  98.                         LCD_WRITE_char(2,10,Leg[1]);
  99.                         LCD_WRITE_char(2,11,0xA5);
  100.                         LCD_WRITE_char(2,12,Leg[2]);
  101.                         LCD_WRITE_char(2,13,Leg[3]);
  102.                         LCD_WRITE_StrDATA(2,14,"cm");
  103.                 }        
  104.                 if(RH > ((h0-0x30)*10+(h1-0x30))|| TH < ((t0-0x30)*10+(t1-0x30)) )//正常
  105.                 {
  106.                   GPIO_SetBits(GPIOC,GPIO_Pin_7);
  107.                   GPIO_ResetBits(GPIOC,GPIO_Pin_6);
  108.                   GPIO_SetBits(GPIOB,GPIO_Pin_7);
  109.                   
  110.                 }
  111.                 if(RH <= ((h0-0x30)*10+(h1-0x30))|| TH >= ((t0-0x30)*10+(t1-0x30)) ) //警報
  112.                 {
  113.                   GPIO_SetBits(GPIOC,GPIO_Pin_6);
  114.                   GPIO_ResetBits(GPIOC,GPIO_Pin_7);
  115.                   GPIO_ResetBits(GPIOB,GPIO_Pin_7);
  116.                 }
  117.                
  118.         }        

  119. }
  120. ///////////////////////////   END  ///////////////////////////////////


  121. /////////////////////// 中斷服務函數 ,第一個按鍵切換顯示+光標移動////////////////////////////////////////
  122. void EXTI0_IRQHandler(void)
  123. {
  124.         static int Flag = 1;
  125.         switch (Flag)
  126.         {
  127.                 case 1:
  128.                   LCD_WRITE_CMD( 0x01 );  //清楚顯示
  129.                   LCD_WRITE_CMD( 0x0f );  //開啟光標、顯示、閃爍
  130.           LCD_Config();             //切換顯示
  131.                   LCD_WRITE_CMD( move );
  132.                 delay_ms(5);break;
  133.                 case 2:
  134.                   LCD_WRITE_CMD( 0x0f );
  135.                   move ++;               //光標移動
  136.                   LCD_WRITE_CMD( move );
  137.                   delay_ms(5);break;
  138.                 case 3:
  139.                    LCD_WRITE_CMD( 0x0f );
  140.                    move += 0x3f;
  141.                    LCD_WRITE_CMD( move );
  142.                 delay_ms(5);break;
  143.                 case 4:
  144.                    LCD_WRITE_CMD( 0x0f );
  145.                    move ++;
  146.                    LCD_WRITE_CMD( move );
  147.                 delay_ms(5);break;
  148.                 case 5:
  149.                    move = 0x82;         //光標復位
  150.                LCD_WRITE_CMD( 0x01 );
  151.                LCD_WRITE_CMD( 0x0C );
  152.                LCD_Show();
  153.                Flag = 0;
  154.                 delay_ms(5);break;
  155.         }
  156.         Flag ++;
  157.     EXTI_ClearITPendingBit(EXTI_Line0);
  158. }

  159. /////////////////////////  中斷0 END ///////////////////////////////////


  160. /////////////////////////   中斷 1  閾值加1 ///////////////////////////
  161. void EXTI1_IRQHandler(void)
  162. {
  163.         if(move == 0x82)    //判斷光標位置
  164.         {
  165.           if((h0-0x30) >= 9)
  166.       {
  167.                   h0 = 0x30;
  168.           }        
  169.       else
  170.       {
  171.                   h0 ++;
  172.           }         
  173.         }
  174.                 if(move == 0x83)  //判斷光標位置
  175.                 {
  176.                   if((h1-0x30) >= 9)
  177.                   {
  178.                           h1 = 0x30;
  179.                   }        
  180.                   else
  181.                   {
  182.                           h1 ++;
  183.                   }
  184.                  }         
  185.      if(move == 0xc2)  //判斷光標位置
  186.         {
  187.           if((t0-0x30) >= 9)
  188.       {
  189.                   t0 = 0x30;
  190.           }        
  191.       else
  192.       {
  193.                   t0 ++;
  194.           }                  
  195.          }        
  196.                 if(move == 0xc3)  //判斷光標位置
  197.                 {
  198.                   if((t1-0x30) >= 9)
  199.                   {
  200.                           t1 = 0x30;
  201.                   }        
  202.                   else
  203.                   {
  204.                           t1 ++;
  205.                   }                  
  206.                 }
  207.   LCD_WRITE_CMD( 0x0c );    //為了看清楚,關閉光標的閃爍功能
  208.   LCD_Config();                   //顯示
  209.   delay_ms(5);                 
  210.   EXTI_ClearITPendingBit(EXTI_Line1);
  211. }
  212. ////////////////////////////// 中斷1 END ///////////////////////////////////////


  213. ///////////////////////////// 中斷 2  閾值加1 ////////////////////////////////
  214. void EXTI2_IRQHandler(void)
  215. {
  216.     if(move == 0x82)
  217.         {
  218.           if((h0-0x30) == 0)
  219.       {
  220.                   h0 = 0x39;
  221.           }        
  222.       else
  223.       {
  224.                   h0 --;
  225.           }                  
  226.         }
  227.                 if(move == 0x83)
  228.                 {
  229.                   if((h1-0x30) == 0)
  230.                   {
  231.                           h1 = 0x39;
  232.                   }        
  233.                   else
  234.                   {
  235.                           h1 --;
  236.                   }
  237.                  }         
  238.      if(move == 0xc2)
  239.         {
  240.           if((t0-0x30) == 0)
  241.       {
  242.                   t0 = 0x39;
  243.           }        
  244.       else
  245.       {
  246.                   t0 --;
  247.           }                  
  248.          }        
  249.                 if(move == 0xc3)
  250.                 {
  251.                   if((t1-0x30) == 0)
  252.                   {
  253.                           t1 = 0x39;
  254.                   }        
  255.                   else
  256.                   {
  257.                           t1 --;
  258.                   }                  
  259.                 }
  260.     LCD_WRITE_CMD( 0x0c );
  261.     LCD_Config();
  262.     delay_ms(5);               
  263.         EXTI_ClearITPendingBit(EXTI_Line2);
  264. }
  265. ///////////////////////////// 中斷 2  END //////////////////////////////////////


  266. int main()
  267. {
  268.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
  269.         Systick_init();//滴答定時器的初始化---精準延時
  270.         LED_INIT();    //警報燈
  271.         SOUN_INIT();    //蜂鳴器
  272.         
  273.         KEY_ExitInit();  //中斷gpio口初始化
  274.         LCD_INIT();   //LCD1602初始化
  275.         
  276.         HCSR04_GPIO();  //超聲波gpio口初始化
  277.         HCSR04_TIM2_Config();   //定時器2設置
  278.         TIM2_IRQHandler();    //定時器中斷函數
  279.         
  280.     LCD_Show();   //lcd1602顯示
  281.    return 0;
  282. }
復制代碼


結束;
這次的實驗也有不足的地方,代碼也有待優化,有一些瑕疵,借此拋磚引玉,希望大家能提出建議!!

全部資料51hei下載地址:
keil 5工程 + Proteus工程.7z (98.08 KB, 下載次數: 295)



評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏8 分享淘帖 頂2 踩
回復

使用道具 舉報

沙發
ID:302325 發表于 2020-6-24 12:00 | 只看該作者
51黑  有你更精彩        
回復

使用道具 舉報

板凳
ID:779099 發表于 2020-7-3 15:46 | 只看該作者
麻煩問一下這代碼只能在keil5運行嗎?
回復

使用道具 舉報

地板
ID:780517 發表于 2020-7-7 09:39 | 只看該作者
東坡是我家男神 發表于 2020-7-3 15:46
麻煩問一下這代碼只能在keil5運行嗎?

keil4 mdk 也可以   只不過你要安裝相對應當stm32包
回復

使用道具 舉報

5#
ID:844192 發表于 2021-6-28 23:22 | 只看該作者
樓主請問一下這個報警溫度怎么修改 就是超過多少修改這是哪里
回復

使用道具 舉報

6#
ID:1115961 發表于 2024-4-24 09:45 | 只看該作者
51黑  有你更精彩        
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 综合中文字幕 | 亚洲综合色视频在线观看 | 亚洲 成人 av | 精品国产乱码久久久久久1区2区 | h小视频 | 久久人人网 | 日本三级在线视频 | 成人免费一级 | 日韩网站免费观看 | 欧美成人一区二区 | 久久成人精品一区二区三区 | 日韩福利在线观看 | 国产精品一区二区三区四区五区 | 一级大片网站 | 日韩at| 久久久久久影院 | 欧美一区二区在线播放 | 日韩欧美在线观看视频 | 日韩精品免费视频 | 欧美日高清 | 国产精品一区在线观看 | 女女百合av大片一区二区三区九县 | 农村黄性色生活片 | 精品国产成人 | 热久久免费视频 | 欧美日韩精品久久久免费观看 | 欧美激情在线一区二区三区 | 国产sm主人调教女m视频 | 久久久久久国产精品mv | 欧美在线a | 亚洲欧美视频在线观看 | 免费看a | 超碰最新在线 | 国产亚洲一区精品 | 91视视频在线观看入口直接观看 | 国产欧美一区二区三区免费 | 欧美另类视频 | 91久久婷婷 | 成年人在线观看 | 黄色一级电影免费观看 | 国产一区二区影院 |