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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機SHT11濕度傳感器的濕度顯示仿真程序(可存儲檢索8K歷史信息)詳細注釋

[復制鏈接]
跳轉到指定樓層
樓主
       由于最近的設計,花費不少心思做出了這個系統,雖然很簡單,但是還是想發出來一下。當初在找資料的時候,也辛虧是這個平臺的老前輩們的資料拯救了我,現在仿真做完了,調試也沒什么問題,就發上去給做個留念,也留給下一個像我一樣需要的人。       該系統有5個模塊,單片機主體、L298驅動電機模塊、SHT11濕度傳感器模塊、RAM6264存儲濕度模塊以及按鍵切換模式模塊;該系統功能是:濕度傳感器采集濕度信息經過51單片機處理,顯示于LCD1602液晶顯示屏上,當按下濕度傳感器下方按鈕,即可存儲濕度信息進RAM6264存儲器(此處是仿真專用按鈕,現實中要實現存儲需要設置一個定時),當濕度小于設定值,L298驅動直流電機轉動啟動澆水功能;當按下功能按鈕,可切換當前濕度模式和歷史檢索模式,另外兩個按鈕在歷史檢索模式下發揮作用,用于檢索上一條和下一條。另外復位電路還模擬了一個檢測陰天的復位電路,當為陰天時,則為開關按下,電路進行復位,電機停止。

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


