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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

[轉載]單片機+DHT11溫濕度+1602液晶顯示

[復制鏈接]
跳轉到指定樓層
樓主
ID:639106 發表于 2020-7-19 17:03 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
這資料蠻好的,拿出來分享......仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)

單片機源程序如下:
  1. #include <reg52.h>
  2. #include <intrins.h>

  3. #define uchar unsigned char         //宏定義方便以后用
  4. #define uint unsigned int  
  5. #define ulong unsigned long

  6. //SHT11接口
  7. sbit DATA = P2^5;
  8. sbit SCK = P2^4;

  9. typedef union                   //定義共同類型
  10. {
  11.   unsigned int i;           //i表示測量得到的溫濕度數據(int 形式保存的數據)
  12.   float f;                           //f表示測量得到的溫濕度數據(float 形式保存的數據)
  13. } value;

  14. enum {TEMP,HUMI};

  15. uchar TEMP_BUF[7];                                         //用于記錄溫度
  16. uchar HUMI_BUF[5];                                         //用于記錄濕度

  17. int real_tempure=0;                //實際溫度
  18. uchar real_humi=0;


  19. //LCD port
  20. sbit LcdRs= P2^0;
  21. sbit LcdRw= P2^1;
  22. sbit LcdEn= P2^2;
  23. sfr  DBPort= 0x80;                //P0=0x80,P1=0x90,P2=0xA0,P3=0xB0.數據端口


  24. //向LCD寫入命令或數據************************************************************
  25. #define LCD_COMMAND                        0      // Command
  26. #define LCD_DATA                        1      // Data
  27. #define LCD_CLEAR_SCREEN        0x01      // 清屏
  28. #define LCD_HOMING                  0x02      // 光標返回原點


  29. //設置顯示模式************************************************************
  30. #define LCD_SHOW                        0x04    //顯示開
  31. #define LCD_HIDE                        0x00    //顯示關          

  32. #define LCD_CURSOR                        0x02         //顯示光標
  33. #define LCD_NO_CURSOR                0x00    //無光標                     

  34. #define LCD_FLASH                        0x01    //光標閃動
  35. #define LCD_NO_FLASH                0x00    //光標不閃動
  36. //內部等待函數**************************************************************************
  37. unsigned char LCD_Wait(void)
  38. {
  39.         LcdRs=0;
  40.         LcdRw=1;        _nop_();
  41.         LcdEn=1;        _nop_();
  42.         _nop_();
  43.         _nop_();
  44.         _nop_();
  45.         LcdEn=0;
  46.         return DBPort;               
  47. }

  48. void LCD_Write(bit style, unsigned char input)
  49. {
  50.         LcdEn=0;
  51.         LcdRs=style;
  52.         LcdRw=0;                _nop_();
  53.         DBPort=input;        _nop_();//注意順序
  54.         LcdEn=1;                _nop_();//注意順序
  55.         LcdEn=0;                _nop_();
  56.         LCD_Wait();       
  57. }

  58. void LCD_SetDisplay(unsigned char DisplayMode)
  59. {
  60.         LCD_Write(LCD_COMMAND, 0x08|DisplayMode);       
  61. }

  62. //設置輸入模式************************************************************
  63. #define LCD_AC_UP                        0x02
  64. #define LCD_AC_DOWN                        0x00      // default

  65. #define LCD_MOVE                        0x01      // 畫面可平移
  66. #define LCD_NO_MOVE                        0x00      //default

  67. void LCD_SetInput(unsigned char InputMode)
  68. {
  69.         LCD_Write(LCD_COMMAND, 0x04|InputMode);
  70. }


  71. //初始化LCD************************************************************
  72. void LCD_Initial()
  73. {
  74.         LcdEn=0;
  75.         LCD_Write(LCD_COMMAND,0x38);           //8位數據端口,2行顯示,5*7點陣
  76.         LCD_Write(LCD_COMMAND,0x38);
  77.         LCD_SetDisplay(LCD_SHOW|LCD_NO_CURSOR);    //開啟顯示, 無光標
  78.         LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN);   //清屏
  79.         LCD_SetInput(LCD_AC_UP|LCD_NO_MOVE);       //AC遞增, 畫面不動
  80. }

  81. //************************************************************************
  82. void GotoXY(unsigned char x, unsigned char y)
  83. {
  84.         if(y==0)
  85.                 LCD_Write(LCD_COMMAND,0x80|x);
  86.         if(y==1)
  87.                 LCD_Write(LCD_COMMAND,0x80|(x-0x40));
  88. }

  89. void Print(unsigned char *str)         //在LCD上顯示數據,內部調用
  90. {
  91.         while(*str!='\0')
  92.         {
  93.                 LCD_Write(LCD_DATA,*str);
  94.                 str++;
  95.         }
  96. }

  97. void LCD_Print(unsigned char x, unsigned char y, unsigned char *str) //指定的位置打印指定數據
  98. {
  99.   GotoXY(x,y);
  100.   Print(str);
  101. }

  102. /********************************************************************
  103. * 名稱 : Delay_1ms()
  104. * 功能 : 延時子程序
  105. * 輸入 : x
  106. * 輸出 : 無
  107. ***********************************************************************/
  108. void Delay(uint i)//延時
  109. {
  110.         uint x,j;
  111.         for(j=0;j<i;j++)
  112.         for(x=0;x<=148;x++);       
  113. }


  114. /***********************************************************************************************************************************************************/

  115. //SHT11程序


  116. #define noACK 0                                //繼續傳輸數據,用于判斷是否結束通訊
  117. #define ACK   1             //結束數據傳輸;
  118.                                                         //地址  命令  讀/寫
  119. #define STATUS_REG_W 0x06   //000   0011    0
  120. #define STATUS_REG_R 0x07   //000   0011    1
  121. #define MEASURE_TEMP 0x03   //000   0001    1
  122. #define MEASURE_HUMI 0x05   //000   0010    1
  123. #define RESET        0x1e   //000   1111    0


  124. //寫字節程序
  125. char SHTXX_write_byte(unsigned char value)   
  126. {
  127.         unsigned char i,error=0;
  128.         for (i=0x80;i>0;i/=2)             //shift bit for masking 高位為1,循環右移
  129.         {
  130.                 if (i&value) DATA=1;          //和要發送的數相與,結果為發送的位
  131.             else DATA=0;                        
  132.             SCK=1;                          
  133.             _nop_();_nop_();_nop_();        //延時3us
  134.             SCK=0;
  135.         }
  136.         DATA=1;                           //釋放數據線
  137.         SCK=1;                           
  138.         error=DATA;                       //檢查應答信號,確認通訊正常
  139.         _nop_();_nop_();_nop_();
  140.         SCK=0;        
  141.         DATA=1;
  142.         return error;                     //error=1 通訊錯誤
  143. }

  144. //讀字節程序
  145. char SHTXX_read_byte(unsigned char ack)
  146. //----------------------------------------------------------------------------------
  147. {
  148.         unsigned char i,val=0;
  149.         DATA=1;                           //釋放數據線
  150.         for(i=0x80;i>0;i>>=1)             //高位為1,循環右移
  151.         {
  152.                 SCK=1;                        
  153.             if(DATA) val=(val|i);        //讀一位數據線的值
  154.             SCK=0;      
  155.         }
  156.         DATA=!ack;                        //如果是校驗,讀取完后結束通訊;
  157.         SCK=1;                           
  158.         _nop_();_nop_();_nop_();          //延時3us
  159.         SCK=0;   
  160.         _nop_();_nop_();_nop_();      
  161.         DATA=1;                           //釋放數據線
  162.         return val;
  163. }

  164. //啟動傳輸
  165. void SHTXX_transstart(void)
  166. // generates a transmission start
  167. //       _____         ________
  168. // DATA:      |_______|
  169. //           ___     ___
  170. // SCK : ___|   |___|   |______
  171. {
  172.            DATA=1; SCK=0;                   //準備
  173.            _nop_();
  174.           SCK=1;
  175.            _nop_();
  176.            DATA=0;
  177.            _nop_();
  178.           SCK=0;
  179.            _nop_();_nop_();_nop_();
  180.            SCK=1;
  181.            _nop_();
  182.           DATA=1;     
  183.           _nop_();
  184.            SCK=0;     
  185. }


  186. //連接復位
  187. void SHTXX_Init(void)
  188. // communication reset: DATA-line=1 and at least 9 SCK cycles followed by transstart
  189. //       _____________________________________________________         ________
  190. // DATA:                                                      |_______|
  191. //          _    _    _    _    _    _    _    _    _        ___     ___
  192. // SCK : __| |__| |__| |__| |__| |__| |__| |__| |__| |______|   |___|   |______
  193. {
  194.         unsigned char i;
  195.         DATA=1; SCK=0;                    //準備
  196.         for(i=0;i<9;i++)                  //DATA保持高,SCK時鐘觸發9次,發送啟動傳輸,通迅即復位
  197.         {
  198.                 SCK=1;
  199.             SCK=0;
  200.         }
  201.         SHTXX_transstart();                   //啟動傳輸
  202. }

  203. /*
  204. //軟復位程序
  205. char SHTXX_softreset(void)
  206. // resets the sensor by a softreset
  207. {
  208.         unsigned char error=0;
  209.         SHTXX_Init();              //啟動連接復位
  210.         error+=SHTXX_write_byte(RESET);       //發送復位命令
  211.         return error;                     //error=1 通訊錯誤
  212. }
  213.   */


  214.            
  215. //溫濕度測量
  216. char SHTXX_measure(unsigned char *p_value, unsigned char *p_checksum, unsigned char mode)
  217. // 進行溫度或者濕度轉換,由參數mode決定轉換內容;
  218. {
  219. //        enum {TEMP,HUMI};                 //已經在頭文件中定義
  220.         unsigned error=0;
  221.         unsigned int i;

  222.         SHTXX_transstart();                   //啟動傳輸
  223.         switch(mode)                     //選擇發送命令
  224.     {       
  225.                 case TEMP : error+=SHTXX_write_byte(MEASURE_TEMP); break;                   //測量溫度
  226.             case HUMI : error+=SHTXX_write_byte(MEASURE_HUMI); break;                   //測量濕度
  227.             default     : break;
  228.         }
  229.         for (i=0;i<65535;i++) if(DATA==0) break; //等待測量結束
  230.         if(DATA) error+=1;                // 如果長時間數據線沒有拉低,說明測量錯誤
  231.         *(p_value) =SHTXX_read_byte(ACK);    //讀第一個字節,高字節 (MSB)
  232.         *(p_value+1)=SHTXX_read_byte(ACK);    //讀第二個字節,低字節 (LSB)
  233.         *p_checksum =SHTXX_read_byte(noACK); //read CRC校驗碼
  234.         return error;                                         // error=1 通訊錯誤
  235. }

  236. //溫濕度值標度變換及溫度補償
  237. void SHTXX_calc(float *p_humidity ,float *p_temperature)
  238. {

  239.         float rh=*p_humidity;             // rh:      12位 濕度
  240.         float t=*p_temperature;           // t:       14位 溫度
  241.         float rh_lin;                     // rh_lin: 濕度 linear值
  242.         float rh_true;                    // rh_true: 濕度 ture值
  243.         float t_C;                        // t_C   : 溫度 ℃

  244.         t_C=t*0.01 - 40;                  //補償溫度
  245.         rh_lin=-0.0000028*rh*rh + 0.0405*rh - 4;     //相對濕度非線性補償
  246.         rh_true=rh/33;   
  247.         if(rh_true>26)
  248.                 rh_true=rh/33+1;
  249.         if(rh_true>33)
  250.                 rh_true=rh/33+1.5;
  251.         if(rh_true>40)
  252.                 rh_true=rh/33+3;       
  253.         if(rh_true>50)
  254.                 rh_true=rh/33+3.7;       
  255.         if(rh_true>70)
  256.                 rh_true=rh/33+3;       
  257.         if(rh_true>90)
  258.                 rh_true=rh/33+1.6;       

  259.     //rh_true=(t_C-25)*(0.01+0.00008*rh)+rh_lin;   //相對濕度對于溫度依賴性補償        ,仿真的時候去掉補償

  260.                
  261.         if(rh_true>100)rh_true=100;       //濕度最大修正
  262.         if(rh_true<0.1)rh_true=0.1;       //濕度最小修正

  263.         *p_temperature=t_C;               //返回溫度結果
  264.         *p_humidity=rh_true;              //返回濕度結果


  265. }


  266. void Covert_HT()
  267. {
  268.         value humi_val,temp_val;                //定義兩個共同體,一個用于濕度,一個用于溫度
  269.         uchar checksum;                        //CRC         
  270.         uchar error=0;
  271.         error=0;                                           //初始化error=0,即沒有錯誤
  272.         error+=SHTXX_measure((unsigned char*)&temp_val.i,&checksum,TEMP); //溫度測量
  273.         error+=SHTXX_measure((unsigned char*)&humi_val.i,&checksum,HUMI); //濕度測量
  274.         if(error!=0) SHTXX_Init();                 ////如果發生錯誤,系統復位
  275.         else
  276.         {
  277.                 humi_val.f=(float)humi_val.i;                   //轉換為浮點數
  278.                 temp_val.f=(float)temp_val.i;                   //轉換為浮點數
  279.                 SHTXX_calc(&humi_val.f,&temp_val.f);            //修正相對濕度及溫度
  280.                
  281.                 real_tempure =temp_val.f+1;           //修正一下偏
  282.                 real_humi    = humi_val.f-1;

  283.                 if(real_tempure>=0)
  284.                 {
  285.                   TEMP_BUF[0]=real_tempure/100+'0';                     //溫度百位
  286.                
  287.                 if (TEMP_BUF[0]==0x30) TEMP_BUF[0]=0x20;
  288. ……………………

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

所有資料51hei提供下載:
DHT11說明書081206.7z (661.22 KB, 下載次數: 34)
SHT11.7z (1.68 MB, 下載次數: 49)


評分

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

查看全部評分

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

使用道具 舉報

沙發
ID:639106 發表于 2020-7-19 17:07 | 只看該作者
這論壇附件有些不好使
回復

使用道具 舉報

板凳
ID:136485 發表于 2020-7-20 08:52 | 只看該作者
謝謝分享,剛好手頭上有一個這個片子,那天有空玩一下
回復

使用道具 舉報

地板
ID:639106 發表于 2020-7-20 10:24 | 只看該作者
百度網盤鏈接:https://pan.baidu.com/s/1B5kp8cX2hZjL2ays8MwBOw
提取碼:1234
回復

使用道具 舉報

5#
ID:743443 發表于 2020-8-2 18:16 | 只看該作者
這是dht11嗎?
咋跟標題不一樣呀
回復

使用道具 舉報

6#
ID:765415 發表于 2020-9-4 16:36 | 只看該作者
這個是SHT的,不是DHT的,兩個元器件不一樣,SHT是50多塊錢一個
回復

使用道具 舉報

7#
ID:748788 發表于 2020-9-9 21:38 | 只看該作者
sht11的程序應該不適用于dht11
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产美女高潮 | 在线观看精品视频网站 | 99精品电影 | av手机在线| 五月天激情电影 | 国产激情视频在线 | 精品久久久久久久久久久久 | 国产一区二区久久 | 日韩欧美精品一区 | 色资源av| 九九久久久 | 色婷婷久久久久swag精品 | 欧美一级久久 | 精品动漫一区 | 欧美精品网站 | 91国内外精品自在线播放 | 久久久久久亚洲 | 91一区二区三区在线观看 | www.jizzjizz | 国产在线观看一区二区 | 秋霞在线一区 | 日韩一区二区久久 | 欧美电影在线 | 精品视频久久久久久 | 水蜜桃亚洲一二三四在线 | 亚洲国产精品久久久久久 | 精品亚洲一区二区 | 国产欧美一区二区在线观看 | 中文字幕一区二区三区在线观看 | 亚洲第一网站 | 午夜精品久久久久久久久久久久 | 久久国产精品一区二区三区 | 国产一区二区三区在线免费 | 欧美一区视频在线 | 成人在线黄色 | 亚洲国产精品99久久久久久久久 | 国产精品久久久久久妇女6080 | 欧洲在线视频 | 99精品久久 | 日本成人久久 | 久久男人 |