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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

上位機顯示并存儲,RS485傳輸溫濕度監控系統(SHT11傳感器20個點位)

  [復制鏈接]
跳轉到指定樓層
樓主
實現功能
1、溫濕度實時檢測
2、20個點位RS485傳輸
3、上位機顯示20個點位數據
4、上位機對每個點位數據同步保存

器件介紹
1、溫濕度傳感器 SHT11








2、RS485芯片




制作完成的實物






上位機讀取數據界面


溫濕度資料下載
       溫濕度傳感器SHT11數據手冊.pdf (1.44 MB, 下載次數: 42)

485通訊芯片資料下載
       DS75176.pdf (941.27 KB, 下載次數: 52)

SHT11液晶顯示源程序
       SHT11液晶顯示源程序.rar (3.23 KB, 下載次數: 73)

  1. /***********************************************************************************

  2. ;功能說明:SHT11與LCD1602的溫濕度顯示
  3. ;文件名稱:SHT11.c   

  4. ;***********************************************************************************/

  5. /*************定義接口********************
  6.          P0------DB0~DB7  (LCD1602)     
  7.          P2.0------RS      (LCD1602)
  8.          P2.1------RW      (LCD1602)
  9.          P2.2------E       (LCD1602)
  10.          P2.6------SCK     (SHT11)
  11.          P2.7------DATA    (SHT11)
  12. *****************************************/

  13. #include <reg52.h>
  14. #include <intrins.h>
  15. #include <math.h>
  16. #include <stdio.h>

  17. //第一部分LCD1602設置
  18. #define LCD_DB  P0
  19. sbit    LCD_RS=P2^0;
  20. sbit    LCD_RW=P2^1;
  21. sbit    LCD_E=P2^2;

  22. /******定義函數****************/
  23. #define uchar unsigned char
  24. #define uint unsigned int
  25. void LCD_init(void);                          //初始化函數
  26. void LCD_write_command(uchar command);        //寫指令函數
  27. void LCD_write_data(uchar dat);               //寫數據函數
  28. void LCD_disp_char(uchar x,uchar y,uchar dat);//在某個屏幕位置上顯示一個字符,X(0-15),y(1-2)
  29. void LCD_disp_str(uchar x,uchar y,uchar *str); //LCD1602顯示字符串函數
  30. void delay_n10us(uint n);                     //延時函數

  31. /*--------------------------------------
  32. ;模塊名稱:LCD_init();
  33. ;功    能:初始化LCD1602
  34. ;-------------------------------------*/
  35. void LCD_init(void)
  36. {
  37. delay_n10us(10);
  38. LCD_write_command(0x38);//設置8位格式,2行,5x7
  39. delay_n10us(10);
  40. LCD_write_command(0x0c);//整體顯示,關光標,不閃爍
  41. delay_n10us(10);
  42. LCD_write_command(0x06);//設定輸入方式,增量不移位
  43. delay_n10us(10);
  44. LCD_write_command(0x01);//清除屏幕顯示
  45. delay_n10us(100);       //延時清屏,延時函數,延時約n個10us
  46. }


  47. /*--------------------------------------
  48. ;模塊名稱:LCD_write_command();
  49. ;功    能:LCD1602寫指令函數
  50. ;-------------------------------------*/
  51. void LCD_write_command(uchar dat)
  52. {
  53. delay_n10us(10);
  54. LCD_RS=0;         //指令
  55. LCD_RW=0;         //寫入
  56. LCD_E=1;          //允許
  57. LCD_DB=dat;
  58. delay_n10us(10);  //實踐證明,我的LCD1602上,用for循環1次就能完成普通寫指令。
  59. LCD_E=0;
  60. delay_n10us(10);  //實踐證明,我的LCD1602上,用for循環1次就能完成普通寫指令。
  61. }


  62. /*--------------------------------------
  63. ;模塊名稱:LCD_write_data();
  64. ;功    能:LCD1602寫數據函數
  65. ;-------------------------------------*/
  66. void LCD_write_data(uchar dat)
  67. {
  68. delay_n10us(10);
  69. LCD_RS=1;          //數據
  70. LCD_RW=0;          //寫入
  71. LCD_E=1;           //允許
  72. LCD_DB=dat;
  73. delay_n10us(10);
  74. LCD_E=0;
  75. delay_n10us(10);
  76. }

  77. /*--------------------------------------
  78. ;模塊名稱:LCD_disp_char();
  79. ;功    能:LCD1602顯示一個字符函數
  80. ;-------------------------------------*/
  81. void LCD_disp_char(uchar x,uchar y,uchar dat)
  82. {
  83.   uchar address;
  84.   if(y==1)
  85.          address=0x80+x;
  86.   else
  87.          address=0xc0+x;
  88.   LCD_write_command(address);
  89.   LCD_write_data(dat);
  90. }



  91. /*--------------------------------------
  92. ;模塊名稱:LCD_disp_str();
  93. ;功    能:LCD1602顯示字符串
  94. ;-------------------------------------*/
  95. void LCD_disp_str(uchar x,uchar y,uchar *str)
  96. {
  97.   uchar address;
  98.   if(y==1)
  99.          address=0x80+x;
  100.   else
  101.          address=0xc0+x;
  102.   LCD_write_command(address);
  103.   while(*str!='\0')
  104.   {
  105.     LCD_write_data(*str);   
  106.     str++;
  107.   }
  108. }

  109. /*--------------------------------------
  110. ;模塊名稱:delay_n10us();
  111. ;功    能:延時函數,延時約n個10us
  112. ;-------------------------------------*/
  113. void delay_n10us(uint n)  //延時n個10us@12M晶振
  114. {      
  115.         uint i;           
  116.         for(i=n;i>0;i--)   
  117.         {
  118.         _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
  119.                 }
  120. }                                    
  121. //第二部分SHT11設置
  122. sbit SCK  = P2^6;      //定義通訊時鐘端口
  123. sbit DATA = P2^7;      //定義通訊數據端口

  124. typedef union  
  125. { unsigned int i;      //定義了兩個共用體
  126.   float f;
  127. } value;

  128. enum {TEMP,HUMI};      //TEMP=0,HUMI=1


  129. #define noACK 0             //用于判斷是否結束通訊
  130. #define ACK   1             //結束數據傳輸
  131.                             //adr  command  r/w
  132. #define STATUS_REG_W 0x06   //000   0011    0
  133. #define STATUS_REG_R 0x07   //000   0011    1
  134. #define MEASURE_TEMP 0x03   //000   0001    1
  135. #define MEASURE_HUMI 0x05   //000   0010    1
  136. #define RESET        0x1e   //000   1111    0

  137. /****************定義函數****************/
  138. void s_transstart(void);               //啟動傳輸函數
  139. void s_connectionreset(void);          //連接復位函數
  140. char s_write_byte(unsigned char value);//SHT11寫函數
  141. char s_read_byte(unsigned char ack);   //SHT11讀函數
  142. char s_measure(unsigned char *p_value, unsigned char *p_checksum, unsigned char mode);//測量溫濕度函數
  143. void calc_SHT11(float *p_humidity ,float *p_temperature);//溫濕度補償

  144. /*--------------------------------------
  145. ;模塊名稱:s_transstart();
  146. ;功    能:啟動傳輸函數
  147. ;-------------------------------------*/  
  148. void s_transstart(void)
  149. {   
  150.    DATA=1; SCK=0;                   //Initial state
  151.    _nop_();
  152.    SCK=1;
  153.    _nop_();
  154.    DATA=0;
  155.    _nop_();
  156.    SCK=0;   
  157.    _nop_();_nop_();_nop_();
  158.    SCK=1;
  159.    _nop_();
  160.    DATA=1;        
  161.    _nop_();
  162.    SCK=0;        
  163. }

  164. /*--------------------------------------
  165. ;模塊名稱:s_connectionreset();
  166. ;功    能:連接復位函數
  167. ;-------------------------------------*/
  168. void s_connectionreset(void)
  169. {   
  170.   unsigned char i;  
  171.   DATA=1; SCK=0;                    //Initial state
  172.   for(i=0;i<9;i++)                  //9 SCK cycles
  173.   {
  174.     SCK=1;
  175.     SCK=0;
  176.   }
  177.   s_transstart();                   //transmission start
  178. }

  179. /*--------------------------------------
  180. ;模塊名稱:s_write_byte();
  181. ;功    能:SHT11寫函數
  182. ;-------------------------------------*/
  183. char s_write_byte(unsigned char value)
  184. //----------------------------------------------------------------------------------
  185. {  
  186.   unsigned char i,error=0;   
  187.   for (i=0x80;i>0;i/=2)             //shift bit for masking
  188.   {  
  189.     if (i & value) DATA=1;          //masking value with i , write to SENSI-BUS
  190.     else DATA=0;                        
  191.     SCK=1;                          //clk for SENSI-BUS
  192.     _nop_();_nop_();_nop_();        //pulswith approx. 3 us     
  193.     SCK=0;
  194.   }
  195.   DATA=1;                           //release DATA-line
  196.   SCK=1;                            //clk #9 for ack  
  197.   error=DATA;                       //check ack (DATA will be pulled down by SHT11),DATA在第9個上升沿將被SHT11自動下拉為低電平。
  198.   _nop_();_nop_();_nop_();
  199.   SCK=0;
  200.   DATA=1;                           //release DATA-line
  201.   return error;                     //error=1 in case of no acknowledge //返回:0成功,1失敗
  202. }


  203. /*--------------------------------------
  204. ;模塊名稱:s_read_byte();
  205. ;功    能:DHT11讀函數
  206. ;-------------------------------------*/
  207. char s_read_byte(unsigned char ack)  
  208. // reads a byte form the Sensibus and gives an acknowledge in case of "ack=1"  
  209. {  
  210.   unsigned char i,val=0;
  211.   DATA=1;                           //release DATA-line
  212.   for (i=0x80;i>0;i/=2)             //shift bit for masking
  213.   { SCK=1;                          //clk for SENSI-BUS
  214.     if (DATA) val=(val | i);        //read bit   
  215.         _nop_();_nop_();_nop_();        //pulswith approx. 3 us
  216.     SCK=0;              
  217.   }
  218.   if(ack==1)DATA=0;                 //in case of "ack==1" pull down DATA-Line
  219.   else DATA=1;                      //如果是校驗(ack==0),讀取完后結束通訊
  220.   _nop_();_nop_();_nop_();          //pulswith approx. 3 us
  221.   SCK=1;                            //clk #9 for ack
  222.   _nop_();_nop_();_nop_();          //pulswith approx. 3 us  
  223.   SCK=0;                 
  224.   _nop_();_nop_();_nop_();          //pulswith approx. 3 us
  225.   DATA=1;                           //release DATA-line
  226.   return val;
  227. }

  228. /*--------------------------------------
  229. ;模塊名稱:s_measure();
  230. ;功    能:測量溫濕度函數
  231. ;-------------------------------------*/
  232. char s_measure(unsigned char *p_value, unsigned char *p_checksum, unsigned char mode)
  233. // makes a measurement (humidity/temperature) with checksum
  234. {  
  235.   unsigned error=0;
  236.   unsigned int i;

  237.   s_transstart();                   //transmission start
  238.   switch(mode){                     //send command to sensor
  239.     case TEMP  : error+=s_write_byte(MEASURE_TEMP); break;
  240.     case HUMI  : error+=s_write_byte(MEASURE_HUMI); break;
  241.     default     : break;   
  242.   }
  243.   for (i=0;i<65535;i++) if(DATA==0) break; //wait until sensor has finished the measurement
  244.   if(DATA) error+=1;                // or timeout (~2 sec.) is reached
  245.   *(p_value)  =s_read_byte(ACK);    //read the first byte (MSB)
  246.   *(p_value+1)=s_read_byte(ACK);    //read the second byte (LSB)
  247.   *p_checksum =s_read_byte(noACK);  //read checksum
  248.   return error;
  249. }

  250. /*--------------------------------------
  251. ;模塊名稱:calc_SHT11();
  252. ;功    能:溫濕度補償函數
  253. ;-------------------------------------*/
  254. void calc_SHT11(float *p_humidity ,float *p_temperature)
  255. { const float C1=-4.0;              // for 12 Bit
  256.   const float C2=+0.0405;           // for 12 Bit
  257.   const float C3=-0.0000028;        // for 12 Bit
  258.   const float T1=+0.01;             // for 14 Bit @ 5V
  259.   const float T2=+0.00008;           // for 14 Bit @ 5V

  260.   float rh=*p_humidity;             // rh:      Humidity [Ticks] 12 Bit
  261.   float t=*p_temperature;           // t:       Temperature [Ticks] 14 Bit
  262.   float rh_lin;                     // rh_lin:  Humidity linear
  263.   float rh_true;                    // rh_true: Temperature compensated humidity
  264.   float t_C;                        // t_C   :  Temperature [C]

  265.   t_C=t*0.01 - 40;                  //calc. temperature from ticks to [C]
  266.   rh_lin=C3*rh*rh + C2*rh + C1;     //calc. humidity from ticks to [%RH]
  267.   rh_true=(t_C-25)*(T1+T2*rh)+rh_lin-3;   //calc. temperature compensated humidity [%RH]
  268.   if(rh_true>100)rh_true=100;       //cut if the value is outside of
  269.   if(rh_true<0.1)rh_true=0.1;       //the physical possible range

  270.   *p_temperature=t_C;               //return temperature [C]
  271.   *p_humidity=rh_true;              //return humidity[%RH]
  272. }

  273. //*********主函數*****************
  274. void main(void)
  275. {
  276.         value humi_val,temp_val;
  277.         unsigned char error,checksum;
  278.         unsigned int wendu,shidu;
  279.         LCD_init();        
  280.         s_connectionreset();
  281.         LCD_disp_str(0,1,"TE");
  282.         LCD_disp_str(0,2,"RH");

  283.         LCD_disp_str(2,1,"T");
  284.         LCD_disp_str(2,2,"R");

  285.         while(1)
  286.         {
  287.                   error=0;
  288.           error+=s_measure((unsigned char*) &humi_val.i,&checksum,HUMI);  //measure humidity
  289.           error+=s_measure((unsigned char*) &temp_val.i,&checksum,TEMP);  //measure temperature
  290.           if(error!=0) s_connectionreset();                 //in case of an error: connection reset
  291.           else
  292.           {
  293.                     humi_val.f=(float)humi_val.i;                   //converts integer to float
  294.             temp_val.f=(float)temp_val.i;                   //converts integer to float
  295.             calc_SHT11(&humi_val.f,&temp_val.f);            //calculate humidity, temperature
  296.             wendu=10*temp_val.f;
  297.             LCD_disp_char(2,1,wendu/1000+'0');              //顯示溫度百位
  298.             LCD_disp_char(3,1,(wendu%1000)/100+'0');        //顯示溫度十位
  299.             LCD_disp_char(4,1,(wendu%100)/10+'0');          //顯示溫度個位
  300.             LCD_disp_char(6,1,(wendu%10)+'0');              //顯示溫度小數點后第一位

  301.             shidu=10*humi_val.f;
  302.             LCD_disp_char(2,2,shidu/1000+'0');               //顯示濕度百位
  303.             LCD_disp_char(3,2,(shidu%1000)/100+'0');         //顯示濕度十位
  304.             LCD_disp_char(4,2,(shidu%100)/10+'0');           //顯示濕度個位
  305.             LCD_disp_char(6,2,(shidu%10)+'0');               //顯示濕度小數點后第一位
  306.           }
  307.         }
  308. }
