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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

SHT10傳感器+LCD1602顯示的單片機源程序

[復制鏈接]
跳轉到指定樓層
樓主
ID:269159 發表于 2017-12-30 13:23 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
幾點說明:
1.主要是分以下幾個模塊寫的:SHT10,LCD1602,主函數,頭文件。
2.每支SHTxx傳感器都在25℃(77 °F)和 3.3V條件下進行過標定并且完全符合精度指標.因為考慮到實際硬件5V的電壓比較好操作,所以SHT10用的精度采用的為5V時的參數。其他的都采取默認值(14bit濕度 , 12bit 溫度)。
3.SHT10中所以部分我都編寫了。有的部分在本次程序中沒用到,也可以作為參考。
4.所有程序都已經加了注釋,且有仿真圖。
5.個人認為還可以在此基礎上添加個中斷。
6.程序編寫keil 4 ,仿真 protues7.5


頭文件(tou.h)
  1. #ifndef __TOU_H__
  2. #define __TOU_H__

  3. #include<reg52.h>
  4. #include <intrins.h>
  5. //#include <math.h>    //Keil library

  6. #define uchar unsigned char
  7. enum {TEMP,HUMI};

  8. sbit DATA = P1^7;
  9. sbit SCK = P1^6;

  10. sbit LcdRs = P2^4;
  11. sbit LcdRw = P2^5;
  12. sbit LcdEn = P2^6;
  13. sfr DBPort = 0x80;     //P0=0x80,P1=0x90,P2=0xA0,P3=0xB0.數據端口

  14. /********     DS1602函數聲明     ********/
  15. void LCD_Initial();
  16. void GotoXY(unsigned char x, unsigned chary);
  17. void Print(unsigned char *str);
  18. void LCD_Write(bit style, unsigned charinput);


  19. /********     SHT10函數聲明      ********/
  20. void s_connectionreset(void);
  21. char s_measure(unsigned char *p_value,unsigned char *p_checksum, unsigned char mode);
  22. void calc_sth10(float *p_humidity ,float*p_temperature);
  23. //float calc_dewpoint(float h,float t);


  24. #endif
  25. /***********************************************************************************************************************************************************/
復制代碼