單片機源程序如下(程序帶有非常詳細的注釋):
  1. #include <reg52.h>                                        //特殊功能寄存器地址的聲明的頭文件,如P0-P3口的地址
  2. #include <intrins.h>                                //單片機內部頭文件,包含很多邏輯指令,如左右移指令crol,空指令nop等
  3. #include <math.h>                                   //數學公式頭文件,如開方sqrt
  4. #include <stdio.h>                                        //標準輸入輸出頭文件,如print,scanf
  5. #include <1602.h>                                                //LCD1602液晶顯示屏的頭文件,用來顯示當前濕度和歷史濕度
  6. #include <sht11.h>                                        //濕度傳感器頭文件,用來采集濕度信息
  7. #include <absacc.h>                                        //絕對地址訪問頭文件,如XBYTE

  8. #define uchar unsigned char                //宏定義8位無符號整型,最大256
  9. #define uint  unsigned  int                //宏定義16位無符號整型,最大65536
  10. #define RAM_6264 XBYTE[RAMADDR]  //6264地址范圍8000H-9FFFH

  11. uint RAMADDR  ;               //定義6264的地址
  12. uint humi;                                                                                 //定義濕度
  13. value humi_val;                                             //定義整型和浮點型共同體  humi_val
  14. uchar error;                                                //用于檢驗是否出現錯誤
  15. uchar checksum;                     //CRC:循環冗余校驗碼
  16. uchar HUMI_data[6];                  //該數組存放采集到的濕度信息
  17. uchar humi_lowest=15.5;                                //濕度若小于設定的15.5%時,就啟動電機澆水
  18. uchar humi_search;                                           //用于檢索歷史濕度
  19. uchar show_humi[5];                                                //該數組存放顯示歷史濕度的信息
  20. uchar presskeynum;                                    //按鍵次數變量
  21. uchar last_humi;                                                  //上一條濕度信息
  22. uchar next_humi;                                                  //下一條濕度信息
  23. uchar code word1[]={"  a product of  "};                //開機LCD顯示單詞
  24. uchar code word2[]={"  Humi  Display "};                //開機LCD顯示單詞
  25. uchar code word3[]={" Welcome........"};                //開機LCD顯示單詞

  26. sbit k1=P1^0;                                                                 //切換模式按鍵
  27. sbit k2=P1^1;                                                                 //上一條濕度信息查詢按鈕
  28. sbit k3=P1^2;                                                                 //下一條濕度信息查詢按鈕
  29. sbit k4=P1^3;                                                                        //存儲濕度信息仿真鍵
  30. sbit IN1=P1^5;                                                                //電機驅動,和IN2相反狀態時啟動
  31. sbit IN2=P1^6;                                                                //電機驅動,和IN1相反狀態時啟動
  32. sbit ENA=P1^7;                                                                //短接時電機全速啟動

  33. //********延時函數*********//
  34. void delay(uint z)  //z為毫秒數
  35. {
  36.      int a,b;
  37.      for(a=z;a>0;a--)
  38.      for(b=120;b>0;b--);
  39. }
  40. /************************************************************************/
  41. //函數名:key
  42. //功能:按鍵切換兩種模式(顯示模式和歷史查詢模式);查詢上下條濕度信息
  43. /************************************************************************/
  44. void key()
  45. {  
  46.      if (k1==0)                                                         //查詢按鍵是否被按下
  47.      {
  48.          delay(30);                                         //消抖,30ms檢查是否是誤觸
  49.          if (k1==0)                                         //當按鍵被按下
  50.          {
  51.              presskeynum++;                  //按鍵次數加一,切換模式
  52.              if(presskeynum==2)        //因為只有兩個模式,當再次按下按鍵,按鍵次數就會回到0
  53.              presskeynum=0;                        //因為只有兩個模式,當再次按下按鍵,按鍵次數就會回到0
  54.              while(k1==0);            //按鍵不被松開就一直循環
  55.              LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN);   //清屏
  56.          }
  57.                  }  
  58.                                         if(presskeynum==1)                                        //查詢歷史濕度模式
  59.          {               
  60.               if(k2==0)                                                          //查詢上一條濕度按鍵是否被按下
  61.               {
  62.                   delay(30);                                        //消抖,30ms檢查是否是誤觸
  63.                   RAMADDR--;                                  //存儲器中指針向前移動一位
  64.                   if (RAMADDR<0x8000)        //如果指針指向第一位
  65.                                                                         {
  66.                   RAMADDR=0x8000;                        //那么指針就停在第一位
  67.                                                                         }
  68.                                                                         humi_search=RAM_6264;//將6264存儲器當前地址的濕度信息取出來放在humi_search中
  69.                                                                         while(k2==0);                                //按鍵不被松開就一直循環
  70.               }       
  71.                 if(k3==0)                                                        //查詢下一條濕度按鍵是否被按下
  72.                 {
  73.                     delay(30);                                //消抖,30ms檢查是否是誤觸
  74.                     RAMADDR++;                        //存儲器中指針向后移動一位
  75.                     if (RAMADDR>0x83ff)          //如果指針指向最后一位(1k)
  76.                     RAMADDR=0x83ff;                                //那么指針就停在最后一位
  77.                     humi_search=RAM_6264;        //將6264存儲器當前地址的濕度信息取出來放在humi_search中
  78.                                                                                 while(k3==0);                                        //按鍵不被松開就一直循環
  79.                 }
  80.           }
  81. }
  82. /************************************************************************/
  83. //程序名:main主函數
  84. //功能:,控制顯示屏顯示濕度、查詢濕度;驅動電機;存儲8K濕度信息;數據傳輸;濕度采樣及AD轉換
  85. /************************************************************************/
  86. void main()
  87. {                       
  88.                  RAMADDR=0x8000;                                 //6264首地址
  89.      LCD_Initial();                    //液晶初始化
  90.      GotoXY(0,0);                                        //選擇濕度顯示開始位置,在第一行第一個字符處
  91.      Print_slow(word1);                //顯示 a product of 字符串
  92.            LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN);   //清屏
  93.      GotoXY(0,0);                                        //選擇濕度顯示開始位置,在第二行第一個字符處
  94.      Print_slow(word2);                //顯示 Humidity display 字符串
  95.      LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN);   //清屏
  96.      GotoXY(0,0);                                        //選擇濕度顯示開始位置,在第一行第一個字符處
  97.      Print_slow(word3);                //顯示 Welcome........ 字符串
  98.      LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN);   //清屏                     
  99.      while(1)
  100.         {
  101.                                                  key();                                //開機后,按鍵在任何時候按下都可切換模式
  102.              if(presskeynum==0)         //顯示模式,顯示當前采集回來的濕度
  103.              {                                                                  
  104.              s_connectionreset(); //啟動連接復位
  105.              error=0;             //初始化error=0,即沒有錯誤
  106.              error+=s_measure((unsigned char*)&humi_val.i,&checksum,HUMI); //濕度測量
  107.                                                  if(error!=0)                                         //如果error仍為0則發生錯誤,因為上一步已經加上要測量的濕度信息
  108.                                s_connectionreset();  //如果發生錯誤,系統復位
  109.              else
  110.                  {
  111.                       humi_val.f=(float)humi_val.i;  //轉換為浮點數
  112.                       calc_sth10(&humi_val.f);       //修正相對濕度及溫度
  113.                       humi=humi_val.f*10;                                                 //修正后的濕度乘10,方便存儲
  114.                                                                          if(humi/10<humi_lowest)                                   //當濕度小于最小濕度20.5%時,啟動電機澆水
  115.                                                                          {
  116.                                                                                  ENA=1;                                        //高電平,最高速轉動
  117.                                                                                  IN1=1;                                        //電機正轉
  118.                                                                                  IN2=0;                                 //電機正轉
  119.                                                                          }
  120.                                                                          else                                                                                                                   //當濕度小于最小濕度20.5%時,啟動電機澆水
  121.                                                                          {
  122.                                                                                  ENA=0;                                       
  123.                                                                                  IN1=0;                                        //電機停轉
  124.                                                                                  IN2=0;                                 //電機停轉
  125.                                                                          }
  126.                                                                          
  127.                                                                                         GotoXY(0,0);                            //選擇溫度顯示開始位置,第一行第一個字符處
  128.                       Print(" Current Humi: ");                //當前濕度
  129.                       GotoXY(0,1);                            //選擇溫度顯示開始位置,第二行第一個字符處
  130.                       Print("Humi:      %  ");                //5格空格                                                                                           
  131.                       GotoXY(5,1);                            //選擇溫度顯示開始位置,第二行第六個字符處
  132.                                           HUMI_data[0]=humi/1000+'0';                             //濕度百位                           
  133.                       if (HUMI_data[0]==0x30)                                                                        //如果首位為0,ascall碼0x30=‘0’
  134.                                           HUMI_data[0]=0x20;                                                                                                                                //首位為空格,ascall碼0x20=‘空格’
  135.                       HUMI_data[1]=humi%1000/100+'0';         //濕度十位      
  136.                       HUMI_data[2]=humi%100/10+'0';           //濕度個位
  137.                       HUMI_data[3]='.' ;                      //小數點
  138.                       HUMI_data[4]=humi%10+'0';               //濕度小數點后第一位   
  139.                       HUMI_data[5]='\0';                                                                                        //顯示停止標志。str=‘\0‘,停止
  140.                       Print(HUMI_data);                       //輸出濕度
  141.                                                                                         if(k4==0)                                                                                                                                //按下確定按鍵
  142.                                                                                         {        
  143.                                                                                                 delay(30);                                                                                                                //消抖30ms
  144.                                                                                                 if(k4==0)                                                                                                                        //按下確定鍵
  145.                                                                                                 {
  146.                                                                                                 RAM_6264=humi;                                                                                                //將濕度信息存儲于6264存儲器中
  147.                                                                                                 RAMADDR++;                                                                                                                //地址指針后移一位
  148.                                                                                                 while(k4==0);                                                                                                        //按鍵不被松開就一直循環
  149.                                                                                                 }
  150.                                                                                         }
  151.                }  
  152.                                                 }  
  153.                                                          if(presskeynum==1)                      //歷史查詢濕度時顯示的內容
  154.               {                       
  155.                     show_humi[0]=humi_search%1000/100+'0';  //歷史濕度十位
  156.                     show_humi[1]=humi_search%100/10+'0';          //歷史濕度個位
  157.                     show_humi[2]='.' ;                                                                                        //小數點
  158.                                                                                 show_humi[3]=humi_search%10+'0';                                //歷史濕度信息小數點后一位
  159.                     show_humi[4]='\0';                                                                                        //顯示停止標志。str=‘\0‘,停止
  160.                     GotoXY (0,0);                                                                                                                //選擇溫度顯示開始位置,第一行第一個字符處                                               
  161.                     Print("History Of Humi:");                                                                //歷史濕度
  162.                                                                                 GotoXY(0,1);                            //選擇溫度顯示開始位置,第二行第一個字符處       
  163.                     Print("Humi:      %  ");                //5格空格         
  164.                     GotoXY (5,1);                                                                                                                //選擇溫度顯示開始位置,第二行第六個字符處
  165.                     Print(show_humi);                                                                                                //顯示歷史濕度
  166.                }                                                                  
  167.          }
  168. }
