亚洲春色中文字幕久久久-三上亚,一吻二脱三床四吻胸,国产真实伦对白视频全集,在线毛片观看,精品成品入口黄网,国产毛aⅴ片久久久,亚洲AV色香蕉一区二区三区老师,萧皇后A级艳片,色情日本视频更新,99久久亚洲精品日本无码

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機LCD1602溫濕顯示

[復制鏈接]
跳轉到指定樓層
樓主
LCD1602溫濕顯示,全部在附件里。
我家原先有個溫濕度顯示器,用了幾年壞了;我想自己做一個,在網上套淘了STH10傳感器,用STC15F2K60S2單片機組成最小系統,用C語言編程調試完成。顯示溫濕度效果還可以見圖片。
編者:ROCKER(石頭)



單片機源程序如下:
  1. /****************************************************************  
  2. ;功能說明:sht11和1602的溫濕度顯示  
  3. ;微處理器:STC15f2k60s2
  4. ;編譯環境:Keil uVision V4.0
  5. ;創建日期:2025-9-24
  6. ;版    本:V1.0   
  7. ;修改日期:2026.5.25  OK
  8. **********************************************************/

  9. /*************定義接口********************
  10.          P0.x------DB0~DB7(LCD1602)      
  11.          P2.6------RS      (LCD1602)
  12.          P2.5------RW      (LCD1602)
  13.          P2.4------E       (LCD1602)
  14.          P2.1------DATA    (SHT1x/7x)
  15.          P2.2------SCK     (SHT1x/7x)
  16. *****************************************/
  17. #include  "stc15f.h"
  18. #include <intrins.h>  
  19. #include <math.h>      
  20. #include <stdio.h>   

  21. //***************第一部分LCD1602設置 START**********************
  22. #define LCD_DB       P0
  23.         sbit         LCD_RS=P2^6;   
  24.         sbit         LCD_RW=P2^5;
  25.                     sbit         LCD_E=P2^4;   
  26. /******定義函數****************/
  27. #define uchar unsigned char
  28. #define uint unsigned int
  29. bit lcd_busy();
  30. void LCD_init(void);                          //初始化函數
  31. void LCD_write_command(uchar command);        //寫指令函數
  32. void LCD_write_data(uchar dat);               
  33. void LCD_disp_char(uchar x,uchar y,uchar dat);
  34. void LCD_disp_str(uchar x,uchar y,uchar *str);
  35. void delay_n10us(uint n);                     

  36. bit lcd_busy()
  37. {        
  38.         bit result;
  39.         LCD_RS= 0;
  40.         LCD_RW=1;
  41.     LCD_E=1;
  42.         _nop_();
  43.         _nop_();
  44.         _nop_();
  45.         _nop_();
  46.         result = (bit)(P0 & 0x80);
  47.     LCD_E=0;
  48.         return result;
  49. }


  50. /*--------------------------------------  
  51. ;模塊名稱:LCD_init();  
  52. ;功    能:初始化LCD1602  
  53. ;-------------------------------------*/  
  54. void LCD_init(void)
  55. {
  56. delay_n10us(10);
  57. LCD_write_command(0x38);
  58. delay_n10us(10);
  59. LCD_write_command(0x0c);//整體顯示,關光標,不閃爍
  60. delay_n10us(10);
  61. LCD_write_command(0x06);//設定輸入方式,增量不移位
  62. delay_n10us(10);
  63. LCD_write_command(0x01);
  64. delay_n10us(100);      
  65. }


  66. /*--------------------------------------  
  67. ;模塊名稱:LCD_write_command();  
  68. ;功    能:LCD1602寫指令函數   
  69. ;參數說明:dat為寫命令參數
  70. ;-------------------------------------*/  
  71. void LCD_write_command(uchar dat)
  72. {
  73. while(lcd_busy());
  74. delay_n10us(10);
  75. LCD_RS=0;         //指令
  76. LCD_RW=0;         //寫入
  77. LCD_E=1;          //允許
  78. LCD_DB=dat;
  79. delay_n10us(10);   
  80. LCD_E=0;
  81. delay_n10us(10);   
  82. }


  83. /*--------------------------------------  
  84. ;模塊名稱:LCD_write_data();  
  85. ;功    能:LCD1602寫數據函數   
  86. ;參數說明:dat為寫數據參數
  87. ;-------------------------------------*/
  88. void LCD_write_data(uchar dat)
  89. {
  90. while(lcd_busy());
  91. delay_n10us(10);
  92. LCD_RS=1;          //數據
  93. LCD_RW=0;          //寫入
  94. LCD_E=1;           //允許
  95. LCD_DB=dat;
  96. delay_n10us(10);
  97. LCD_E=0;
  98. delay_n10us(10);
  99. }


  100. /*--------------------------------------  
  101. ;模塊名稱:LCD_disp_char();  
  102. ;功    能:LCD1602顯示一個字符函數,在某個屏幕位置上顯示一個字符,X(0-15),y(1-2)。  
  103. ;-------------------------------------*/
  104. void LCD_disp_char(uchar x,uchar y,uchar dat)
  105. {
  106.   uchar address;
  107.   if(y==1)
  108.          address=0x80+x;
  109.   else
  110.          address=0xc0+x;
  111.   LCD_write_command(address);
  112.   LCD_write_data(dat);
  113. }
  114. /*--------------------------------------  
  115. ;模塊名稱:LCD_disp_str();  
  116. ;功    能:LCD1602顯示字符串函數,在某個屏幕起始位置{X(0-15),y(1-2)}上顯示一個字符串。  
  117. ;-------------------------------------*/
  118. void LCD_disp_str(uchar x,uchar y,uchar *str)
  119. {
  120.   uchar address;
  121.   if(y==1)
  122.          address=0x80+x;
  123.   else
  124.          address=0xc0+x;
  125.   LCD_write_command(address);
  126.   while(*str!='\0')
  127.   {  
  128.     LCD_write_data(*str);   
  129.     str++;
  130.   }
  131. }


  132. /*--------------------------------------  
  133. ;模塊名稱:delay_n10us();  
  134. ;功    能:延時函數,延時約n個10us
  135. ;修改說明:修改為較精確的延時函數,"_nop_()"延時1us@12M晶振
  136. ;-------------------------------------*/
  137. void delay_n10us(uint n)  
  138. {        
  139.         uint i;            
  140.         for(i=n;i>0;i--)     
  141.         {
  142.          _nop_();_nop_();_nop_();
  143.                                  _nop_();_nop_();_nop_();  
  144.         }
  145. }                                    

  146. //*********************第二部分sht10設置   START****************************************  
  147. sbit SCK  = P2^2;      
  148. sbit DATA = P2^1;      

  149. typedef union   
  150. { unsigned int i;      
  151.   float f;  
  152. }
  153. value;  

  154. enum {TEMP,HUMI};      
  155.   

  156. #define noACK 0             //用于判斷是否結束通訊
  157. #define ACK   1             //結束數據傳輸
  158.                             //adr  command  r/w  
  159. #define STATUS_REG_W 0x06   //000   0011    0  
  160. #define STATUS_REG_R 0x07   //000   0011    1  
  161. #define MEASURE_TEMP 0x03   //000   0001    1  
  162. #define MEASURE_HUMI 0x05   //000   0010    1  
  163. #define RESET        0x1e   //000   1111    0  

  164. /****************定義函數****************/
  165. void s_transstart(void);               
  166. void s_connectionreset(void);         
  167. char s_write_byte(unsigned char value);
  168. char s_read_byte(unsigned char ack);   
  169. char s_measure(unsigned char *p_value, unsigned char *p_checksum, unsigned char mode);//測量溫濕度函數
  170. void calc_dht90(float *p_humidity ,float *p_temperature);//溫濕度補償

  171. /*--------------------------------------  
  172. ;模塊名稱:s_transstart();  
  173. ;功    能:啟動傳輸函數
  174. ;-------------------------------------*/   
  175. void s_transstart(void)  
  176. // generates a transmission start   
  177. {   
  178.    DATA=1; SCK=0;                    
  179.    _nop_();  
  180.    SCK=1;  
  181.    _nop_();  
  182.    DATA=0;  
  183.    _nop_();  
  184.    SCK=0;   
  185.    _nop_();_nop_();_nop_();  
  186.    SCK=1;  
  187.    _nop_();  
  188.    DATA=1;         
  189.    _nop_();  
  190.    SCK=0;         
  191. }  

  192. /*--------------------------------------  
  193. ;模塊名稱:s_connectionreset();  
  194. ;功    能:連接復位函數
  195. ;-------------------------------------*/  
  196. void s_connectionreset(void)  

  197. {   
  198.   unsigned char i;   
  199.   DATA=1; SCK=0;                     
  200.   for(i=0;i<9;i++)                  
  201.   {  
  202.     SCK=1;
  203.     SCK=0;  
  204.   }  
  205.   s_transstart();                    
  206. }  


  207. /*--------------------------------------  
  208. ;模塊名稱:s_write_byte();  
  209. ;功    能:SHT1x/7x寫函數
  210. ;-------------------------------------*/  
  211. char s_write_byte(unsigned char value)  
  212. //----------------------------------------------------------------------------------  
  213.   
  214. {   
  215.   unsigned char i,error=0;   
  216.   for (i=0x80;i>0;i/=2)               
  217.   {   
  218.     if (i & value) DATA=1;           
  219.     else DATA=0;                          
  220.     SCK=1;                           
  221.     _nop_();_nop_();_nop_();            
  222.     SCK=0;  
  223.   }  
  224.   DATA=1;                           
  225.   SCK=1;                             
  226.   error=DATA;                        
  227.   _nop_();_nop_();_nop_();
  228.   SCK=0;
  229.   DATA=1;                             
  230.   return error;                     
  231. }  
  232.   

  233. /*--------------------------------------  
  234. ;模塊名稱:s_read_byte();  
  235. ;功    能:SHT1x/7x讀函數

  236. ;-------------------------------------*/  
  237. char s_read_byte(unsigned char ack)   
  238.   
  239. {   
  240.   unsigned char i,val=0;  
  241.   DATA=1;                           
  242.   for (i=0x80;i>0;i/=2)               
  243.   { SCK=1;                           
  244.     if (DATA) val=(val | i);           
  245.         _nop_();_nop_();_nop_();        
  246.     SCK=0;               
  247.   }  
  248.   if(ack==1)DATA=0;                  
  249.   else DATA=1;                     
  250.   _nop_();_nop_();_nop_();           
  251.   SCK=1;                             
  252.   _nop_();_nop_();_nop_();            
  253.   SCK=0;                  
  254.   _nop_();_nop_();_nop_();            
  255.   DATA=1;                           
  256.   return val;  
  257. }  
  258.   
  259. /*--------------------------------------  
  260. ;模塊名稱:s_measure();  
  261. ;功    能:測量溫濕度函數
  262. ;-------------------------------------*/  
  263. char s_measure(unsigned char *p_value, unsigned char *p_checksum, unsigned char mode)  
  264.   
  265. {   
  266.   unsigned error=0;  
  267.   unsigned int i;  
  268.   
  269.   s_transstart();                    
  270.   switch(mode)
  271.         {                     
  272.     case TEMP  : error+=s_write_byte(MEASURE_TEMP); break;  
  273.     case HUMI  : error+=s_write_byte(MEASURE_HUMI); break;  
  274.     default     : break;     
  275.   }  
  276.   for (i=0;i<65535;i++) if(DATA==0) break;  
  277.   if(DATA) error+=1;                 
  278.   *(p_value)  =s_read_byte(ACK);      
  279.   *(p_value+1)=s_read_byte(ACK);     
  280.   *p_checksum =s_read_byte(noACK);  
  281.   return error;  
  282. }  
  283.   

  284. /*--------------------------------------  
  285. ;模塊名稱:calc_dht90();  
  286. ;功    能:溫濕度補償函數   
  287. ;-------------------------------------*/  
  288. void calc_dht90(float *p_humidity ,float *p_temperature)

  289. { const float C1=-4.0;              
  290.   const float C2=+0.0405;           
  291.   const float C3=-0.0000028;        
  292.   const float T1=+0.01;            
  293.   const float T2=+0.00008;           

  294.   float rh=*p_humidity;             // rh:      Humidity [Ticks] 12 Bit  
  295.   float t=*p_temperature;           // t:       Temperature [Ticks] 14 Bit
  296.   float rh_lin;                     // rh_lin:  Humidity linear
  297.   float rh_true;                    // rh_true: Temperature compensated humidity
  298.   float t_C;                        // t_C   :  Temperature [C]

  299.   t_C=t*0.01 - 40;                  //calc. temperature from ticks to [C]
  300.   rh_lin=C3*rh*rh + C2*rh + C1;     //calc. humidity from ticks to [%RH]
  301.   rh_true=(t_C-25)*(T1+T2*rh)+rh_lin;   //calc. temperature compensated humidity [%RH]
  302.   if(rh_true>100)rh_true=100;      
  303.   if(rh_true<0.1)rh_true=0.1;        

  304.   *p_temperature=t_C;               
  305.   *p_humidity=rh_true;              
  306. }

  307. //*********************第二部分SHT1x/7x設置   END****************************************

  308. //*********主函數*****************
  309. void main(void)
  310. {
  311.         value humi_val,temp_val;
  312.         unsigned char error,checksum;  
  313.         unsigned int wendu,shidu;
  314.         LCD_init();         
  315.         s_connectionreset();  
  316.               LCD_disp_str(0,1,"TE ");
  317.               LCD_disp_str(0,2,"RH ");


  318. //*********初始化溫度顯示區*********
  319.         LCD_disp_str(2,1, "TTT.T \xDF\C");

  320. //*********初始化濕度顯示區*********
  321.         LCD_disp_str(2,2, "RRR.R%RH");

  322.         delay_n10us(20000);     //延時0.2s

  323.         while(1)  
  324.         { error=0;  
  325.           error+=s_measure((unsigned char*) &humi_val.i,&checksum,HUMI);   
  326.           error+=s_measure((unsigned char*) &temp_val.i,&checksum,TEMP);  
  327.           if(error!=0) s_connectionreset();                 
  328.           else  
  329.           { humi_val.f=(float)humi_val.i;                    
  330.             temp_val.f=(float)temp_val.i;                  
  331.             calc_dht90(&humi_val.f,&temp_val.f);            
  332.             wendu=10*temp_val.f;
  333.             LCD_disp_char(2,1,wendu/1000+'0');              //顯示溫度百位
  334.             LCD_disp_char(3,1,(wendu%1000)/100+'0');        //顯示溫度十位
  335.             LCD_disp_char(4,1,(wendu%100)/10+'0');          //顯示溫度個位
  336.             LCD_disp_char(6,1,(wendu%10)+'0');              //顯示溫度小數點后第一位

  337.             shidu=10*humi_val.f;
  338.             LCD_disp_char(2,2,shidu/1000+'0');               //顯示濕度百位
  339.             LCD_disp_char(3,2,(shidu%1000)/100+'0');         //顯示濕度十位
  340.             LCD_disp_char(4,2,(shidu%100)/10+'0');           //顯示濕度個位
  341.             LCD_disp_char(6,2,(shidu%10)+'0');               //顯示濕度小數點后第一位
  342.           }  
  343.           //----------wait approx. 0.8s to avoid heating up SHTxx------------------------------        
  344.                   delay_n10us(80000);                                //延時約0.8s
  345.         }
  346. }
  347. //end   2026-5-25    OK
復制代碼


程序 原理圖: LCD1602溫度濕度顯示.7z (49.4 KB, 下載次數: 0)

評分

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

查看全部評分

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

使用道具 舉報

沙發
ID:1167385 發表于 2026-6-12 12:34 | 只看該作者
謝謝!
回復

使用道具 舉報

板凳
ID:1167385 發表于 2026-6-12 12:34 | 只看該作者
謝謝!
回復

使用道具 舉報

地板
ID:1064915 發表于 2026-6-12 17:02 | 只看該作者
STH10傳感器 圖片沒有?
回復

使用道具 舉報

5#
ID:1173141 發表于 2026-6-13 13:36 來自觸屏版 | 只看該作者
謝謝樓主,幫大忙了
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表