SHT10程序(SHT10.c):

  1. #include<tou.h>
  2. #define noACK 0                         //繼續傳輸數據,用于判斷是否結束通訊
  3. #define ACK   1            //結束數據傳輸;
  4.                                                  //地址 命令  讀/寫
  5. #define STATUS_REG_W 0x06   //000  0011    0
  6. #define STATUS_REG_R 0x07   //000  0011    1
  7. #define MEASURE_TEMP 0x03   //000  0001    1
  8. #define MEASURE_HUMI 0x05   //000  0010    1
  9. #define RESET        0x1e  //000   1111    0



  10. //寫字節程序
  11. char s_write_byte(unsigned char value)   
  12. {
  13.        unsignedchar i,error=0;
  14.        for(i=0x80;i>0;i>>=1)            //高位為1,循環右移
  15.        {
  16.               if(i&value) DATA=1;          //和要發送的數相與,結果為發送的位
  17.            else DATA=0;                        
  18.            SCK=1;                          
  19.            _nop_();_nop_();_nop_();        //延時3us
  20.            SCK=0;
  21.        }
  22.        DATA=1;                           //釋放數據線
  23.        SCK=1;                           
  24.        error=DATA;                       //檢查應答信號,確認通訊正常
  25.        _nop_();_nop_();_nop_();
  26.        SCK=0;        
  27.        DATA=1;
  28.        returnerror;                     //error=1 通訊錯誤
  29. }

  30. //讀字節程序
  31. char s_read_byte(unsigned char ack)
  32. //----------------------------------------------------------------------------------
  33. {
  34.        unsignedchar i,val=0;
  35.        DATA=1;                           //釋放數據線
  36.        for(i=0x80;i>0;i>>=1)             //高位為1,循環右移
  37.        {
  38.               SCK=1;                        
  39.            if(DATA) val=(val|i);        //讀一位數據線的值
  40.            SCK=0;      
  41.        }
  42.        DATA=!ack;                        //如果是校驗,讀取完后結束通訊;
  43.        SCK=1;                           
  44.        _nop_();_nop_();_nop_();          //延時3us
  45.        SCK=0;   
  46.        _nop_();_nop_();_nop_();      
  47.        DATA=1;                           //釋放數據線
  48.        returnval;
  49. }

  50. //啟動傳輸
  51. void s_transstart(void)
  52. // generates a transmission start
  53. //      _____         ________
  54. // DATA:      |_______|
  55. //          ___     ___
  56. // SCK : ___|   |___|  |______
  57. {
  58.      DATA=1; SCK=0;                   //準備
  59.      _nop_();
  60.       SCK=1;
  61.      _nop_();
  62.      DATA=0;
  63.      _nop_();
  64.       SCK=0;
  65.        _nop_();_nop_();_nop_();
  66.      SCK=1;
  67.      _nop_();
  68.       DATA=1;   
  69.       _nop_();
  70.      SCK=0;   
  71. }


  72. //連接復位
  73. void s_connectionreset(void)
  74. // communication reset: DATA-line=1 and atleast 9 SCK cycles followed by transstart
  75. //      _____________________________________________________         ________
  76. // DATA:                                                     |_______|
  77. //         _    _    _   _    _    _   _    _    _       ___     ___
  78. // SCK : __| |__| |__| |__| |__| |__| |__||__| |__| |______|   |___|   |______
  79. {
  80.        unsignedchar i;
  81.        DATA=1;SCK=0;                    //準備
  82.        for(i=0;i<9;i++)                  //DATA保持高,SCK時鐘觸發9次,發送啟動傳輸,通迅即復位
  83.        {
  84.               SCK=1;
  85.            SCK=0;
  86.        }
  87.        s_transstart();                   //啟動傳輸
  88. }


  89. //軟復位程序
  90. char s_softreset(void)
  91. // resets the sensor by a softreset
  92. {
  93.        unsignedchar error=0;
  94.        s_connectionreset();              //啟動連接復位
  95.        error+=s_write_byte(RESET);       //發送復位命令
  96.        returnerror;                     //error=1 通訊錯誤
  97. }


  98. /*讀狀態寄存器
  99. char s_read_statusreg(unsigned char*p_value, unsigned char *p_checksum)
  100. //----------------------------------------------------------------------------------
  101. // reads the status register with checksum(8-bit)
  102. {
  103.        unsignedchar error=0;
  104.        s_transstart();                   //transmission start
  105.        error=s_write_byte(STATUS_REG_R);//send command to sensor
  106.        *p_value=s_read_byte(ACK);        //read status register (8-bit)
  107.        *p_checksum=s_read_byte(noACK);   //read checksum (8-bit)
  108.        returnerror;                     //error=1 in case of no response form the sensor
  109. }

  110. //寫狀態寄存器
  111. char s_write_statusreg(unsigned char*p_value)
  112. // writes the status register with checksum(8-bit)
  113. {
  114.        unsignedchar error=0;
  115.        s_transstart();                   //transmission start
  116.        error+=s_write_byte(STATUS_REG_W);//sendcommand to sensor
  117.        error+=s_write_byte(*p_value);    //send value of status register
  118.        returnerror;                     //error>=1 in case of no response form the sensor
  119. }                                                                                                                               */

  120. //溫濕度測量
  121. char s_measure(unsigned char *p_value,unsigned char *p_checksum, unsigned char mode)
  122. // 進行溫度或者濕度轉換,由參數mode決定轉換內容;
  123. {
  124. //     enum{TEMP,HUMI};           //已經在頭文件中定義
  125.        unsignederror=0;
  126.        unsignedint i;

  127.        s_transstart();                   //啟動傳輸
  128.        switch(mode)                     //選擇發送命令
  129.     {     
  130.               caseTEMP : error+=s_write_byte(MEASURE_TEMP); break;             //測量溫度
  131.            case HUMI :error+=s_write_byte(MEASURE_HUMI); break;              //測量濕度
  132.            default     : break;
  133.        }
  134.        for(i=0;i<65535;i++) if(DATA==0) break; //等待測量結束
  135.        if(DATA)error+=1;                // 如果長時間數據線沒有拉低,說明測量錯誤
  136.        *(p_value)=s_read_byte(ACK);    //讀第一個字節,高字節 (MSB)
  137.        *(p_value+1)=s_read_byte(ACK);    //讀第二個字節,低字節 (LSB)
  138.        *p_checksum=s_read_byte(noACK); //read CRC校驗碼
  139.        returnerror;                                 //error=1 通訊錯誤
  140. }

  141. //溫濕度值標度變換及溫度補償
  142. void calc_sth10(float *p_humidity ,float*p_temperature)
  143. {
  144.        constfloat C1=-4.0;              // 12位濕度精度 修正公式
  145.        constfloat C2=+0.0405;           // 12位濕度精度 修正公式
  146.        constfloat C3=-0.0000028;        // 12位濕度精度 修正公式
  147.        constfloat T1=+0.01;             // 14位溫度精度 5V條件 修正公式
  148.        constfloat T2=+0.00008;          // 14位溫度精度 5V條件 修正公式

  149.        floatrh=*p_humidity;             // rh:      12位濕度
  150.        floatt=*p_temperature;           // t:       14位溫度
  151.        floatrh_lin;                     // rh_lin: 濕度 linear值
  152.        floatrh_true;                    // rh_true: 濕度 ture值
  153.        floatt_C;                        // t_C   : 溫度℃

  154.        t_C=t*0.01- 40;                  //補償溫度
  155.        rh_lin=C3*rh*rh+ C2*rh + C1;     //相對濕度非線性補償
  156.        rh_true=(t_C-25)*(T1+T2*rh)+rh_lin;   //相對濕度對于溫度依賴性補償
  157.        if(rh_true>100)rh_true=100;       //濕度最大修正
  158.        if(rh_true<0.1)rh_true=0.1;       //濕度最小修正

  159.        *p_temperature=t_C;               //返回溫度結果
  160.        *p_humidity=rh_true;              //返回濕度結果
  161. }

  162. //從相對溫度和濕度計算露點
  163. /*float calc_dewpoint(float h,float t)
  164. {
  165.        floatlogEx,dew_point;
  166.        logEx=0.66077+7.5*t/(237.3+t)+(log10(h)-2);
  167.        dew_point= (logEx - 0.66077)*237.3/(0.66077+7.5-logEx);
  168.        returndew_point;
  169. }                                                                         */

  170. /***********************************************************************************************************************************************************/
