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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4162|回復(fù): 4
打印 上一主題 下一主題
收起左側(cè)

單片機+SHT11測溫濕度Proteus仿真程序 1602顯示

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:568482 發(fā)表于 2020-5-20 15:22 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
仿真原理圖如下(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表示測量得到的溫濕度數(shù)據(jù)(int 形式保存的數(shù)據(jù))
  12.   float f;                           //f表示測量得到的溫濕度數(shù)據(jù)(float 形式保存的數(shù)據(jù))
  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.數(shù)據(jù)端口


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


  29. //設(shè)置顯示模式************************************************************
  30. #define LCD_SHOW                        0x04    //顯示開
  31. #define LCD_HIDE                        0x00    //顯示關(guān)          

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

  34. #define LCD_FLASH                        0x01    //光標閃動
  35. #define LCD_NO_FLASH                0x00    //光標不閃動
  36. //內(nèi)部等待函數(shù)**************************************************************************
  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. //設(shè)置輸入模式************************************************************
  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位數(shù)據(jù)端口,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上顯示數(shù)據(jù),內(nèi)部調(diào)用
  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) //指定的位置打印指定數(shù)據(jù)
  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                                //繼續(xù)傳輸數(shù)據(jù),用于判斷是否結(jié)束通訊
  117. #define ACK   1             //結(jié)束數(shù)據(jù)傳輸;
  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. //寫字節(jié)程序
  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,循環(huán)右移
  129.         {
  130.                 if (i&value) DATA=1;          //和要發(fā)送的數(shù)相與,結(jié)果為發(fā)送的位
  131.             else DATA=0;                        
  132.             SCK=1;                          
  133.             _nop_();_nop_();_nop_();        //延時3us
  134.             SCK=0;
  135.         }
  136.         DATA=1;                           //釋放數(shù)據(jù)線
  137.         SCK=1;                           
  138.         error=DATA;                       //檢查應(yīng)答信號,確認通訊正常
  139.         _nop_();_nop_();_nop_();
  140.         SCK=0;        
  141.         DATA=1;
  142.         return error;                     //error=1 通訊錯誤
  143. }

  144. //讀字節(jié)程序
  145. char SHTXX_read_byte(unsigned char ack)
  146. //----------------------------------------------------------------------------------
  147. {
  148.         unsigned char i,val=0;
  149.         DATA=1;                           //釋放數(shù)據(jù)線
  150.         for(i=0x80;i>0;i>>=1)             //高位為1,循環(huán)右移
  151.         {
  152.                 SCK=1;                        
  153.             if(DATA) val=(val|i);        //讀一位數(shù)據(jù)線的值
  154.             SCK=0;      
  155.         }
  156.         DATA=!ack;                        //如果是校驗,讀取完后結(jié)束通訊;
  157.         SCK=1;                           
  158.         _nop_();_nop_();_nop_();          //延時3us
  159.         SCK=0;   
  160.         _nop_();_nop_();_nop_();      
  161.         DATA=1;                           //釋放數(shù)據(jù)線
  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. //連接復(fù)位
  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時鐘觸發(fā)9次,發(fā)送啟動傳輸,通迅即復(fù)位
  197.         {
  198.                 SCK=1;
  199.             SCK=0;
  200.         }
  201.         SHTXX_transstart();                   //啟動傳輸
  202. }

  203. /*
  204. //軟復(fù)位程序
  205. char SHTXX_softreset(void)
  206. // resets the sensor by a softreset
  207. {
  208.         unsigned char error=0;
  209.         SHTXX_Init();              //啟動連接復(fù)位
  210.         error+=SHTXX_write_byte(RESET);       //發(fā)送復(fù)位命令
  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. // 進行溫度或者濕度轉(zhuǎn)換,由參數(shù)mode決定轉(zhuǎn)換內(nèi)容;
  218. {
  219. //        enum {TEMP,HUMI};                 //已經(jīng)在頭文件中定義
  220.         unsigned error=0;
  221.         unsigned int i;

  222.         SHTXX_transstart();                   //啟動傳輸
  223.         switch(mode)                     //選擇發(fā)送命令
  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; //等待測量結(jié)束
  230.         if(DATA) error+=1;                // 如果長時間數(shù)據(jù)線沒有拉低,說明測量錯誤
  231.         *(p_value) =SHTXX_read_byte(ACK);    //讀第一個字節(jié),高字節(jié) (MSB)
  232.         *(p_value+1)=SHTXX_read_byte(ACK);    //讀第二個字節(jié),低字節(jié) (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;               //返回溫度結(jié)果
  264.         *p_humidity=rh_true;              //返回濕度結(jié)果


  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();                 ////如果發(fā)生錯誤,系統(tǒng)復(fù)位
  275.         else
  276.         {
  277.                 humi_val.f=(float)humi_val.i;                   //轉(zhuǎn)換為浮點數(shù)
  278.                 temp_val.f=(float)temp_val.i;                   //轉(zhuǎn)換為浮點數(shù)
  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黑下載附件…………
復(fù)制代碼

所有資料51hei提供下載:
SHT11.zip (1.92 MB, 下載次數(shù): 170)


評分

參與人數(shù) 2黑幣 +55 收起 理由
17166866466 + 5 很給力!
admin + 50 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

沙發(fā)
ID:496379 發(fā)表于 2020-6-18 01:26 | 只看該作者
移植性很強 注解很詳細 沒有錯誤 很強
回復(fù)

使用道具 舉報

板凳
ID:779690 發(fā)表于 2020-6-18 20:01 | 只看該作者
剛好要做相關(guān)的東西,感謝樓主的分享。
回復(fù)

使用道具 舉報

地板
ID:639106 發(fā)表于 2020-7-15 10:55 | 只看該作者
正在make中.........
回復(fù)

使用道具 舉報

5#
ID:33544 發(fā)表于 2023-5-24 06:38 | 只看該作者

剛好要做相關(guān)的東西,感謝樓主的分享
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 久久高清精品 | 亚洲一区有码 | 国产精品一区二区在线播放 | 久久久久久国产一区二区三区 | 欧美黑人一级爽快片淫片高清 | 7799精品视频天天看 | 干出白浆视频 | 国产美女一区二区 | 亚洲精品乱码久久久久久按摩观 | 欧美另类视频 | 精品国产一区二区三区久久 | 国产一区二区三区在线视频 | 夜夜操天天操 | 成人国产一区二区三区精品麻豆 | 亚洲欧美日韩精品久久亚洲区 | 亚洲精品一二三区 | 亚洲一级黄色 | 国产在线网站 | 久久成人免费视频 | 有码一区 | 欧美精品中文 | 欧美国产精品一区二区 | av网站免费在线观看 | 男人av的天堂 | 欧洲视频一区 | 午夜资源 | 欧美精品一区二区在线观看 | 超黄毛片| 亚洲在线看| 毛片黄片免费看 | 国产综合久久 | www.99精品| 污片在线免费观看 | 日韩视频在线观看中文字幕 | 天天视频一区二区三区 | 国产99精品| 国产综合第一页 | 99亚洲| 亚洲九九色 | 天天弄 | 国产精品久久久久aaaa九色 |