復制代碼


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

使用道具 舉報

沙發
ID:639650 發表于 2019-11-12 09:39 | 只看該作者
有上位機和下位機通過RS485協議進行溫濕度數據傳輸的代碼嗎?
回復

使用道具 舉報

板凳
ID:543942 發表于 2019-12-21 15:51 | 只看該作者
能分享上位機讀取數據界面的軟件嗎
回復

使用道具 舉報

地板
ID:617449 發表于 2019-12-21 16:57 | 只看該作者
asdlkj12310 發表于 2019-12-21 15:51
能分享上位機讀取數據界面的軟件嗎

你好!多點溫濕度上位機執行文件 多點溫濕度監控上位機.rar (1.09 MB, 下載次數: 80)


回復

使用道具 舉報

5#
ID:214276 發表于 2020-3-18 17:14 | 只看該作者
每塊溫濕度板的下位機地址是如何實現設定的呢。有沒有傳輸代碼呢。
回復

使用道具 舉報

6#
ID:617449 發表于 2020-3-22 18:09 | 只看該作者
chinarenxx 發表于 2020-3-18 17:14
每塊溫濕度板的下位機地址是如何實現設定的呢。有沒有傳輸代碼呢。

你好!
下位機控制板的地址,靠撥碼開關來設置;



本設計可以按照具體需求做相應的軟硬件修改
回復