復制代碼


DS1602程序(1602.c):

  1. #include<tou.h>

  2. //內部等待函數**************************************************************
  3. unsigned char LCD_Wait(void)
  4. {
  5.    LcdRs=0;
  6.    LcdRw=1;    _nop_();
  7.    LcdEn=1;    _nop_();           
  8.    LcdEn=0;
  9.    return DBPort;  
  10. }
  11. //向LCD寫入命令或數據********************************************************
  12. #define LCD_COMMAND         0     // Command
  13. #define LCD_DATA            1      // Data
  14. #define LCD_CLEAR_SCREEN    0x01     // 清屏
  15. #define LCD_HOMING          0x02      // 光標返回原點
  16. void LCD_Write(bit style, unsigned charinput)
  17. {
  18.    LcdEn=0;
  19.    LcdRs=style;
  20.    LcdRw=0;        _nop_();
  21.    DBPort=input;   _nop_();//注意順序
  22.    LcdEn=1;        _nop_();//注意順序
  23.    LcdEn=0;        _nop_();
  24.    LCD_Wait();
  25. }

  26. //設置顯示模式************************************************************
  27. #define LCD_SHOW            0x04    //顯示開
  28. #define LCD_HIDE            0x00    //顯示關

  29. #define LCD_CURSOR          0x02    //顯示光標
  30. #define LCD_NO_CURSOR       0x00   //無光標        

  31. #define LCD_FLASH           0x01    //光標閃動
  32. #define LCD_NO_FLASH        0x00   //光標不閃動

  33. void LCD_SetDisplay(unsigned charDisplayMode)
  34. {
  35.    LCD_Write(LCD_COMMAND, 0x08|DisplayMode);
  36. }

  37. //設置輸入模式************************************************************
  38. #define LCD_AC_UP       0x02
  39. #define LCD_AC_DOWN         0x00      // default

  40. #define LCD_MOVE            0x01      // 畫面可平移
  41. #define LCD_NO_MOVE         0x00      //default

  42. void LCD_SetInput(unsigned char InputMode)
  43. {
  44.    LCD_Write(LCD_COMMAND, 0x04|InputMode);
  45. }

  46. //初始化LCD************************************************************
  47. void LCD_Initial()
  48. {
  49.    LcdEn=0;
  50.    LCD_Write(LCD_COMMAND,0x38);          //8位數據端口,2行顯示,5*7點陣
  51.    LCD_Write(LCD_COMMAND,0x38);
  52.    LCD_SetDisplay(LCD_SHOW|LCD_NO_CURSOR);    //開啟顯示, 無光標
  53.    LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN);   //清屏
  54.    LCD_SetInput(LCD_AC_UP|LCD_NO_MOVE);       //AC遞增, 畫面不動
  55. }

  56. //液晶字符輸入的位置************************
  57. void GotoXY(unsigned char x, unsigned chary)
  58. {
  59.    if(y==0)
  60.        LCD_Write(LCD_COMMAND,0x80|x);
  61.    if(y==1)
  62.        LCD_Write(LCD_COMMAND,0x80|(x-0x40));
  63. }

  64. //將字符輸出到液晶顯示
  65. void Print(unsigned char *str)
  66. {
  67.    while(*str!='\0')
  68.     {
  69.        LCD_Write(LCD_DATA,*str);
  70.        str++;
  71.     }
  72. }

  73. /***********************************************************************************************************************************************************/