復制代碼

所有資料51hei提供下載:
基于SHT11濕度傳感器的LCD顯示及歷史檢索 .zip (135.9 KB, 下載次數: 22)


評分

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

查看全部評分

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 中文日韩在线 | 久久成人免费视频 | 一区二区三区四区在线视频 | 午夜激情网| 国产免费一区二区三区网站免费 | 亚洲日韩中文字幕 | 欧美黄色免费网站 | 天天久久 | 国产成人影院 | 好姑娘高清在线观看电影 | 欧美精品日韩精品国产精品 | 久久9精品| 日韩精品在线看 | 亚洲天堂影院 | 黑人精品xxx一区一二区 | 看av在线| 成人免费看电影 | 国产精品视频久久 | 国产精品视频一区二区三 | 国产精品视频免费观看 | 久久四虎 | 国产偷录叫床高潮录音 | 在线小视频 | 亚洲视频中文 | 中文字幕影院 | 欧美激情在线播放 | 二区在线视频 | 欧美日高清 | 在线午夜 | 国产精品夜间视频香蕉 | 国产精品成人免费 | 日韩中文字幕一区二区 | 久久国产精品99久久久大便 | 国产欧美精品区一区二区三区 | 成人福利视频网站 | 成人精品福利 | 6996成人影院网在线播放 | 91久久综合 | 黄色免费观看网站 | 日本三级全黄三级a | 久久中文字幕在线 |