使用道具 舉報

7#
ID:560110 發表于 2020-8-15 23:37 | 只看該作者
zsm6601 發表于 2019-11-12 09:39
有上位機和下位機通過RS485協議進行溫濕度數據傳輸的代碼嗎?

你那有程序了嗎
回復

使用道具 舉報

8#
ID:847662 發表于 2022-4-13 12:31 | 只看該作者
電路圖能分享下嗎樓主
回復

使用道具 舉報

9#
ID:617449 發表于 2022-4-13 12:59 | 只看該作者

需要程序或原理圖都可以
回復

使用道具 舉報

10#
ID:847662 發表于 2022-4-13 13:29 | 只看該作者
還有電路圖能分享下嗎樓主
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 九九综合九九 | 日韩视频91 | 日韩一二区 | 精品视频成人 | 亚洲第一天堂无码专区 | 亚洲精品久久久久久久久久久久久 | 成人av高清在线观看 | 一级做受毛片免费大片 | 国产精品毛片一区二区在线看 | 九九综合 | 国产成人精品网站 | 青青久久av北条麻妃海外网 | 欧美精品a∨在线观看不卡 国产精品久久国产精品 | 99精品免费在线观看 | 高清18麻豆 | 色综合一区二区 | 91在线网站 | 伊人久久精品 | 91国自视频 | 亚洲一区二区三区国产 | 岛国精品 | 欧美一级在线观看 | 亚洲精品久久久久久国产精华液 | 中文字幕亚洲区一区二 | 91精品国产91久久综合桃花 | 午夜国产羞羞视频免费网站 | 最新日韩av | 日韩精品区 | 伊人伊成久久人综合网站 | 中午字幕在线观看 | 91精品久久久久久久久 | 夜夜爽99久久国产综合精品女不卡 | 国产一区二区三区在线 | 国产传媒毛片精品视频第一次 | 免费av一区二区三区 | 欧美日韩综合 | 久久成人18免费网站 | 国产精品自产拍 | www.国产一区| 欧美一区二区三区四区视频 | 久久国产高清 |