復制代碼


主函數(main.c):

  1. #include<tou.h>

  2. typedef union                             //定義共用同類型
  3. {     
  4.        unsignedint i;
  5.        floatf;
  6. } value;

  7. //延時函數
  8. void delay(int z)            //z為毫秒數
  9. {
  10.        intx,y;
  11.        for(x=z;x>0;x--)
  12.               for(y=125;y>0;y--);
  13. }


  14. void main()
  15. {
  16.        unsignedint temp,humi;
  17.        valuehumi_val,temp_val;             //定義兩個共同體,一個用于濕度,一個用于溫度
  18. //     floatdew_point;                       //用于記錄露點值
  19.        unsignedchar error;                 //用于檢驗是否出現錯誤
  20.        unsignedchar checksum;                    //CRC                    
  21.        ucharwendu[6];                               //用于記錄溫度
  22.        ucharshidu[6];                                 //用于記錄濕度


  23.        LCD_Initial();                                //初始化液晶            
  24.      GotoXY(0,0);                                //選擇溫度顯示位置
  25.      Print("TEMP:     %C");                      //5格空格
  26.    GotoXY(0,1);                                //選擇濕度顯示位置
  27.      Print("HUMI:     %RH");                     //5格空格
  28.        s_connectionreset();                       //啟動連接復位
  29.        while(1)
  30.        {
  31.               error=0;                                 //初始化error=0,即沒有錯誤
  32.               error+=s_measure((unsignedchar*)&temp_val.i,&checksum,TEMP); //溫度測量
  33.               error+=s_measure((unsignedchar*)&humi_val.i,&checksum,HUMI); //濕度測量
  34.            if(error!=0) s_connectionreset();                 ////如果發生錯誤,系統復位
  35.            else
  36.            {
  37.                      humi_val.f=(float)humi_val.i;                   //轉換為浮點數
  38.                  temp_val.f=(float)temp_val.i;                   //轉換為浮點數
  39.                  calc_sth10(&humi_val.f,&temp_val.f);            //修正相對濕度及溫度
  40. //                 dew_point=calc_dewpoint(humi_val.f,temp_val.f);//計算e dew_point
  41.                    temp=temp_val.f*10;
  42.                  humi=humi_val.f*10;
  43.                  GotoXY(5,0);                                    //設置溫度顯示位置
  44.                 wendu[0]=temp/1000+'0';               //溫度百位
  45.                 wendu[1]=temp%1000/100+'0';       //溫度十位     
  46.                    wendu[2]=temp%100/10+'0';                     //溫度個位
  47.                 wendu[3]=0x2E;                                       //小數點
  48.                    wendu[4]=temp%10+'0';                            //溫度小數點后第一位         
  49.                      Print(wendu);                                    //輸出溫度            
  50.                   GotoXY(5,1);                                    //設置濕度顯示位置                                 
  51.                      shidu[0]=humi/1000+'0';                 //濕度百位
  52.                 shidu[1]=humi%1000/100+'0';         //濕度十位     
  53.                    shidu[2]=humi%100/10+'0';                //濕度個位
  54.                 shidu[3]=0x2E;                                         //小數點
  55.                    shidu[4]=humi%10+'0';                       //濕度小數點后第一位  
  56.                      Print(shidu);                                      //輸出濕度        
  57.            }  
  58.               delay(800);                             //等待足夠長的時間,以現行下一次轉換                    
  59.        }
  60. }

  61. /***********************************************************************************************************************************************************/
復制代碼


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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 成人免费视频网站在线观看 | 国产大片黄色 | 欧美精品导航 | 国产精品一区在线 | 夜色www国产精品资源站 | 亚洲69p| 久久www免费人成看片高清 | 欧美一级片a | 精品久久久久久久久久久久久久 | 久草视频观看 | 色婷婷亚洲一区二区三区 | 亚洲天堂男人的天堂 | 色综久久 | 伊人伊人网 | 久久久青草婷婷精品综合日韩 | 99热播精品 | 欧美福利精品 | 久久精品久久久久久 | 国产精品久久久久久久久久 | 精品视频一区二区三区四区 | av在线天堂| 97伦理| 成年无码av片在线 | 久久久久久国产精品 | hitomi一区二区三区精品 | 日韩欧美视频免费在线观看 | 亚洲精品一区二三区不卡 | aaa在线观看 | 99综合网 | 久久777| 中文字幕一区二区视频 | 久久久久一区 | 欧美成年网站 | 99re视频这里只有精品 | 91久久精品一区二区二区 | 日日碰狠狠躁久久躁96avv | 久久男人天堂 | 成人免费视频播放 | 日韩精品999| 在线成人免费视频 | www.亚洲精品 |