找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

帖子
查看: 11772|回復(fù): 11
收起左側(cè)

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

  [復(fù)制鏈接]
ID:164146 發(fā)表于 2017-6-9 22:16 | 顯示全部樓層 |閱讀模式
分享一個(gè)SHT11-數(shù)字溫濕度傳感器,含源代碼和仿真圖

SHT11-數(shù)字溫濕度傳感器

SHT11-數(shù)字溫濕度傳感器
0.png

單片機(jī)源程序如下:
  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延時(shí)函數(shù)
  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. 液晶顯示函數(shù)
  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. 液晶顯示函數(shù)
  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寫字節(jié)程序
  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,循環(huán)右移  
  103.         {
  104.                 if (i&value) DATA = 1;          //和要發(fā)送的數(shù)相與,結(jié)果為發(fā)送的位  
  105.                 else DATA = 0;
  106.                 SCK = 1;
  107.                 _nop_(); _nop_(); _nop_();        //延時(shí)3us   
  108.                 SCK = 0;
  109.         }
  110.         DATA = 1;                           //釋放數(shù)據(jù)線  
  111.         SCK = 1;
  112.         error = DATA;                       //檢查應(yīng)答信號,確認(rèn)通訊正常  
  113.         _nop_(); _nop_(); _nop_();
  114.         SCK = 0;
  115.         DATA = 1;
  116.         return error;                     //error=1 通訊錯(cuò)誤  
  117. }

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

  139. /********************************************************
  140. SHT11啟動(dòng)傳輸
  141. ********************************************************/
  142. void s_transstart(void)
  143. {
  144.         DATA = 1; SCK = 0;                   //準(zhǔn)備  
  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連接復(fù)位
  160. ********************************************************/
  161. void s_connectionreset(void)
  162. {
  163.         unsigned char i;
  164.         DATA = 1; SCK = 0;                    //準(zhǔn)備  
  165.         for (i = 0; i<9; i++)                  //DATA保持高,SCK時(shí)鐘觸發(fā)9次,發(fā)送啟動(dòng)傳輸,通迅即復(fù)位  
  166.         {
  167.                 SCK = 1;
  168.                 SCK = 0;
  169.         }
  170.         s_transstart();                   //啟動(dòng)傳輸  
  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();                   //啟動(dòng)傳輸  
  180.         switch (mode)                      //選擇發(fā)送命令  
  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;        //等待測量結(jié)束  
  187.         if (DATA) error += 1;                              // 如果長時(shí)間數(shù)據(jù)線沒有拉低,說明測量錯(cuò)誤   
  188.         *(p_value) = s_read_byte(ACK);           //讀第一個(gè)字節(jié),高字節(jié) (MSB)  
  189.         *(p_value + 1) = s_read_byte(ACK);          //讀第二個(gè)字節(jié),低字節(jié) (LSB)  
  190.         *p_checksum = s_read_byte(noACK);        //read CRC校驗(yàn)碼  
  191.         return error;                   // error=1 通訊錯(cuò)誤  
  192. }
  193. /********************************************************
  194. SHT11溫濕度值標(biāo)度變換及溫度補(bǔ)償
  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;                  //補(bǔ)償溫度  
  209.         rh_lin = C3*rh*rh + C2*rh + C1;     //相對濕度非線性補(bǔ)償  
  210.         rh_true = (t_C - 25)*(T1 + T2*rh) + rh_lin;   //相對濕度對于溫度依賴性補(bǔ)償  
  211.         if (rh_true>100)rh_true = 100;       //濕度最大修正  
  212.         if (rh_true<0.1)rh_true = 0.1;       //濕度最小修正  

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

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

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


評分

參與人數(shù) 2黑幣 +51 收起 理由
zfk + 1 很給力!
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評分

回復(fù)

使用道具 舉報(bào)

ID:208180 發(fā)表于 2017-11-17 15:27 | 顯示全部樓層
想咨詢一下,如果溫度在零下的話,源碼應(yīng)該如何修改才能讓lcd順利顯示出負(fù)數(shù)?
回復(fù)

使用道具 舉報(bào)

ID:250456 發(fā)表于 2017-11-17 16:16 | 顯示全部樓層
頂,好文
回復(fù)

使用道具 舉報(bào)

ID:675478 發(fā)表于 2019-12-27 15:38 | 顯示全部樓層
很有用
回復(fù)

使用道具 舉報(bào)

ID:316621 發(fā)表于 2020-4-12 21:08 | 顯示全部樓層
老哥 我打開之后顯示 “新文件設(shè)計(jì)”,求幫助
回復(fù)

使用道具 舉報(bào)

ID:733782 發(fā)表于 2020-4-22 09:53 | 顯示全部樓層
感謝分享,值得學(xué)習(xí)。
回復(fù)

使用道具 舉報(bào)

ID:676143 發(fā)表于 2020-4-24 18:21 來自觸屏版 | 顯示全部樓層
etxuxu 發(fā)表于 2017-11-17 15:27
想咨詢一下,如果溫度在零下的話,源碼應(yīng)該如何修改才能讓lcd順利顯示出負(fù)數(shù)?

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

使用道具 舉報(bào)

ID:767820 發(fā)表于 2020-6-2 20:12 | 顯示全部樓層
感謝樓主的分享
回復(fù)

使用道具 舉報(bào)

ID:773585 發(fā)表于 2020-6-9 09:17 | 顯示全部樓層
很棒,很詳細(xì)
回復(fù)

使用道具 舉報(bào)

ID:786360 發(fā)表于 2020-6-22 14:55 | 顯示全部樓層
有代碼嗎可以私發(fā)給我嗎
回復(fù)

使用道具 舉報(bào)

ID:842307 發(fā)表于 2021-2-18 22:38 | 顯示全部樓層
SHT11沒有ACK回復(fù)是什么原因,使用proteus仿真,沒有ACK回復(fù)
回復(fù)

使用道具 舉報(bào)

ID:923241 發(fā)表于 2021-5-18 13:59 | 顯示全部樓層
有仿真圖和代碼嗎
回復(fù)

使用道具 舉報(bào)

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

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表