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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

SHT11數字溫濕度傳感器 含源代碼和仿真圖

  [復制鏈接]
跳轉到指定樓層
樓主
分享一個SHT11-數字溫濕度傳感器,含源代碼和仿真圖


單片機源程序如下:
  1. #include <reg52.h>  
  2. #include <intrins.h>  
  3. #include "LCD1602.h"
  4. /********************************************************
  5. 宏定義
  6. ********************************************************/
  7. #define uint unsigned int  
  8. #define uchar unsigned char  
  9. #define noACK 0
  10. #define ACK   1
  11. #define STATUS_REG_W 0x06
  12. #define STATUS_REG_R 0x07
  13. #define MEASURE_TEMP 0x03
  14. #define MEASURE_HUMI 0x05
  15. #define RESET        0x1e

  16. enum { TEMP, HUMI };

  17. typedef union               //定義共用同類型  
  18. {
  19.         unsigned int i;
  20.         float f;
  21. } value;


  22. /********************************************************
  23. 位定義
  24. ********************************************************/
  25. sbit SCK = P1 ^ 0;
  26. sbit DATA = P1 ^ 1;

  27. /********************************************************
  28. 變量定義
  29. ********************************************************/
  30. uchar wendu[6];
  31. uchar shidu[6];


  32. /********************************************************
  33. 50us延時函數
  34. ********************************************************/
  35. void delay_50us(uint t)
  36. {
  37.         uint j;
  38.         for (; t>0; t--)
  39.         for (j = 19; j>0; j--);
  40. }


  41. /*******************************************************
  42. 液晶顯示函數
  43. ********************************************************/
  44. void displaywendu(void)
  45. {
  46.         uchar i;
  47.         write_com(0x80+0x40);
  48.         write_data('T');
  49.         write_data(':');
  50.         for (i = 0; i<3; i++)
  51.         {
  52.                 write_data(wendu[i]);
  53.                 delay_50us(1);
  54.         }
  55.         for (i = 0; i<1; i++)
  56.         {
  57.                 write_data('.');
  58.                 delay_50us(1);
  59.         }
  60.         for (i = 4; i<5; i++)
  61.         {
  62.                 write_data(wendu[i]);
  63.                 delay_50us(1);
  64.         }
  65.         write_data(0xDF);
  66.         write_data('C');
  67. }


  68. /********************************************************
  69. 液晶顯示函數
  70. ********************************************************/
  71. void displayshidu(void)
  72. {
  73.         uchar i;
  74.         write_com(0x80);
  75.         write_data('H');
  76.         write_data(':');
  77.         for (i = 0; i<3; i++)
  78.         {
  79.                 write_data(shidu[i]);
  80.                 delay_50us(1);
  81.         }
  82.         for (i = 0; i<1; i++)
  83.         {
  84.                 write_data('.');
  85.                 delay_50us(1);
  86.         }
  87.         for (i = 4; i<5; i++)
  88.         {
  89.                 write_data(shidu[i]);
  90.                 delay_50us(1);
  91.         }
  92.         write_data('%');
  93.         write_data('R');
  94.         write_data('H');
  95. }

  96. /********************************************************
  97. SHT11寫字節程序
  98. ********************************************************/
  99. char s_write_byte(unsigned char value)
  100. {
  101.         unsigned char i, error = 0;
  102.         for (i = 0x80; i>0; i >>= 1)             //高位為1,循環右移  
  103.         {
  104.                 if (i&value) DATA = 1;          //和要發送的數相與,結果為發送的位  
  105.                 else DATA = 0;
  106.                 SCK = 1;
  107.                 _nop_(); _nop_(); _nop_();        //延時3us   
  108.                 SCK = 0;
  109.         }
  110.         DATA = 1;                           //釋放數據線  
  111.         SCK = 1;
  112.         error = DATA;                       //檢查應答信號,確認通訊正常  
  113.         _nop_(); _nop_(); _nop_();
  114.         SCK = 0;
  115.         DATA = 1;
  116.         return error;                     //error=1 通訊錯誤  
  117. }

  118. /********************************************************
  119. SHT11讀字節程序
  120. ********************************************************/
  121. char s_read_byte(unsigned char ack)
  122. {
  123.         unsigned char i, val = 0;
  124.         DATA = 1;                           //釋放數據線  
  125.         for (i = 0x80; i>0; i >>= 1)             //高位為1,循環右移  
  126.         {
  127.                 SCK = 1;
  128.                 if (DATA) val = (val | i);             //讀一位數據線的值   
  129.                 SCK = 0;
  130.         }
  131.         DATA = !ack;                        //如果是校驗,讀取完后結束通訊;  
  132.         SCK = 1;
  133.         _nop_(); _nop_(); _nop_();          //延時3us   
  134.         SCK = 0;
  135.         _nop_(); _nop_(); _nop_();
  136.         DATA = 1;                           //釋放數據線  
  137.         return val;
  138. }

  139. /********************************************************
  140. SHT11啟動傳輸
  141. ********************************************************/
  142. void s_transstart(void)
  143. {
  144.         DATA = 1; SCK = 0;                   //準備  
  145.         _nop_();
  146.         SCK = 1;
  147.         _nop_();
  148.         DATA = 0;
  149.         _nop_();
  150.         SCK = 0;
  151.         _nop_(); _nop_(); _nop_();
  152.         SCK = 1;
  153.         _nop_();
  154.         DATA = 1;
  155.         _nop_();
  156.         SCK = 0;
  157. }


  158. /********************************************************
  159. SHT11連接復位
  160. ********************************************************/
  161. void s_connectionreset(void)
  162. {
  163.         unsigned char i;
  164.         DATA = 1; SCK = 0;                    //準備  
  165.         for (i = 0; i<9; i++)                  //DATA保持高,SCK時鐘觸發9次,發送啟動傳輸,通迅即復位  
  166.         {
  167.                 SCK = 1;
  168.                 SCK = 0;
  169.         }
  170.         s_transstart();                   //啟動傳輸  
  171. }

  172. /********************************************************
  173. SHT11溫濕度檢測
  174. ********************************************************/
  175. char s_measure(unsigned char *p_value, unsigned char *p_checksum, unsigned char mode)
  176. {
  177.         unsigned error = 0;
  178.         unsigned int i;

  179.         s_transstart();                   //啟動傳輸  
  180.         switch (mode)                      //選擇發送命令  
  181.         {
  182.         case TEMP: error += s_write_byte(MEASURE_TEMP); break;          //測量溫度  
  183.         case HUMI: error += s_write_byte(MEASURE_HUMI); break;          //測量濕度  
  184.         default: break;
  185.         }
  186.         for (i = 0; i<65535; i++) if (DATA == 0) break;        //等待測量結束  
  187.         if (DATA) error += 1;                              // 如果長時間數據線沒有拉低,說明測量錯誤   
  188.         *(p_value) = s_read_byte(ACK);           //讀第一個字節,高字節 (MSB)  
  189.         *(p_value + 1) = s_read_byte(ACK);          //讀第二個字節,低字節 (LSB)  
  190.         *p_checksum = s_read_byte(noACK);        //read CRC校驗碼  
  191.         return error;                   // error=1 通訊錯誤  
  192. }
  193. /********************************************************
  194. SHT11溫濕度值標度變換及溫度補償
  195. ********************************************************/
  196. void calc_sth10(float *p_humidity, float *p_temperature)
  197. {
  198.         const float C1 = -4.0;              // 12位濕度精度 修正公式  
  199.         const float C2 = +0.0405;           // 12位濕度精度 修正公式  
  200.         const float C3 = -0.0000028;        // 12位濕度精度 修正公式  
  201.         const float T1 = +0.01;             // 14位溫度精度 5V條件  修正公式  
  202.         const float T2 = +0.00008;          // 14位溫度精度 5V條件  修正公式  

  203.         float rh = *p_humidity;             // rh:      12位 濕度   
  204.         float t = *p_temperature;           // t:       14位 溫度  
  205.         float rh_lin;                     // rh_lin: 濕度 linear值  
  206.         float rh_true;                    // rh_true: 濕度 ture值  
  207.         float t_C;                        // t_C   : 溫度 ℃  

  208.         t_C = t*0.01 - 40;                  //補償溫度  
  209.         rh_lin = C3*rh*rh + C2*rh + C1;     //相對濕度非線性補償  
  210.         rh_true = (t_C - 25)*(T1 + T2*rh) + rh_lin;   //相對濕度對于溫度依賴性補償  
  211.         if (rh_true>100)rh_true = 100;       //濕度最大修正  
  212.         if (rh_true<0.1)rh_true = 0.1;       //濕度最小修正  

  213.         *p_temperature = t_C;               //返回溫度結果  
  214.         *p_humidity = rh_true;              //返回濕度結果  
  215. }
  216. /********************************************************
  217. 主函數
  218. ********************************************************/
  219. void main(void)
  220. {
  221.         unsigned int temp, humi;
  222.         value humi_val, temp_val;        //定義兩個共同體,一個用于濕度,一個用于溫度  
  223.         unsigned char error;            //用于檢驗是否出現錯誤  
  224.         unsigned char checksum;         //CRC   
  225.         LcdInitiate();
  226. ……………………

  227. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼

所有資料51hei提供下載:
SHT11-數字溫濕度傳感器只支持Proteus7.5版本.7z (37.17 KB, 下載次數: 368)


評分

參與人數 2黑幣 +51 收起 理由
zfk + 1 很給力!
admin + 50 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

沙發
ID:208180 發表于 2017-11-17 15:27 | 只看該作者
想咨詢一下,如果溫度在零下的話,源碼應該如何修改才能讓lcd順利顯示出負數?
回復

使用道具 舉報

板凳
ID:250456 發表于 2017-11-17 16:16 | 只看該作者
頂,好文
回復

使用道具 舉報

地板
ID:675478 發表于 2019-12-27 15:38 | 只看該作者
很有用
回復

使用道具 舉報

5#
ID:316621 發表于 2020-4-12 21:08 | 只看該作者
老哥 我打開之后顯示 “新文件設計”,求幫助
回復

使用道具 舉報

6#
ID:733782 發表于 2020-4-22 09:53 | 只看該作者
感謝分享,值得學習。
回復

使用道具 舉報

7#
ID:676143 發表于 2020-4-24 18:21 來自手機 | 只看該作者
etxuxu 發表于 2017-11-17 15:27
想咨詢一下,如果溫度在零下的話,源碼應該如何修改才能讓lcd順利顯示出負數?

你好,顯示零下溫度需要怎樣修改呢
回復

使用道具 舉報

8#
ID:767820 發表于 2020-6-2 20:12 | 只看該作者
感謝樓主的分享
回復

使用道具 舉報

9#
ID:773585 發表于 2020-6-9 09:17 | 只看該作者
很棒,很詳細
回復

使用道具 舉報

10#
ID:786360 發表于 2020-6-22 14:55 | 只看該作者
有代碼嗎可以私發給我嗎
回復

使用道具 舉報

11#
ID:842307 發表于 2021-2-18 22:38 | 只看該作者
SHT11沒有ACK回復是什么原因,使用proteus仿真,沒有ACK回復
回復

使用道具 舉報

12#
ID:923241 發表于 2021-5-18 13:59 | 只看該作者
有仿真圖和代碼嗎
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国内精品在线视频 | 日日躁狠狠躁aaaaxxxx | 欧美区在线 | 成人免费视频网站在线观看 | 久久天天躁狠狠躁夜夜躁2014 | 亚洲精品一区在线 | 久久精品久久久久久 | 中文字幕在线电影观看 | 欧美一级网站 | 不卡的av一区| 国产精品久久久久久久久久久免费看 | 国产欧美日韩综合精品一区二区 | 国产精品日产欧美久久久久 | 日韩av免费在线电影 | 在线观看日本网站 | 91亚洲精选 | 男人天堂视频在线观看 | 成人精品国产免费网站 | 久久精品国产久精国产 | 亚洲成在线观看 | 免费久久99精品国产婷婷六月 | 天堂成人国产精品一区 | 午夜大片| 亚洲视频手机在线 | 国产精品日日做人人爱 | 2022国产精品 | 人人擦人人 | 国产日韩亚洲欧美 | 97视频网站 | 久久黄色精品视频 | 亚洲三级在线观看 | 欧美日韩成人在线 | 黄色片网站在线观看 | 在线婷婷| 亚洲精品乱码久久久久久黑人 | 91av在线免费观看 | 一级毛片播放 | 国户精品久久久久久久久久久不卡 | 成人激情视频免费观看 | 一区二区欧美在线 | 高清国产午夜精品久久久久久 |