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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

如何將單點SHT11溫濕度傳感器測量系統改為多點的?

[復制鏈接]
跳轉到指定樓層
樓主
如何將單點SHT11溫濕度傳感器測量系統改為多點的?





  1. /*************端口定義********************
  2.          P1.0------SCK     (SHT11)
  3.          P1.1------DATA    (SHT11)
  4.          P0------DB0~DB7  (LCD1602)     
  5.          P2.0------RS      (LCD1602)
  6.          P2.1------RW      (LCD1602)
  7.          P2.2------E       (LCD1602)
  8. *****************************************/
  9. #include <reg52.h>
  10. #include <intrins.h>
  11. #include <stdio.h>
  12. #include <string.h>
  13. #include <absacc.h>
  14. #include <math.h>

  15. #define uchar unsigned char
  16. #define uint unsigned int

  17. #define TEMPUP 25       //溫度上限
  18. #define TEMPDOWN 18           //溫度下限
  19. #define HUMDOWN 45           //濕度上限
  20. #define HUMUP  75              //濕度下限

  21. sbit LcdRs= P2^0;   //1602液晶端口定義
  22. sbit LcdRw= P2^1;
  23. sbit LcdEn= P2^2;
  24. sbit led1 =P3^0;    //報警燈端口定義
  25. sbit led2 =P3^4;
  26. sbit beep =P3^1;    //定義蜂鳴器端口
  27. sbit  ACC0 = ACC^0;
  28. sbit  ACC7 = ACC^7;


  29. /******************************************************************/
  30. /*                    延時函數聲明                                */
  31. /******************************************************************/
  32. void mdelay(unsigned int t)
  33. {
  34.   unsigned char n;
  35. for(;t>0;t--)
  36. for(n=0;n<125;n++)
  37.   {;}
  38. }

  39. bit start;
  40. uchar str[7];

  41. //向LCD寫入命令或數據************************************************************
  42. #define LCD_COMMAND                        0      // Command
  43. #define LCD_DATA                        1      // Data
  44. #define LCD_CLEAR_SCREEN        0x01      // 清屏
  45. #define LCD_HOMING                  0x02      // 光標返回原點

  46. //設置顯示模式************************************************************
  47. #define LCD_SHOW                        0x04    //顯示開
  48. #define LCD_HIDE                        0x00    //顯示關         
  49. #define LCD_CURSOR                        0x02         //顯示光標
  50. #define LCD_NO_CURSOR                0x00    //無光標                     
  51. #define LCD_FLASH                        0x01    //光標閃動
  52. #define LCD_NO_FLASH                0x00    //光標不閃動

  53. //設置輸入模式************************************************************
  54. #define LCD_AC_UP                        0x02
  55. #define LCD_AC_DOWN                        0x00      // default
  56. #define LCD_MOVE                        0x01      // 畫面可平移
  57. #define LCD_NO_MOVE                        0x00      //default

  58. unsigned char LCD_Wait(void);
  59. void LCD_Write(bit style, unsigned char input);

  60. /***********1602液晶顯示部分子程序****************/
  61. void delay(uint z)          //延時函數
  62. {
  63.         uint x,y;
  64.         for(x=z;x>0;x--)
  65.                 for(y=110;y>0;y--);
  66. }

  67. void LCD_Write(bit style, unsigned char input)         
  68. {
  69.         LcdRs=style;
  70.         P0=input;
  71.         delay(5);
  72.         LcdEn=1;
  73.         delay(5);        
  74.         LcdEn=0;        
  75. }


  76. void LCD_SetDisplay(unsigned char DisplayMode)           //設置輸出
  77. {
  78.         LCD_Write(LCD_COMMAND, 0x08|DisplayMode);        
  79. }



  80. void LCD_SetInput(unsigned char InputMode)          //設置輸入
  81. {
  82.         LCD_Write(LCD_COMMAND, 0x04|InputMode);
  83. }


  84. void LCD_Initial()         //初始化LCD函數
  85. {
  86.         LcdEn=0;
  87.         LCD_Write(LCD_COMMAND,0x38);           //8位數據端口,2行顯示,5*7點陣
  88.         LCD_Write(LCD_COMMAND,0x38);
  89.         LCD_SetDisplay(LCD_SHOW|LCD_NO_CURSOR);    //開啟顯示, 無光標
  90.         LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN);   //清屏
  91.         LCD_SetInput(LCD_AC_UP|LCD_NO_MOVE);       //AC遞增, 畫面不動
  92. }


  93. void GotoXY(unsigned char x, unsigned char y)  //液晶字符輸入的位置
  94. {
  95.         if(y==0)
  96.                 LCD_Write(LCD_COMMAND,0x80|x);
  97.         if(y==1)
  98.                 LCD_Write(LCD_COMMAND,0x80|(x-0x40));
  99. }


  100. void Print(unsigned char *str)        //將字符輸出到液晶顯示
  101. {
  102.         while(*str!='\0')
  103.         {
  104.                 LCD_Write(LCD_DATA,*str);
  105.                 str++;
  106.         }
  107. }


  108. void zhuanhuan(float a)//浮點數轉換成字符串函數
  109. {         
  110.         memset(str,0,sizeof(str));
  111.         sprintf (str,"%f", a);
  112. }


  113. void welcome()         //初始界面函數
  114. {
  115.         LCD_Initial();
  116.         GotoXY(0,0);
  117.         Print("   Welcome!  ");
  118.         GotoXY(0,1);
  119.         Print("  Code of sht11 ");
  120.         delay(200);
  121. }


  122. void delay_n10us(uint n)  //延時n個10us@12M晶振
  123. {      
  124.         uint i;           
  125.         for(i=n;i>0;i--)   
  126.         {
  127.                 _nop_();_nop_();_nop_();
  128.                         _nop_();_nop_();_nop_();
  129.                 }
  130. }                                    

  131. /*********************第一部分LCD1602設置 END****************************************/


  132. /*********************第二部分SHT11設置   START**************************************/
  133. sbit SCK  = P1^0;      //定義通訊時鐘端口
  134. sbit DATA = P1^1;      //定義通訊數據端口

  135. typedef union  
  136. { unsigned int i;      //定義了兩個共用體
  137.   float f;
  138. } value;
  139. enum {TEMP,HUMI};      //TEMP=0,HUMI=1

  140. #define noACK 0             //用于判斷是否結束通訊
  141. #define ACK   1             //結束數據傳輸
  142.                             //adr  command  r/w
  143. #define STATUS_REG_W 0x06   //000   0011    0
  144. #define STATUS_REG_R 0x07   //000   0011    1
  145. #define MEASURE_TEMP 0x03   //000   0001    1
  146. #define MEASURE_HUMI 0x05   //000   0010    1
  147. #define RESET        0x1e   //000   1111    0
  148. /****************定義函數****************/
  149. void s_transstart(void);               //啟動傳輸函數
  150. void s_connectionreset(void);          //連接復位函數
  151. char s_write_byte(unsigned char value);//SHT11寫函數
  152. char s_read_byte(unsigned char ack);   //SHT11讀函數
  153. char s_measure(unsigned char *p_value, unsigned char *p_checksum, unsigned char mode);//測量溫濕度函數
  154. void calc_dht90(float *p_humidity ,float *p_temperature);//溫濕度補償


  155. void s_transstart(void)  //啟動傳輸函數
  156. // generates a transmission start  
  157. //       _____         ________
  158. // DATA:      |_______|
  159. //           ___     ___
  160. // SCK : ___|   |___|   |______
  161. {   
  162.    DATA=1; SCK=0;                   //Initial state
  163.    _nop_();
  164.    SCK=1;
  165.    _nop_();
  166.    DATA=0;
  167.    _nop_();
  168.    SCK=0;   
  169.    _nop_();_nop_();_nop_();
  170.    SCK=1;
  171.    _nop_();
  172.    DATA=1;        
  173.    _nop_();
  174.    SCK=0;        
  175. }


  176. void s_connectionreset(void)   //連接復位函數
  177. // communication reset: DATA-line=1 and at least 9 SCK cycles followed by transstart
  178. //       _____________________________________________________         ________
  179. // DATA:                                                      |_______|
  180. //       _  _   _  _  _   _  _  _  _       ___    ___
  181. // SCK : __| |__| |__| |__| |__| |__| |__| |__| |__| |______|   |___|   |______
  182. {   
  183.   unsigned char i;  
  184.   DATA=1; SCK=0;                    //Initial state
  185.   for(i=0;i<9;i++)                  //9 SCK cycles
  186.   {
  187.     SCK=1;
  188.     SCK=0;
  189.   }
  190.   s_transstart();                   //transmission start
  191. }


  192. char s_write_byte(unsigned char value)         // SHT11寫字節函數
  193. //----------------------------------------------------------------------------------
  194. // writes a byte on the Sensibus and checks the acknowledge  
  195. {  
  196.   unsigned char i,error=0;   
  197.   for (i=0x80;i>0;i/=2)             //shift bit for masking
  198.   {  
  199.     if (i & value) DATA=1;          //masking value with i , write to SENSI-BUS
  200.     else DATA=0;                        
  201.     SCK=1;                          //clk for SENSI-BUS
  202.     _nop_();_nop_();_nop_();        //pulswith approx. 3 us     
  203.     SCK=0;
  204.   }
  205.   DATA=1;                           //release DATA-line
  206.   SCK=1;                            //clk #9 for ack  
  207.   error=DATA;                       //check ack (DATA will be pulled down by DHT90),DATA在第9個上升沿將被DHT90自動下拉為低電平。
  208.   _nop_();_nop_();_nop_();
  209.   SCK=0;
  210.   DATA=1;                           //release DATA-line
  211.   return error;                     //error=1 in case of no acknowledge //返回:0成功,1失敗
  212. }


  213. /*****SHT11讀函數   reads a byte form the Sensibus
  214. and gives an acknowledge in case of "ack=1"****/
  215. char s_read_byte(unsigned char ack)   
  216. {  
  217.   unsigned char i,val=0;
  218.   DATA=1;                           //release DATA-line
  219.   for (i=0x80;i>0;i/=2)             //shift bit for masking
  220.   { SCK=1;                          //clk for SENSI-BUS
  221.     if (DATA) val=(val | i);        //read bit   
  222.         _nop_();_nop_();_nop_();        //pulswith approx. 3 us
  223.     SCK=0;              
  224.   }
  225.   if(ack==1)DATA=0;                 //in case of "ack==1" pull down DATA-Line
  226.   else DATA=1;                      //如果是校驗(ack==0),讀取完后結束通訊
  227.   _nop_();_nop_();_nop_();          //pulswith approx. 3 us
  228.   SCK=1;                            //clk #9 for ack
  229.   _nop_();_nop_();_nop_();          //pulswith approx. 3 us  
  230.   SCK=0;                 
  231.   _nop_();_nop_();_nop_();          //pulswith approx. 3 us
  232.   DATA=1;                           //release DATA-line
  233.   return val;
  234. }


  235. /*  測量溫濕度函數 makes a measurement
  236. (humidity/temperature) with checksum */
  237. char s_measure(unsigned char *p_value, unsigned char *p_checksum, unsigned char mode)
  238. {  
  239.   unsigned error=0;
  240.   unsigned int i;

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


  254. void calc_sht90(float *p_humidity ,float *p_temperature)    //溫濕度補償函數
  255. // calculates temperature [C] and humidity [%RH]
  256. // input :  humi [Ticks] (12 bit)
  257. //          temp [Ticks] (14 bit)
  258. // output:  humi [%RH]
  259. //          temp [C]
  260. { const float C1=-4.0;              // for 12 Bit
  261.   const float C2=+0.0405;           // for 12 Bit
  262.   const float C3=-0.0000028;        // for 12 Bit
  263.   const float T1=+0.01;             // for 14 Bit @ 5V
  264.   const float T2=+0.00008;           // for 14 Bit @ 5V

  265.   float rh=*p_humidity;             // rh:      Humidity [Ticks] 12 Bit
  266.   float t=*p_temperature;           // t:       Temperature [Ticks] 14 Bit
  267.   float rh_lin;                     // rh_lin:  Humidity linear
  268.   float rh_true;                    // rh_true: Temperature compensated humidity
  269.   float t_C;                        // t_C   :  Temperature [C]

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

  275.   *p_temperature=t_C;               //return temperature [C]
  276.   *p_humidity=rh_true;              //return humidity[%RH]
  277. }
  278. /**************第二部分SHT11設置   END*****************************/



  279. /***************************主函數************************************/
  280. void main(void)
  281. {
  282.         int a,b;
  283.                 value humi_val,temp_val;
  284.         unsigned char error,checksum,i;
  285.             LcdRw=0;
  286.                 led1=0;
  287.                 led2=0;
  288.                 beep=1;
  289.                 start=0;
  290.        s_connectionreset();
  291.        welcome();//顯示歡迎畫面
  292.        delay(2000);
  293.                 LCD_Initial();
  294.         while(1)
  295.         { error=0;
  296.           error+=s_measure((unsigned char*) &humi_val.i,&checksum,HUMI);  
  297.           error+=s_measure((unsigned char*) &temp_val.i,&checksum,TEMP);  
  298.           if(error!=0)
  299.                    s_connectionreset();                 //in case of an error: connection reset
  300.           else
  301.           {
  302.                     humi_val.f=(float)humi_val.i;       //converts integer to float
  303.             temp_val.f=(float)temp_val.i;      //converts integer to float
  304.             calc_sht90(&humi_val.f,&temp_val.f);      //計算濕度與溫度
  305.                          GotoXY(0,0);//
  306.                 Print("Tep:");
  307.                     GotoXY(0,1);
  308.                 Print("Hum:");
  309.                     zhuanhuan(temp_val.f);         //轉換溫度為uchar方便液晶顯示
  310.                         GotoXY(5,0);
  311.                         str[5]=0xDF;//℃的符號
  312.                 str[6]=0x43;
  313.                         str[7]='\0';
  314.                 Print(str);
  315.                           if( temp_val.f>TEMPUP-1 || temp_val.f<TEMPDOWN-1 )
  316.                       {
  317.                                           //led1=1;
  318. //                                          beep=1;
  319.                                           a=1;
  320.                                           }  
  321.               else
  322.                    {
  323.                      //led1=0;  
  324. //                                          beep=0;
  325.                                           a=0 ;
  326.                                           }
  327.                         zhuanhuan(humi_val.f);//轉換濕度為uchar方便液晶顯示
  328.                     GotoXY(5,1);
  329.                         str[5]='%';//%的符號
  330.                 str[6]='\0';//字符串結束標志
  331.                  Print(str);
  332.                                 if( humi_val.f>HUMUP-1 || humi_val.f<HUMDOWN-1 )
  333. //                      {  led2=1;
  334. //                                                beep2=1;}  
  335.                        {  
  336.                                             //led2=1;
  337. //                                               beep=1;
  338.                                                         b=1;
  339.                                              }
  340.                    else
  341.                       {  
  342.                                           //led2=0;  
  343. //                                     beep=0;
  344.                         b=0;
  345.                                          }
  346.                                          if(a==1&&b==1)
  347.                                          {
  348.                                          led1=1;
  349.                                          led2=1;
  350.                                          beep=0;
  351.                                          }
  352.                                          else if(a==1&&b==0)
  353.                                          {
  354.                                          led1=1;
  355.                                          led2=0;
  356.                                          beep=0;
  357.                                          }
  358.                                          else if(a==0&&b==1)
  359.                                          {
  360.                                          led1=0;
  361.                                          led2=1;
  362.                                          beep=0;
  363.                                          }
  364.                                          else if(a==0&&b==0)
  365.                                          {
  366.                                          led1=0;
  367.                                          led2=0;
  368.                                          beep=1;
  369.                                          }
  370. //                      if(a==1||b==1)
  371. //                                          beep=1;
  372. //                                          else
  373. //                                          beep=0;
  374. //                                         a=b=0;
  375.                          }
  376.                  delay_n10us(80000);                                //延時約0.8s
  377.    }               
  378. }
復制代碼
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:82765 發表于 2017-5-15 20:22 | 只看該作者
提示: 作者被禁止或刪除 內容自動屏蔽
回復

使用道具 舉報

板凳
ID:123289 發表于 2017-5-16 08:14 | 只看該作者
將一個點的測量程序,做成子程序,其參數只用傳感器的端口號,每測一個端口(傳感器)調用一次,不就OK了嗎。
回復

使用道具 舉報

地板
ID:196914 發表于 2017-5-16 08:27 | 只看該作者
cjjcjj1 發表于 2017-5-15 20:22
你好!溫濕度測量,你想改成多少個點位呢

你好,三個傳感器采集就好,請問該怎么改
回復

使用道具 舉報

5#
ID:196914 發表于 2017-5-16 09:40 | 只看該作者
cjjcjj1 發表于 2017-5-15 20:22
你好!溫濕度測量,你想改成多少個點位呢

三個傳感器,就是不知道顯示器該怎么改才能顯示幾組數據
回復

使用道具 舉報

6#
ID:196914 發表于 2017-5-16 13:10 | 只看該作者
yzwzfyz 發表于 2017-5-16 08:14
將一個點的測量程序,做成子程序,其參數只用傳感器的端口號,每測一個端口(傳感器)調用一次,不就OK了嗎 ...

可是那不就不能同時測量了嗎?
回復

使用道具 舉報

7#
ID:123289 發表于 2017-5-16 23:22 | 只看該作者
1、其一,采樣命令可同時下,數據下載可以不同時,這時采樣是同時的。
2、其二,溫度是個慣性較大的東東,即使采樣不同時,問題也不大,相對于單片機程序和速度,這點時差對結果影響不大。
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 成人在线电影在线观看 | 麻豆久久久久久久久久 | 国产成人综合在线 | 久久成人一区 | 久久精品99 | 日韩欧美在线视频 | 亚洲一区二区久久久 | 一区二区免费 | 亚洲一区二区精品视频 | 999久久久国产精品 欧美成人h版在线观看 | 国产精品视频网 | 国产午夜精品久久久 | 国产三区视频在线观看 | 国产一级淫片免费视频 | 丝袜美腿一区二区三区动态图 | 国产视频福利一区 | 国内av在线| 日本一区二区不卡视频 | 亚洲视频一区在线 | 欧美成人二区 | 亚洲视频免费在线观看 | 中文字字幕一区二区三区四区五区 | 中文字幕免费在线 | 亚洲免费在线观看视频 | 国产精品美女久久久久aⅴ国产馆 | 一级视频在线免费观看 | 日韩欧美在线免费观看 | 一区二区三区不卡视频 | 久久国产精品99久久久大便 | 亚洲一区二区三区高清 | 99国产精品久久久久久久 | 久久最新 | av福利网站 | 狠狠综合久久av一区二区老牛 | 成人福利网| 日本精品一区二区 | 国内av在线| 伊人最新网址 | 欧美一卡二卡在线 | 午夜伊人 | 亚洲伊人久久综合 |