欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5050|回復: 1
收起左側

單片機控制SHT11進行溫濕度檢測的仿真及源程序

[復制鏈接]
ID:137190 發表于 2016-9-25 16:11 | 顯示全部樓層 |閱讀模式
51單片機控制SHT11的仿真原理圖如下:
0.png
Keil C51語言程序.rar (28.36 KB, 下載次數: 75)
單片機仿真軟件.rar (43.17 KB, 下載次數: 60)

部分源程序如下:
  1. #ifndef __SHT11_H__
  2. #define __SHT11_H__

  3. /*************************
  4. SHT11相關命令
  5. **************************/
  6. #define uchar unsigned char
  7. #define uint  unsigned int

  8. #define TEM_TEST                 0x03//溫度檢測命令
  9. #define HUM_TEST                  0x05//濕度檢測命令
  10. #define REG_READ                  0x07//讀寄存器
  11. #define REG_WRITE                 0x06//寫寄存器
  12. #define FUNCTION_SET        0x01//設置SHT11的工作精度為8位/濕度 12位溫度
  13. /**************************
  14. SHT11端口定義
  15. ***************************/

  16. sbit SHT11_DATA=P3^1;
  17. sbit SHT11_SCK=P3^0;
  18. sbit P33=P3^3;
  19. sbit P32=P3^2;
  20. sbit P36=P3^6;
  21. sbit P37=P3^7;
  22. uchar flag_tempeture=0;  //顯示溫度位置的標志
  23. uchar flag_humidity=0;         //顯示濕度位置的標志
  24. uchar code str1[]={ 0x10,0x06,0x09,0x08,0x08,0x09,0x06,0x00};//溫度圖標
  25. uchar code str6_sht11[]="%RH   ";
  26. uchar code str4_sht11[]="humi=";
  27. uchar code str2_sht11[]="temp=";
  28. uchar code str7_sht11[]="    ";//清除沒不要的顯示
  29. /***************************
  30. 函數名稱:Delay()
  31. 函數功能:SHT11內部延時
  32. ****************************/
  33. void Delay()
  34. {
  35.         ;
  36.         ;
  37. }

  38. /***************************
  39. 函數名稱:Delay_Ms()
  40. 函數功能:SHT11檢測等待延時
  41. 函數說明:11ms/55ms/210ms 分別對應8位/12位/14位 測量結果
  42. 對應的形參為N 則延時Nms
  43. ****************************/
  44. void Delay_Ms(uint ms)        // ms延時函數 (AT89C51 @ 11.0592MHz)
  45. {
  46. uint i;
  47. uchar j;
  48. for(i=0;i<ms;i++)
  49. {
  50.   for(j=0;j<200;j++);
  51.   for(j=0;j<102;j++);
  52. }
  53. }
  54. /**************************
  55. 函數功能:SHT11啟動時序
  56. ***************************/
  57. void SHT11_Start()
  58. {
  59.         SHT11_SCK=1;
  60.         SHT11_DATA=1;
  61.         Delay();
  62.         SHT11_DATA=0;
  63.         Delay();
  64.         SHT11_SCK=0;
  65.         Delay();
  66.         SHT11_SCK=1;
  67.         Delay();
  68.         SHT11_DATA=1;
  69. }

  70. /******************************
  71. 函數名稱:SHT11_Sendbyte(uchar dat)
  72. 函數功能: 向SHT11發送8bite數據
  73. ******************************/
  74. void SHT11_Sendbyte(uchar dat)
  75. {
  76.         uchar i;
  77.         SHT11_SCK=0;
  78.         Delay();
  79.         for(i=0;i<8;i++)
  80.         {
  81.                 if(dat&0x80)
  82.                 {
  83.                         SHT11_DATA=1;
  84.                         Delay();
  85.                 }
  86.                 else
  87.                 {
  88.                         SHT11_DATA=0;
  89.                         Delay();
  90.                 }
  91.                 dat=dat<<1;
  92.                 SHT11_SCK=1;
  93.                 Delay();
  94.                 SHT11_SCK=0;
  95.         }
  96. }
  97. /*********************************
  98. 函數名稱SHT11_Answer():
  99. 函數功能:檢測SHT11的響應信號(在第九個時鐘周期)
  100. ***********************************/
  101. void SHT11_Answer()
  102. {
  103.         SHT11_SCK=1;
  104.         Delay();
  105.         while(SHT11_DATA==1);
  106.         SHT11_SCK=0;
  107.         SHT11_DATA=1;
  108. }

  109. /************************************
  110. 函數名稱:SHT11_Test_Finish()
  111. 函數功能:檢測SHT11溫濕度檢測是否完畢
  112. *************************************/
  113. void SHT11_Test_Finish()
  114. {
  115.         while(SHT11_DATA==1);
  116. }

  117. /************************************
  118. 函數名稱:SHT11_Receivebyte()
  119. 函數功能:從SHT11接收8bite數據
  120. *************************************/
  121. uchar SHT11_Receivebyte()
  122. {
  123.         uchar i;
  124.         uchar dat;
  125.         SHT11_SCK=0;
  126.         Delay();
  127.         for(i=0;i<8;i++)
  128.         {        
  129.                 SHT11_SCK=1;
  130.                 Delay();
  131.                 dat=dat<<1;
  132.                 if(SHT11_DATA)
  133.                 {
  134.                         dat=dat|0x01;
  135.                         Delay();
  136.                 }
  137.                 else
  138.                 {
  139.                         dat=dat&0xfe;
  140.                         Delay();
  141.                 }
  142.                  SHT11_SCK=0;
  143.                 Delay();
  144.         }
  145.         SHT11_DATA=1; //釋放數據總線
  146.         return(dat);        
  147. }

  148. /***********************************
  149. 函數名稱:MCU_Answer()
  150. 函數功能:單片機向SHT11發送應答信號
  151. *************************************/
  152. void MCU_Answer()
  153. {
  154.          SHT11_SCK=0;
  155.         Delay();
  156.         SHT11_DATA=0;
  157.         Delay();
  158.         SHT11_SCK=1;
  159.         Delay();
  160.         SHT11_SCK=0;
  161.         Delay();
  162.         SHT11_DATA=1; //釋放數據總線 這條指令非常重要 不加的話導致單片機不能讀取低8位
  163. }
  164. /***********************************
  165. 函數名稱:SHT11_End()
  166. 當接收兩個8byte數據后部接收CRC校驗碼
  167. ************************************/
  168. void SHT11_End()
  169. {
  170.         SHT11_DATA=1;
  171.         SHT11_SCK=1;
  172.         Delay();
  173.         SHT11_SCK=0;
  174.         Delay();
  175. }

  176. /*************************************
  177. 函數名稱:void SHT11_Write_Register(uchar command ,uchar dat)
  178. 函數說明:向SHT11的狀態寄存器設置功能
  179.                         command為REG_WRITE 0x06寫寄存器
  180.                         dat為 設置SHT11的功能 可以設置檢測的數據位數
  181. */
  182. void SHT11_Write_Register(uchar command ,uchar dat)
  183. {
  184.         SHT11_Start();
  185.         SHT11_Sendbyte(command);
  186.         SHT11_Answer();
  187.         SHT11_Sendbyte(dat);
  188.         SHT11_Answer();
  189. }


  190. /***************************************
  191. 函數名稱:uchar SHT11_Read_Register(uchar command)
  192. 函數說明:command為REG_READ  0x07//讀寄存器
  193.                         返回值為狀態寄存器的值
  194.                  位6顯示當前檢測完一次數據后電源供電情況
  195.                         當位6為0時表明VDD>2.47V 當位6為1時表明VDD<2.47V即電量不足
  196.                  位0表明當前的測量分辨率
  197.                  當位0為1時表明測量精度:8位/濕度 12位溫度
  198.                  當位0為0時表明測量精度:12位濕度 14位溫度
  199.                  默認為0
  200. *******************************************/
  201. uchar SHT11_Read_Register(uchar command)
  202. {
  203.         uchar dat;
  204.         SHT11_Start();
  205.         SHT11_Sendbyte(command);
  206.         SHT11_Answer();
  207.         dat=SHT11_Receivebyte();
  208.         SHT11_End();
  209.         return(dat);
  210. }


  211. /***************************************
  212. 函數名稱:SHT11_Measure(uchar command,uint time);
  213. 函數功能:設置SHT11檢測功能,并返回相應的檢測結果
  214. 函數說明:command形參用于設定溫度檢測還是濕度檢測,
  215. time形參用于設定檢測過程中的等待時間,以確定檢測結果的位數
  216. 11ms/55ms/210ms 分別對應8位/12位/14位
  217. ****************************************/
  218. uint SHT11_Measure(uchar command,uchar time)
  219. {
  220.         uint dat=0;
  221.         uchar data_high,data_low;
  222.         SHT11_Start();
  223.         SHT11_Sendbyte(command);
  224.         SHT11_Answer();
  225.         Delay_Ms(time);
  226.         SHT11_Test_Finish();
  227.         data_high=SHT11_Receivebyte();
  228.         MCU_Answer();
  229.         data_low=SHT11_Receivebyte();
  230.         SHT11_End();
  231.         dat=(dat|data_high);
  232.         dat=(dat<<8)|data_low;
  233.         return(dat);
  234. }

  235. /****************************************
  236. 函數名稱:Convert_Tempeture12bit(uint dat);
  237. 函數功能:將檢測到的數據轉化為相應的溫度數據
  238. 函數說明:溫度轉換公式--T=d1+d2*SOt
  239.                   公式中的參數d1=-40,d2=0.04
  240.                   適用于12位測量精度
  241. */
  242. float SHT11_Convert_Tempeture12bit(uint dat)
  243. {
  244.         float tempeture1;
  245.         tempeture1=-40+0.04*dat;
  246.         if(tempeture1>23)
  247.          tempeture1=tempeture1+1;
  248.         if(tempeture1>55)
  249.          tempeture1=tempeture1+1;
  250.         if(P37==1)
  251.         {
  252.          if(tempeture1>=16&&tempeture1<30)
  253.          {
  254.           P33=1;
  255.           P32=0;
  256.          }
  257.          else
  258.          {
  259.           P33=0;
  260.           P32=1;
  261.          }
  262.         }
  263.         return(tempeture1);
  264. }


  265. /*****************************************
  266. 函數名稱:SHT11_Convert_Humidity8bit(uint dat,float temp)
  267. 函數功能:將檢測到的數據轉化為相應的濕度數據
  268. 函數說明:相對濕度轉換公式-----RHline=C1+C2*SOrh+C3*SOrh*SOrh(檢測數據的線性化 SOrh為單片機接收到的數據)
  269.                                                  -----RHtrue=(tempeture-25)*(t1+t2*SOrh)+RHline
  270.                   公式中的參數:C1=-4,C2=0,648,C3=-0.00072
  271.                                           t1=0.01,t2=0.00128
  272.                         適用于8位測量精度
  273. */
  274. uint SHT11_Convert_Humidity8bit(uint dat,float temp)
  275. {
  276.         float RHline,RHtrue;
  277.         uint r;
  278.         RHline=-4+0.648*dat-0.00072*dat*dat;
  279.         RHtrue=(temp-25)*(0.01+0.00128*dat)+RHline;
  280.         r=(RHtrue-3)*10+0.5;
  281.         if(P37==0)
  282.    {
  283.         if(r>=400&&r<600)
  284.         {
  285.           P33=1;
  286.         }
  287.         else
  288.         {
  289.          P33=0;
  290.         }
  291.         if(r>=600)
  292.         {
  293.           P32=1;
  294.         }
  295.         else
  296.         {
  297.          P32=0;
  298.         }
  299.    }
  300.         return(r);
  301. }
  302. #endif
復制代碼
回復

使用道具 舉報

ID:324415 發表于 2018-5-7 18:42 | 顯示全部樓層
樓主能否發我一份,感激不盡
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表