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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機+SHT10濕度傳感器Proteus仿真程序

[復制鏈接]
跳轉到指定樓層
樓主
附有代碼和仿真程序以供參考


單片機源程序如下:
  1. #include <reg52.h>
  2. #include <intrins.h>  
  3. #include <math.h>    //Keil library   
  4. #include <stdio.h>   //Keil library  

  5. //*********************第一部分LCD1602設置

  6. //START****************************************
  7. #define LCD_DB        P0
  8. sbit         LCD_RS=P1^0;   //P2^0是p2.0的意思;LCD_RS
  9. sbit         LCD_RW=P1^1;   //P2^1是p2.1的意思
  10. sbit         LCD_E=P1^2;    //P2^2是p2.2的意思

  11. /******定義函數****************/
  12. #define uchar unsigned char
  13. #define uint unsigned int
  14. typedef unsigned long  U32;
  15. typedef signed   long  S32;      /* defined for signed 32-bits integer variable           有符號32位整型變量 */
  16. typedef float          F32;
  17. void LCD_init(void);                          //初始化函數
  18. void LCD_write_command(uchar command);        //寫指令函數
  19. void LCD_write_data(uchar dat);               //寫數據函數
  20. void LCD_disp_char(uchar x,uchar y,uchar dat);//在某個屏幕位置上顯示一個字符,X(0-15),y(1-2)
  21. void LCD_disp_str(uchar x,uchar y,uchar *str); //LCD1602顯示字符串函數
  22. void delay_n10us(uint n);                     //延時函數



  23. /*--------------------------------------  
  24. ;模塊名稱:LCD_init();  
  25. ;功    能:初始化LCD1602  
  26. ;占用資源:--
  27. ;參數說明:--
  28. ;創建日期:2008.08.15  
  29. ;版    本:FV1.0(函數版本Function Version)
  30. ;修改日期:--
  31. ;修改說明:--
  32. ;-------------------------------------*/  
  33. void LCD_init(void)
  34. {
  35.         delay_n10us(10);
  36.         LCD_write_command(0x38);//設置8位格式,2行,5x7
  37.         delay_n10us(10);
  38.         LCD_write_command(0x0c);//整體顯示,關光標,不閃爍
  39.         delay_n10us(10);
  40.         LCD_write_command(0x06);//設定輸入方式,增量不移位
  41.         delay_n10us(10);
  42.         LCD_write_command(0x01);//清除屏幕顯示
  43.         delay_n10us(100);       //延時清屏,延時函數,延時約n個10us
  44. }


  45. /*--------------------------------------  
  46. ;模塊名稱:LCD_write_command();  
  47. ;功    能:LCD1602寫指令函數  
  48. ;占用資源: P2.0--RS(LCD_RS),P2.1--RW(LCD_RW),P2.2--E(LCD_E).
  49. ;參數說明:dat為寫命令參數
  50. ;創建日期:2008.08.15  
  51. ;版    本:FV1.0(函數版本Function Version)
  52. ;修改日期:--
  53. ;修改說明:--
  54. ;-------------------------------------*/  
  55. void LCD_write_command(uchar dat)
  56. {
  57.         delay_n10us(10);
  58.         LCD_RS=0;         //指令
  59.         LCD_RW=0;         //寫入
  60.         LCD_E=1;          //允許
  61.         LCD_DB=dat;
  62.         delay_n10us(10);  //實踐證明,我的LCD1602上,用for循環1次就能完成普通寫指令。
  63.         LCD_E=0;
  64.         delay_n10us(10);  //實踐證明,我的LCD1602上,用for循環1次就能完成普通寫指令。
  65. }


  66. /*--------------------------------------  
  67. ;模塊名稱:LCD_write_data();  
  68. ;功    能:LCD1602寫數據函數  
  69. ;占用資源: P2.0--RS(LCD_RS),P2.1--RW(LCD_RW),P2.2--E(LCD_E).
  70. ;參數說明:dat為寫數據參數
  71. ;創建日期:2008.08.15  
  72. ;版    本:FV1.0(函數版本Function Version)
  73. ;修改日期:--
  74. ;修改說明:--
  75. ;-------------------------------------*/
  76. void LCD_write_data(uchar dat)
  77. {
  78.         delay_n10us(10);
  79.         LCD_RS=1;          //數據
  80.         LCD_RW=0;          //寫入
  81.         LCD_E=1;           //允許
  82.         LCD_DB=dat;
  83.         delay_n10us(10);
  84.         LCD_E=0;
  85.         delay_n10us(10);
  86. }


  87. /*--------------------------------------  
  88. ;模塊名稱:LCD_disp_char();  
  89. ;功    能:LCD1602顯示一個字符函數,在某個屏幕位置上顯示一個字符

  90. ,X(0-15),y(1-2)。
  91. ;占用資源:--
  92. ;參數說明:X為1602的列值(取值范圍是0-15),y為1602的行值(取值范圍

  93. 是1-2),dat為所要顯示字符對應的地址參數。
  94. ;創建日期:2008.08.15  
  95. ;版    本:FV1.0(函數版本Function Version)
  96. ;修改日期:--
  97. ;修改說明:--
  98. ;-------------------------------------*/
  99. void LCD_disp_char(uchar x,uchar y,uchar dat)
  100. {
  101.           uchar address;
  102.           if(y==1)
  103.          address=0x80+x;
  104.           else
  105.          address=0xc0+x;
  106.           LCD_write_command(address);
  107.           LCD_write_data(dat);
  108. }



  109. /*--------------------------------------  
  110. ;模塊名稱:LCD_disp_str();  
  111. ;功    能:LCD1602顯示字符串函數,在某個屏幕起始位置{X(0-15),y

  112. (1-2)}上顯示一個字符串。
  113. ;占用資源:--
  114. ;參數說明:X為1602的列值(取值范圍是0-15),y為1602的行值(取值范圍

  115. 是1-2),str為所要顯示字符串對應的指針參數。
  116. ;創建日期:2008.08.16  
  117. ;版    本:FV1.0(函數版本Function Version)
  118. ;修改日期:--
  119. ;修改說明:--  
  120. ;-------------------------------------*/
  121. void LCD_disp_str(uchar x,uchar y,uchar *str)
  122. {
  123.           uchar address;
  124.           if(y==1)
  125.          address=0x80+x;
  126.           else
  127.          address=0xc0+x;
  128.           LCD_write_command(address);
  129.           while(*str!='\0')
  130.           {  
  131.             LCD_write_data(*str);   
  132.             str++;
  133.           }
  134. }


  135. /*--------------------------------------  
  136. ;模塊名稱:delay_n10us();  
  137. ;功    能:延時函數,延時約n個10us
  138. ;占用資源:--
  139. ;參數說明:--
  140. ;創建日期:2008.08.15  
  141. ;版    本:FV1.1(函數版本Function Version)
  142. ;修改日期:2008.08.16
  143. ;修改說明:修改為較精確的延時函數
  144. ;-------------------------------------*/
  145. void delay_n10us(uint n)
  146. {        
  147.         uint i;            
  148.         for(i=n;i>0;i--)
  149.         {
  150.         _nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); //延時10us@12M晶振
  151. }
  152. }                                    

  153. //*********************第一部分LCD1602設置

  154. //END****************************************


  155. //*********************第二部分DHT90設置   

  156. //START****************************************
  157. bit set_temp_up=0;
  158. bit set_temp_down=0;
  159. bit set_humidity_up=0;
  160. bit set_humidity_down=0;


  161. sbit SCK  = P3^2;      //定義通訊時鐘端口
  162. sbit DATA = P3^3;      //定義通訊數據端口
  163. sbit D1=P3^4;   //定義溫度報警端口
  164. sbit D2=P3^5;           //定義濕度報警端口
  165. sbit D3=P3^6;   //定義溫度報警端口
  166. sbit D4=P3^7;           //定義濕度報警端口
  167. sbit key_set=P1^3;//設置功能選擇鍵
  168. sbit key_up=P1^4;//數字鍵加+
  169. sbit key_down=P1^5;//數字鍵減-

  170. uchar selectnum=0,downnum=0,checknum;
  171. uchar value_shi,value_ge,downnum_shi,downnum_ge;
  172. uchar  shidu_shi,shidu_ge,wendu_shi,wendu_ge;
  173. sbit PWMZ = P2^0;      //定義調速端口
  174. sbit PWMF = P2^1;      //定義調速端口
  175. sbit PWMZ2 = P2^3;      //定義調速端口
  176. sbit PWMF2 = P2^4;      //定義調速端口
  177. sbit Alarm = P2^5;
  178. bit temp_alarm_flag=1;
  179. bit rh_alarm_flag=1;
  180. unsigned char CYCLE;  //定義周期 該數字X基準定時時間 如果是10 則周期是10 x 0.1ms
  181. unsigned char PWM_ON ;//定義高電平時間
  182. uchar flag;
  183. unsigned char CYCLE2;  //定義周期 該數字X基準定時時間 如果是10 則周期是10 x 0.1ms
  184. unsigned char PWM_ON2 ;//定義高電平時間
  185. uchar flag2;
  186. uchar temp_uplimit,temp_lowlimit,humidity_uplimit,humidity_lowlimit;
  187. unsigned int Alarm_temp_up=260,Alarm_temp_low=240,Alarm_humidity_up=700,Alarm_humidity_low=500;
  188. unsigned int wendu,shidu;
  189. typedef union   
  190. {
  191.         unsigned int i;      //定義了兩個共用體
  192.           float f;  
  193. } value;  

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

  196. #define noACK 0             //用于判斷是否結束通訊
  197. #define ACK   1             //結束數據傳輸
  198.                             //adr  command  r/w  
  199. #define STATUS_REG_W 0x06   //000   0011    0  
  200. #define STATUS_REG_R 0x07   //000   0011    1  
  201. #define MEASURE_TEMP 0x03   //000   0001    1  
  202. #define MEASURE_HUMI 0x05   //000   0010    1  
  203. #define RESET        0x1e   //000   1111    0  

  204. /****************定義函數****************/
  205. void s_transstart(void);               //啟動傳輸函數
  206. void s_connectionreset(void);          //連接復位函數
  207. char s_write_byte(unsigned char value);//DHT90寫函數
  208. char s_read_byte(unsigned char ack);   //DHT90讀函數
  209. char s_measure(unsigned char *p_value, unsigned char *p_checksum, unsigned char mode);//測量溫濕度函數
  210. void calc_dht90(float *p_humidity ,float *p_temperature);//溫濕度補償
  211. /*--------------------------------------  
  212. ;模塊名稱:s_transstart();  
  213. ;功    能:啟動傳輸函數
  214. ;占用資源:--
  215. ;參數說明:--
  216. ;創建日期:2008.08.15  
  217. ;版    本:FV1.0(函數版本Function Version)
  218. ;修改日期:--
  219. ;修改說明:--
  220. ;-------------------------------------*/   
  221. void s_transstart(void)  
  222. // generates a transmission start   
  223. //       _____         ________  
  224. // DATA:      |_______|  
  225. //           ___     ___  
  226. // SCK : ___|   |___|   |______  
  227. {   
  228.    DATA=1; SCK=0;                   // 初始化狀態
  229.                                     // 對DATA SCK高低電平變化
  230.    _nop_();  
  231.    SCK=1;  
  232.    _nop_();  
  233.    DATA=0;  
  234.    _nop_();  
  235.    SCK=0;   
  236.    _nop_();_nop_();_nop_();  
  237.    SCK=1;  
  238.    _nop_();  
  239.    DATA=1;         
  240.    _nop_();  
  241.    SCK=0;         
  242. }  

  243. /*--------------------------------------  
  244. ;模塊名稱:s_connectionreset();  
  245. ;功    能:連接復位函數
  246. ;占用資源:--
  247. ;參數說明:--
  248. ;創建日期:2008.08.15  
  249. ;版    本:FV1.0(函數版本Function Version)
  250. ;修改日期:--
  251. ;修改說明:--
  252. ;-------------------------------------*/  
  253. void s_connectionreset(void)  
  254. // communication reset: DATA-line=1 and at least 9 SCK cycles followed by transstart  
  255. //       _____________________________________________________________  
  256. // DATA:                                                      |_______|  
  257. //          _    _    _    _    _    _    _    _    _        ___     ___  
  258. // SCK : __| |__| |__| |__| |__| |__| |__| |__| |__| |______|   |___|   |______  
  259. {   
  260.   unsigned char i;   
  261.   DATA=1; SCK=0;                    //初始信號狀態  
  262.   for(i=0;i<9;i++)                  //執行9個時鐘信號
  263.   {  
  264.     SCK=1;
  265.     SCK=0;  
  266.   }  
  267.   s_transstart();                   // 調用啟動傳輸函數
  268. }  
  269. void delay1ms(uint z) //這是一個毫秒級別的顯示函數
  270. {
  271.         uint x,y;
  272.         for(x=z;x>0;x--)
  273.                 for(y=110;y>0;y--);
  274. }

  275. /*--------------------------------------  
  276. ;模塊名稱:s_write_byte();  
  277. ;功    能:DHT90寫函數
  278. ;占用資源:--
  279. ;參數說明:--
  280. ;創建日期:2008.08.15  
  281. ;版    本:FV1.0(函數版本Function Version)
  282. ;修改日期:--
  283. ;修改說明:--
  284. ;-------------------------------------*/  
  285. char s_write_byte(unsigned char value)  
  286. //----------------------------------------------------------------------------------  
  287. // writes a byte on the Sensibus and checks the acknowledge   
  288. {   
  289.           unsigned char i,error=0;   
  290.           for (i=0x80;i>0;i/=2)             //shift bit for masking  
  291.           {   
  292.             if (i & value) DATA=1;          //masking value with i , write to SENSI-BUS  
  293.             else DATA=0;                          
  294.             SCK=1;                          //clk for SENSI-BUS  
  295.             _nop_();_nop_();_nop_();        //pulswith approx. 5 us      
  296.             SCK=0;  
  297.           }  
  298.           DATA=1;                           //release DATA-line  
  299.           SCK=1;                            //clk #9 for ack   
  300.           error=DATA;                       //check ack (DATA will be pulled down by DHT90),DATA在第9個上升沿將被DHT90自動下拉為低電平。  
  301.           _nop_();_nop_();_nop_();
  302.           SCK=0;
  303.           DATA=1;                           //release DATA-line  
  304.           return error;                     //error=1 in case of no acknowledge //返回:0成功,1失敗
  305. }  

  306.   

  307. /*--------------------------------------  
  308. ;模塊名稱:s_read_byte();  
  309. ;功    能:DHT90讀函數
  310. ;占用資源:--
  311. ;參數說明:--
  312. ;創建日期:2008.08.15  
  313. ;版    本:FV1.0(函數版本Function Version)
  314. ;修改日期:--
  315. ;修改說明:--
  316. ;-------------------------------------*/  
  317. char s_read_byte(unsigned char ack)   
  318. // reads a byte form the Sensibus and gives an acknowledge in case of "ack=1"   
  319. {   
  320.           unsigned char i,val=0;  
  321.           DATA=1;                           //初始化  
  322.           for (i=0x80;i>0;i/=2)            //開始讀取數據
  323.           {
  324.                 SCK=1;                           
  325.             if (DATA) val=(val | i);            
  326.                 _nop_();_nop_();_nop_();         
  327.             SCK=0;               
  328.           }  
  329.           if(ack==1)DATA=0;                 //如果是校驗(ack==0),表示還沒讀取數據完成
  330.           else DATA=1;                      //如果是校驗(ack==0),讀取完后結束通訊
  331.           _nop_();_nop_();_nop_();          //延時 5 us  
  332.           SCK=1;                            //SCK拉高
  333.           _nop_();_nop_();_nop_();          //延時 5 us   
  334.           SCK=0;                                     //SCK拉低
  335.           _nop_();_nop_();_nop_();          //pulswith approx. 5 us  
  336.           DATA=1;                           //返回初始狀態
  337.           return val;  
  338. }  


  339.   

  340. /*--------------------------------------  
  341. ;模塊名稱:s_measure();  
  342. ;功    能:測量溫濕度函數
  343. ;占用資源:--
  344. ;參數說明:--
  345. ;創建日期:2008.08.15  
  346. ;版    本:FV1.0(函數版本Function Version)
  347. ;修改日期:--
  348. ;修改說明:--
  349. ;-------------------------------------*/  
  350. char s_measure(unsigned char *p_value, unsigned char *p_checksum, unsigned char mode)  
  351. // makes a measurement (humidity/temperature) with checksum  
  352. {   
  353.           unsigned error=0;  
  354.           unsigned int i;  
  355.   
  356.           s_transstart();                   //啟動傳輸函數   
  357.           switch(mode)
  358.         {                     //發送命令到傳感器  
  359.             case TEMP  : error+=s_write_byte(MEASURE_TEMP); break;  
  360.             case HUMI  : error+=s_write_byte(MEASURE_HUMI); break;  
  361.             default     : break;     
  362.           }  
  363.           for (i=0;i<65535;i++) if(DATA==0) break; //直到測量溫度 濕度完畢  
  364.           if(DATA) error+=1;                // 判斷是否在測量過程中發送錯誤  
  365.           *(p_value)  =s_read_byte(ACK);    //讀取第一個字節


  366.           *(p_value+1)=s_read_byte(ACK);    //讀取第2個字節  
  367.           *p_checksum =s_read_byte(noACK);  //讀取校驗碼
  368.           return error;            //返回錯誤 標志
  369. }  
  370.   

  371. /*--------------------------------------  
  372. ;模塊名稱:calc_dht90();  
  373. ;功    能:溫濕度補償函數
  374. ;占用資源:--
  375. ;參數說明:--
  376. ;創建日期:2008.08.15  
  377. ;版    本:FV1.0(函數版本Function Version)
  378. ;修改日期:--
  379. ;修改說明:--
  380. ;-------------------------------------*/  
  381. void calc_dht90(float *p_humidity ,float *p_temperature)
  382. {
  383.         const float C1=-4.0;              // 定義C1為浮點數類型
  384.           const float C2=+0.0405;           //  定義C2為浮點數類型
  385.           const float C3=-0.0000028;        //  定義C3為浮點數類型
  386.           const float T1=+0.01;              // 定義T1為浮點數類型
  387.           const float T2=+0.00008;           // 定義T1為浮點數類型

  388.           float rh=*p_humidity;             // 定義rh為浮點數類型
  389.     float t=*p_temperature;           // 定義t為浮點數類型
  390.            float rh_lin;                     // 定義rh_lin為浮點數類型
  391.           float rh_true;                    // 定義rh_true為浮點數類型
  392.           float t_C;                        // 定義t_C為浮點數類型
  393.     t_C=t*0.01 - 40;                  //溫度補償
  394.           rh_lin=C3*rh*rh + C2*rh + C1;     //濕度補償
  395.           rh_true=(t_C-25)*(T1+T2*rh)+rh_lin;  //計算濕度值
  396.           if(rh_true>100)rh_true=100;       //如果測量到的數據大于100,取值為100
  397.           if(rh_true<0.1)rh_true=0.1;       //確定測量精度為一位小數點

  398.           *p_temperature=t_C;               //返回溫度值
  399.           *p_humidity=rh_true;              //返回濕度值
  400. }

  401. void Key_function_scan()
  402. {
  403.           if(key_set==0)
  404.         {
  405.                 delay1ms(10);
  406.                 if(key_set==0)
  407.                 {        
  408.                          TR0 = 0;
  409.                         TR1 = 0;         
  410.         
  411.             LCD_disp_str(0,1,"               ");
  412.                 LCD_disp_str(0,2,"               ");//清屏
  413.                         selectnum++;
  414.                     if(selectnum==1)
  415.                         {
  416.                                   set_temp_up=1;//設置溫度上限位
  417.                                   set_temp_down=0;
  418.                                   set_humidity_up=0;
  419.                                   set_humidity_down=0;
  420.                                   LCD_disp_str(0,1," Set_Temp_Hight ");
  421.                       LCD_disp_char(5,2,(Alarm_temp_up%1000)/100+'0');        
  422.                           LCD_disp_char(6,2,(Alarm_temp_up%100)/10+'0');         
  423.                                   LCD_disp_char(7,2,'.');               
  424.                                   LCD_disp_char(8,2,(Alarm_temp_up%10)+'0');               
  425.             
  426.                         }
  427.                         if(selectnum==2)
  428.                         {
  429.                      set_temp_down=1;//設置溫度下限位
  430.                                  set_temp_up=0;
  431.                                  set_humidity_up=0;
  432.                                  set_humidity_down=0;
  433.                      LCD_disp_str(0,1," Set_Temp_Low   ");
  434.                     LCD_disp_char(5,2,(Alarm_temp_low%1000)/100+'0');        //顯示溫度十位
  435.                     LCD_disp_char(6,2,(Alarm_temp_low%100)/10+'0');          //顯示溫度個位
  436.                                 LCD_disp_char(7,2,'.');               
  437.                                 LCD_disp_char(8,2,(Alarm_temp_low%10)+'0');              //顯示溫度小數點后第一位
  438.             
  439.                         }
  440.                     if(selectnum==3)
  441.                         {
  442.                                  set_humidity_up=1;//設置濕度上限位
  443.                                  set_humidity_down=0;
  444.                                  set_temp_down=0;
  445.                                  set_temp_up=0;
  446.                          LCD_disp_str(0,1," Set_Hum_Hight  ");
  447.                   LCD_disp_char(5,2,(Alarm_humidity_up%1000)/100+'0');        //顯示濕度十位
  448.                           LCD_disp_char(6,2,(Alarm_humidity_up%100)/10+'0');          //顯示濕度個位
  449.                                   LCD_disp_char(7,2,'.');               
  450.                                   LCD_disp_char(8,2,(Alarm_humidity_up%10)+'0');              //顯示濕度小數點后第一位

  451.                         }
  452.                         if(selectnum==4)
  453.                         {
  454.                       set_humidity_down=1;//設置濕度下限位
  455.                                   set_humidity_up=0;
  456.                                   set_temp_down=0;
  457.                                   set_temp_up=0;
  458.                            LCD_disp_str(0,1," Set_Hum_Low    ");  
  459.                      LCD_disp_char(5,2,(Alarm_humidity_low%1000)/100+'0');         //顯示濕度十位
  460.                     LCD_disp_char(6,2,(Alarm_humidity_low%100)/10+'0');           //顯示濕度個位
  461.                                 LCD_disp_char(7,2,'.');
  462.                                 LCD_disp_char(8,2,(Alarm_humidity_low%10)+'0');               //顯示濕度小數點后第一位
  463.                         }

  464.                         if(selectnum==5)//返回測試溫度和濕度界面
  465.                         {
  466.                                 LCD_disp_str(0,1,"               ");
  467.                     LCD_disp_str(0,2,"               ");//清屏
  468.                    
  469.                     selectnum=0;
  470.                                 set_humidity_up=0;
  471.                                 set_humidity_down=0;
  472.                                 set_temp_down=0;
  473.                                 set_temp_up=0;
  474.                                 LCD_disp_str(0,1,"Temper:         ");
  475.                     LCD_disp_str(0,2,"Humdity:        ");
  476.                         }
  477.                          while(!key_set);//等待按鍵釋放
  478.                 }
  479.         }
  480. //////////////////////////////////////////
  481.         if(key_up==0)
  482.         {
  483.                 delay1ms(10);
  484.                 if(key_up==0)
  485.                 {                 
  486.                     if(set_temp_up==1)
  487.                         { //溫度上限加
  488.                       Alarm_temp_up++;
  489.                            if(Alarm_temp_up==999)Alarm_temp_up=0;
  490.                           LCD_disp_char(5,2,(Alarm_temp_up%1000)/100+'0');        //顯示溫度十位
  491.                           LCD_disp_char(6,2,(Alarm_temp_up%100)/10+'0');          //顯示溫度個位
  492.                                   LCD_disp_char(7,2,'.');               
  493.                                   LCD_disp_char(8,2,(Alarm_temp_up%10)+'0');              //顯示溫度小數點后第一位               
  494.                         }

  495.                     if(set_humidity_up==1)
  496.                         { //濕度上限加
  497.                       Alarm_humidity_up++;
  498.                            if(Alarm_humidity_up==999)Alarm_humidity_up=0;
  499.                           LCD_disp_char(5,2,(Alarm_humidity_up%1000)/100+'0');        //顯示濕度十位
  500.                           LCD_disp_char(6,2,(Alarm_humidity_up%100)/10+'0');          //顯示濕度個位
  501.                                   LCD_disp_char(7,2,'.');               
  502.                                   LCD_disp_char(8,2,(Alarm_humidity_up%10)+'0');              //顯示濕度小數點后第一位               
  503.                         }

  504.             if(set_temp_down==1)
  505.                         {//溫度下限
  506.                           Alarm_temp_low++;
  507.                    if(Alarm_temp_low==999)Alarm_temp_low=0;
  508.                       LCD_disp_char(5,2,(Alarm_temp_low%1000)/100+'0');        //顯示溫度十位
  509.                           LCD_disp_char(6,2,(Alarm_temp_low%100)/10+'0');          //顯示溫度個位
  510.                                   LCD_disp_char(7,2,'.');               
  511.                                   LCD_disp_char(8,2,(Alarm_temp_low%10)+'0');              //顯示溫度小數點后第一位   
  512.               
  513.                         }
  514.                     if(set_humidity_down==1)
  515.                         {//濕度下限
  516.                            Alarm_humidity_low++;
  517.                    if(Alarm_humidity_low==999)Alarm_humidity_low=0;
  518.                       LCD_disp_char(5,2,(Alarm_humidity_low%1000)/100+'0');        //顯示濕度十位
  519.                           LCD_disp_char(6,2,(Alarm_humidity_low%100)/10+'0');          //顯示濕度個位
  520.                                   LCD_disp_char(7,2,'.');               
  521.                                   LCD_disp_char(8,2,(Alarm_humidity_low%10)+'0');              //顯示濕度小數點后第一位
  522.               
  523.                         }

  524.                     while(!key_up);//等待按鍵釋放
  525.       }
  526.          
  527.         }
  528.         //////////////////////////////////

  529.                 if(key_down==0)
  530.         {
  531.                 delay1ms(10);
  532.                 if(key_down==0)
  533.                 {        
  534.                     if(set_temp_down==1)
  535.                         {//溫度下限
  536.                             Alarm_temp_low--;
  537.                      if(Alarm_temp_low==0)Alarm_temp_low=999;
  538.                      
  539.                       LCD_disp_char(5,2,(Alarm_temp_low%1000)/100+'0');        //顯示溫度十位
  540.                     LCD_disp_char(6,2,(Alarm_temp_low%100)/10+'0');          //顯示溫度個位
  541.                                 LCD_disp_char(7,2,'.');               
  542.                                 LCD_disp_char(8,2,(Alarm_temp_low%10)+'0');              //顯示溫度小數點后第一位
  543.                         }
  544.                     if(set_humidity_down==1)
  545.                         {//濕度下限
  546.                              Alarm_humidity_low--;
  547.                      if(Alarm_humidity_low==0)Alarm_humidity_low=999;
  548.                         
  549.                         LCD_disp_char(5,2,(Alarm_humidity_low%1000)/100+'0');         //顯示濕度十位
  550.                     LCD_disp_char(6,2,(Alarm_humidity_low%100)/10+'0');           //顯示濕度個位
  551.                                 LCD_disp_char(7,2,'.');
  552.                                 LCD_disp_char(8,2,(Alarm_humidity_low%10)+'0');               //顯示濕度小數點后第一位
  553.                         }

  554.                         if(set_temp_up==1)
  555.                         {//溫度
  556.                             Alarm_temp_up--;
  557.                      if(Alarm_temp_up==0)Alarm_temp_up=999;
  558.                        
  559.                       LCD_disp_char(5,2,(Alarm_temp_up%1000)/100+'0');        //顯示溫度十位
  560.                     LCD_disp_char(6,2,(Alarm_temp_up%100)/10+'0');          //顯示溫度個位
  561.                                 LCD_disp_char(7,2,'.');               
  562.                                 LCD_disp_char(8,2,(Alarm_temp_up%10)+'0');              //顯示溫度小數點后第一位
  563.               
  564.                          }
  565.                          if(set_humidity_up==1)
  566.                         {//濕度
  567.                             Alarm_humidity_up--;
  568.                      if(Alarm_humidity_up==0)Alarm_humidity_up=999;
  569.                         
  570.                         LCD_disp_char(5,2,(Alarm_humidity_up%1000)/100+'0');         //顯示濕度十位
  571.                     LCD_disp_char(6,2,(Alarm_humidity_up%100)/10+'0');           //顯示濕度個位
  572.                                 LCD_disp_char(7,2,'.');
  573.                                 LCD_disp_char(8,2,(Alarm_humidity_up%10)+'0');               //顯示濕度小數點后第一位
  574.                         }
  575.                         while(!key_down);//等待按鍵釋放       
  576.                 }
  577.           
  578.            }

  579. /////////////////////////

  580. }       

  581. void Alarm_Limit()
  582. {

  583.    if(wendu<=Alarm_temp_low)//判斷溫度值是否超出設定范圍,如超出LED亮
  584.          {
  585.                 D1=0;
  586.                 D2=1;
  587.                 temp_alarm_flag=0;
  588.                 TR0=1;
  589.                 flag=0;    //反轉
  590.         PWMZ = 0;

  591.          }
  592.          else
  593.          {
  594.        
  595.          }
  596.           if(wendu>=Alarm_temp_up)//判斷溫度值是否超出設定范圍,如超出LED亮
  597.           {
  598.                 D2=0;
  599.                         D1=1;
  600.                 temp_alarm_flag=0;
  601.                 TR0=1;
  602.                 flag=1;    //正轉
  603.         PWMF = 0;
  604.           }
  605.          else
  606.          {
  607.        
  608.        
  609.          }
  610.           if(wendu>Alarm_temp_low&&wendu<Alarm_temp_up) //溫度在范圍內
  611.          {  
  612.              D1=1;
  613.              D2=1;
  614.                  temp_alarm_flag=1;
  615.                  TR0=0;
  616.                  PWMZ = 0;
  617.          PWMF = 0;
  618.          }


  619.     if(shidu<=Alarm_humidity_low)//判斷濕度值是否超出設定范圍,如超出LED亮
  620.          {
  621.                 D3=0;D4=1;
  622.                 rh_alarm_flag=0;
  623.                 TR1=1;
  624.                 flag2=0;    //反轉
  625.         PWMZ2 = 0;
  626.          }
  627.          else
  628.          {
  629.                 
  630.          }
  631.            if(shidu>=Alarm_humidity_up)//判斷濕度值是否超出設定范圍,如超出LED亮
  632.          {
  633.                 D4=0;D3=1;
  634.                 rh_alarm_flag=0;
  635.                 TR1=1;
  636.                 flag2=1;    //正轉
  637.         PWMF2 = 0;
  638.          }
  639.          else
  640.          {
  641.                 
  642.          }
  643.          if(shidu>Alarm_humidity_low&&shidu<Alarm_humidity_up) //濕度在范圍內
  644.          {  
  645.              D3=1;
  646.              D4=1;
  647.                  rh_alarm_flag=1;
  648.                  TR1=0;
  649.                  PWMZ2 = 0;
  650.          PWMF2 = 0;
  651.          }
  652.          
  653.          if(temp_alarm_flag==0||rh_alarm_flag==0)
  654.          {
  655.            Alarm=0;
  656.            delay1ms(10);
  657.            Alarm=1;
  658.          }                    
  659.          else
  660.          {
  661.            Alarm=1;
  662.          }
  663. }


  664. //*********************第二部分DHT90設置   

  665. //END****************************************
  666. void SysInit_two(void)
  667. {
  668. //        TMOD |=0x01;//定時器設置 1ms in 12M crystal
  669.         //TH0=(65536-1000)/256;
  670. //        TL0=(65536-1000)%256;//定時1mS
  671.         //IE= 0x82;  //打開中斷
  672.         //TR0=1;
  673.    TMOD=0X11;             //T0 T1都工作在方式1(16位計數器)
  674.         TH0=0x3c;  //50ms
  675.         TL0=0xb0;
  676.         TR0=0;
  677.         ET0=1;

  678.         TH1=0x3C;  //50ms
  679.         TL1=0xB0;
  680.         TR1=0;
  681.         ET1=1;

  682.         EA=1;   
  683. }

  684. //*********主函數*****************

  685. unsigned char                 time_ms1;
  686. value humi_val,temp_val;
  687. unsigned char error,checksum;

  688. void dis()
  689. {
  690. error=0;  
  691.          error+=s_measure((unsigned char*) &humi_val.i,&checksum,HUMI);  //measure humidity  測量濕度
  692.          error+=s_measure((unsigned char*) &temp_val.i,&checksum,TEMP);  //measure temperature 測量溫度  
  693.          if(error!=0) s_connectionreset();                 //in case of an error: connection reset  判斷校驗是否正確
  694.          else  
  695.          {
  696.                                   humi_val.f=(float)humi_val.i;                   //converts integer to float   濕度轉換成浮點數
  697.                     temp_val.f=(float)temp_val.i;                   //converts integer to float   溫度轉換成浮點數
  698.                     calc_dht90(&humi_val.f,&temp_val.f);            //calculate humidity, temperature          計算出溫度 濕度值
  699.                                 wendu=10*temp_val.f;
  700.                

  701.                                  
  702.                     LCD_disp_char(8,1,(wendu%1000)/100+'0');        //顯示溫度十位
  703.                     LCD_disp_char(9,1,(wendu%100)/10+'0');          //顯示溫度個位
  704.                                 LCD_disp_str(10,1,".");
  705.                                 LCD_disp_char(11,1,(wendu%10)+'0');              //顯示溫度小數點后第一位
  706.                                 LCD_disp_char(12,1,0xdf);
  707.                                 LCD_disp_str(13,1,"C");

  708.                                 shidu=10*humi_val.f;

  709.                     LCD_disp_char(8,2,(shidu%1000)/100+'0');         //顯示濕度十位
  710.                     LCD_disp_char(9,2,(shidu%100)/10+'0');           //顯示濕度個位
  711.                                 LCD_disp_str(10,2,".");
  712.                                 LCD_disp_char(11,2,(shidu%10)+'0');               //顯示濕度小數點后第一位
  713.                                 LCD_disp_str(12,2,"%");
  714. ……………………

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

所有資料51hei提供下載:
7濕度檢測儀.7z (66.24 KB, 下載次數: 49)





評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

沙發
ID:381903 發表于 2023-3-2 21:39 | 只看該作者
不建議下載,壓縮包里沒有代碼的,附圖里又是不全的
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 搞黄网站在线观看 | 婷婷狠狠 | 伊人免费视频二 | av免费网站在线观看 | 欧美日韩在线精品 | 91文字幕巨乱亚洲香蕉 | 3级毛片 | 国产精品毛片av一区 | 日韩三极 | 国产美女h视频 | 日韩 欧美 综合 | 成人黄色网址大全 | 91免费看片 | 久久久国产精品网站 | 免费看黄色小视频 | 久久久久国产一区二区三区 | 欧美黄在线观看 | 国产精品久久久久久久久久久久 | 天堂影院av | 久久国产婷婷国产香蕉 | 97精品一区二区 | 国产欧美精品区一区二区三区 | 亚洲成人蜜桃 | 五月天激情综合网 | 国产午夜视频 | 日韩精品一区二区三区视频播放 | av无遮挡 | 亚洲精品在线视频 | 婷婷国产一区二区三区 | 中文字幕精品一区二区三区精品 | 九九久久精品视频 | 东京久久 | 日韩精品一区二区三区在线播放 | 青青草av在线播放 | 伊人婷婷 | 国产偷录叫床高潮录音 | 爱高潮www亚洲精品 中文字幕免费视频 | 羞羞网站在线观看 | 国产在线视频一区二区 | av网站观看 | 一级免费毛片 |