<acronym id="s8ci2"><small id="s8ci2"></small></acronym>
<rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
<acronym id="s8ci2"></acronym>
<acronym id="s8ci2"><center id="s8ci2"></center></acronym>
0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

基于51單片機的濕度監測仿真和程序

jf_eqg0Ui2u ? 來源:懂事電子設計 ? 2023-07-05 09:55 ? 次閱讀

今天分享一個基于51單片機的濕度監測仿真和程序。

仿真所用的濕度傳感器為SHT11。SHT11是瑞士Scnsirion公司推出的一款數字溫濕度傳感器芯片。該芯片廣泛應用于暖通空調、汽車、消費電子、自動控制等領域。

其主要特點如下:

高度集成,將溫度感測、濕度感測、信號變換、A/D轉換和加熱器等功能集成到一個芯片上;

提供二線數字串行接口SCK和DATA,接口簡單,支持CRC傳輸校驗,傳輸可靠性高;

測量精度可編程調節,內置A/D轉換器(分辨率為8~12位,可以通過對芯片內部寄存器編程米選擇);

wKgZomSkzaGAcjsCAAB11eRxi-k587.png

引腳 名稱 功能
1 GND 地線
2 DATA 串行數據線
3 SCK 串行時鐘
4 VDD 電源
NC NC 懸空

傳輸啟動

數據傳輸初始化:

當SCK時鐘為高電平時,DATA翻轉位低電平,緊接著SCK變為低電平,

隨后在SCK時鐘高電平時,DATA翻轉為高電平。

9b19e8d4-1a6a-11ee-962d-dac502259ad0.png

void start_sht11(void)  //啟動
//--------------------------------------------------------
{  
   DATA=1; SCK=0;                   //數據為1,SCK=0
   _nop_();
   SCK=1;                          //第一個脈沖
   _nop_();
   DATA=0;                         //數據跌落
   _nop_ ();
   SCK=0;                         //完成一個脈沖
   _nop_(); _nop_(); _nop_();
   SCK=1;                         //再一個脈沖
   _nop_();
   DATA=1;                        //數據變為1       
   _nop_();
   SCK=0;                         //完成該脈沖       
}

讀寫數據

9b3bb810-1a6a-11ee-962d-dac502259ad0.png

9b59b4dc-1a6a-11ee-962d-dac502259ad0.png

控制器傳感器發送命令的過程中,DATA在SCK上升沿有效,且在SCK高電平時必須保持穩定;DATA在SCK下降沿之后改變。(參考上圖 DATA valid write 段)

從傳感器讀取數據讀取數據的過程中,DATA Tv在SCK變低以后有效,且維持到下一個SCK的下降沿。(參考上圖 DATA valid read 段)

char read(void) //讀一個字節 返回應答信號
//----------------------------------------------------------------------------------
// reads a byte form the Sensibus and gives an acknowledge in case of "ack=1" 
{ 
  unsigned char i,val=0;
  temp_LL=0;
  temp_h=0;
  DATA=1;                           //釋放數據總線
  for (i=0x80;i>0;i/=2)             //位移8位
  { 
    SCK=1;                          //上升沿讀入
    if (DATA) val=(val | i);        //確定值  
    SCK=0;             
  }
  DATA=0;                        //讀應答信號,有應答為1,為應答為0 通過CPU下拉為應答
  SCK=1;                            //第9個脈沖
  _nop_(); _nop_(); _nop_();          //pulswith approx. 5 us 
  SCK=0;                
  DATA=1;                           //釋放數據總線
  temp_h=val;
  val=0;
 ////低8位/////////////////////////////
  DATA=1;                           //釋放數據總線
  for (i=0x80;i>0;i/=2)             //位移8位
  { 
    SCK=1;                          //上升沿讀入
    if (DATA) val=(val | i);        //確定值  
    SCK=0;             
  }
  DATA=1;//0;                       //不需要應答 通過CPU下拉為應答
  SCK=1;                            //第9個脈沖
  _nop_(); _nop_(); _nop_();          //pulswith approx. 5 us 
  SCK=0;                
  DATA=1;                           //釋放數據總線
  temp_LL=val;
  return val ;
}
////////////




char write(unsigned char value) //寫一個字節 返回應答信號
//---------------------------------------------------------
{ 
  unsigned char i ;
  ack=0;  
  for (i=0x80;i>0;i/=2)             //釋放數據總線
  { if (i & value) DATA=1;          //寫入值
    else DATA=0;                        
    SCK=1;                          //上升沿寫入
     _nop_(); _nop_(); _nop_();        //延時  
    SCK=0;
  }
  DATA=1;                           //釋放數據總線
  SCK=1;                            //第9個脈沖
  if  (DATA==1) ack=1;        //讀應答信號
  SCK=0;        
  return ack;                     //error=1 表示沒有應答
}

傳感器復位

如果出現通訊中斷,當DATA保持高電平時,觸發SCK時鐘9次或更多,然后發送“傳輸啟動”時序就可以完成傳感器的復位。

9b76bd34-1a6a-11ee-962d-dac502259ad0.png

//////////////////////////////////
void sht_rest(void)  //復位 
{  
  unsigned char i; 
  DATA=1; SCK=0;                    //數據為1 時鐘為0
  for(i=0;i<9;i++)                  //9 個脈沖為 復位
  { SCK=1;
    SCK=0;
  }
  start_sht11();                   //啟動
}

Proteus仿真如下圖。主要功能是利用SHT11進行濕度的采集,并通過LCD1602顯示。在仿真中通過SHT11上面的操作按鈕就可以改變SHT11的溫度和濕度數值。該仿真沒有對溫度數據進行采集和現實。

9b8b3f48-1a6a-11ee-962d-dac502259ad0.png

完整的程序如下

#include 
#include
#define  uint unsigned int
#define uchar unsigned char   
/*------------------------------------------------
                 硬件端口定義
------------------------------------------------*/
sbit RS = P2^0;   //定義端口 
sbit RW = P2^1;
sbit EN = P2^2;
sbit LED = P2^4 ;


sbit RELAY = P1^0 ;


#define DataPort P0 
sbit DATA =P2^6;  //數據
sbit SCK=P2^7;    //時鐘
uchar cnt = 0 ;


unsigned char temp_h  ;  //全局應答變量
unsigned char temp_LL  ;//全局應答變量
unsigned char error  ;  //全局錯誤變量
unsigned char ack  ;  //全局應答變量


#define RS_CLR RS=0 
#define RS_SET RS=1


#define RW_CLR RW=0 
#define RW_SET RW=1 


#define EN_CLR EN=0
#define EN_SET EN=1


#define TEMP_ML 0x03       //000   0001    1 溫度命令
#define HUMI_ML 0x05       //000   0010    1 溫度命令


unsigned  int  xianzhi_h=0;//濕度顯值




uchar key ;
uchar key_buf ;
uchar temp ;
uchar frq_cnt = 0;
bit updat = 0 ;
uchar delay_cnt = 0 ;


#define  TH0_BUF 0x3c
#define  TL0_BUF 0xaf


void text_jisuan_humi(void);
/*------------------------------------------------
 uS延時函數,含有輸入參數 unsigned char t,無返回值
 unsigned char 是定義無符號字符變量,其值的范圍是
 0~255 這里使用晶振12M,精確延時請使用匯編,大致延時
 長度如下 T=tx2+5 uS 
------------------------------------------------*/
void DelayUs2x(unsigned char t)
{   
 while(--t);
}
/*------------------------------------------------
 mS延時函數,含有輸入參數 unsigned char t,無返回值
 unsigned char 是定義無符號字符變量,其值的范圍是
 0~255 這里使用晶振12M,精確延時請使用匯編
------------------------------------------------*/
void DelayMs(unsigned char t)
{
     
 while(t--)
 {
     //大致延時1mS
     DelayUs2x(245);
   DelayUs2x(245);
 }
}
/*------------------------------------------------
              判忙函數
------------------------------------------------*/
 bit LCD_Check_Busy(void) 
{ 
 DataPort= 0xFF; 
 RS_CLR; 
 RW_SET; 
 EN_CLR; 
 _nop_(); 
 EN_SET;
 return (bit)(DataPort & 0x80);
}
/*------------------------------------------------
              寫入命令函數
------------------------------------------------*/
 void LCD_Write_Com(unsigned char com) 
{  
// while(LCD_Check_Busy()); //忙則等待
 DelayMs(5);
 RS_CLR; 
 RW_CLR; 
 EN_SET; 
 DataPort= com; 
 _nop_(); 
 EN_CLR;
 }
/*------------------------------------------------
              寫入數據函數
------------------------------------------------*/
 void LCD_Write_Data(unsigned char Data) 
{ 
 //while(LCD_Check_Busy()); //忙則等待
 DelayMs(5);
 RS_SET; 
 RW_CLR; 
 EN_SET; 
 DataPort= Data; 
 _nop_();
 EN_CLR;
 }


/*------------------------------------------------
                清屏函數
------------------------------------------------*/
 void LCD_Clear(void) 
{ 
 LCD_Write_Com(0x01); 
 DelayMs(5);
 }
/*------------------------------------------------
              寫入字符串函數
------------------------------------------------*/
 void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s) 
{     
 if (y == 0) 
   {     
   LCD_Write_Com(0x80 + x);     //表示第一行
   }
 else 
   {      
   LCD_Write_Com(0xC0 + x);      //表示第二行
   }        
 while (*s) 
   {     
 LCD_Write_Data( *s);     
 s ++;     
   }
 }
/*------------------------------------------------
              寫入字符函數
------------------------------------------------*/
 void LCD_Write_Char(unsigned char x,unsigned char y,unsigned char Data) 
{     
 if (y == 0) 
   {     
   LCD_Write_Com(0x80 + x);     
   }    
 else 
   {     
   LCD_Write_Com(0xC0 + x);     
   }        
 LCD_Write_Data( Data);  
 }
/*------------------------------------------------
              初始化函數
------------------------------------------------*/
 void LCD_Init(void) 
{
   LCD_Write_Com(0x38);    /*顯示模式設置*/ 
   DelayMs(5); 
   LCD_Write_Com(0x38); 
   DelayMs(5); 
   LCD_Write_Com(0x38); 
   DelayMs(5); 
   LCD_Write_Com(0x38);  
   LCD_Write_Com(0x08);    /*顯示關閉*/ 
   LCD_Write_Com(0x01);    /*顯示清屏*/ 
   LCD_Write_Com(0x06);    /*顯示光標移動設置*/ 
   DelayMs(5); 
   LCD_Write_Com(0x0C);    /*顯示開及光標設置*/
   }
/*------------------------------------------------
               定時器0中斷
------------------------------------------------*/
void TIM0_ISR() interrupt 1
{
  TR0=0;      
  TH0 = TH0_BUF ; 
  TL0 = TL0_BUF ;
  if(cnt<5)
  {
    cnt ++ ;
  }else
  {
    cnt = 0 ;
    updat = 1 ;
  }
  TR0=1;
}
/*******************************基本驅動程    *************************************/


/////////////////
//////////////////////
char read(void) //讀一個字節 返回應答信號
//----------------------------------------------------------------------------------
// reads a byte form the Sensibus and gives an acknowledge in case of "ack=1" 
{ 
  unsigned char i,val=0;
  temp_LL=0;
  temp_h=0;
  DATA=1;                           //釋放數據總線
  for (i=0x80;i>0;i/=2)             //位移8位
  { 
    SCK=1;                          //上升沿讀入
    if (DATA) val=(val | i);        //確定值  
    SCK=0;             
  }
  DATA=0;                        //讀應答信號,有應答為1,為應答為0 通過CPU下拉為應答
  SCK=1;                            //第9個脈沖
  _nop_(); _nop_(); _nop_();          //pulswith approx. 5 us 
  SCK=0;                
  DATA=1;                           //釋放數據總線
  temp_h=val;
  val=0;
 ////低8位/////////////////////////////
  DATA=1;                           //釋放數據總線
  for (i=0x80;i>0;i/=2)             //位移8位
  { 
    SCK=1;                          //上升沿讀入
    if (DATA) val=(val | i);        //確定值  
    SCK=0;             
  }
  DATA=1;//0;                       //不需要應答 通過CPU下拉為應答
  SCK=1;                            //第9個脈沖
  _nop_(); _nop_(); _nop_();          //pulswith approx. 5 us 
  SCK=0;                
  DATA=1;                           //釋放數據總線
  temp_LL=val;
  return val ;
}
////////////




char write(unsigned char value) //寫一個字節 返回應答信號
//---------------------------------------------------------
{ 
  unsigned char i ;
  ack=0;  
  for (i=0x80;i>0;i/=2)             //釋放數據總線
  { if (i & value) DATA=1;          //寫入值
    else DATA=0;                        
    SCK=1;                          //上升沿寫入
     _nop_(); _nop_(); _nop_();        //延時  
    SCK=0;
  }
  DATA=1;                           //釋放數據總線
  SCK=1;                            //第9個脈沖
  if  (DATA==1) ack=1;        //讀應答信號
  SCK=0;        
  return ack;                     //error=1 表示沒有應答
}
////////


void start_sht11(void)  //啟動
//--------------------------------------------------------
{  
   DATA=1; SCK=0;                   //數據為1,SCK=0
   _nop_();
   SCK=1;                          //第一個脈沖
   _nop_();
   DATA=0;                         //數據跌落
   _nop_ ();
   SCK=0;                         //完成一個脈沖
   _nop_(); _nop_(); _nop_();
   SCK=1;                         //再一個脈沖
   _nop_();
   DATA=1;                        //數據變為1       
   _nop_();
   SCK=0;                         //完成該脈沖       
}
//////////////////////////////////
void sht_rest(void)  //復位 
{  
  unsigned char i; 
  DATA=1; SCK=0;                    //數據為1 時鐘為0
  for(i=0;i<9;i++)                  //9 個脈沖為 復位
  { SCK=1;
    SCK=0;
  }
  start_sht11();                   //啟動
}


////////////////////////////////




//測量溫度或者是溫度,返回校驗值
void convert_data(unsigned char ml)
{ 
   unsigned int i;
   start_sht11();                   //啟動
   write(ml);//寫入測溫度
  if(ack==1) 
  {
    sht_rest() ;//復位
        write(ml);//寫入測溫度
    }  
  for (i=0;i<55535;i++){ if(DATA==0) break; }
   read();//讀溫度
}




/////////濕度采集處理//////


void get_humidata(void)
{
    error=0;
    ack=0;
      sht_rest() ;      //復位
     convert_data(HUMI_ML);
      text_jisuan_humi();
}


///////計算濕度//////
void text_jisuan_humi(void)
{
    float aa=0,bb=0,humi_zi;
  int   abcd=0;
  abcd = temp_h ;
  abcd = abcd <<8|temp_LL;
  aa = (float) abcd ;
   bb=aa*aa*2.8/1000000;
   aa=0.0405*aa;
   aa=aa-4-bb;
   humi_zi=aa;
    humi_zi=(humi_zi-3.3)*10;
     xianzhi_h=(int)humi_zi;
}


void Timer_Init(void)
{
  TMOD|=0x01;   //置定時器0工作方式1
  EA=1;         //打開全局中斷
  ET0=1;        //打開 定時器0 中斷
  TR0=1;
}
void main(void)
{
  char delay_cnt = 0;
  LED = 0 ;
  RELAY = 0 ;
  LCD_Init();       //液晶初始化
  LCD_Clear();    //清屏
  LCD_Write_String(0,0,"Humi:00.0%");        //初始顯示內容
  Timer_Init();      //定時器初始化
  while(1)
    {  
    if(updat)       //數更新
    {
      updat = 0 ;
      get_humidata();
      LCD_Write_Char(5,0,0x30+xianzhi_h/100%10);
      LCD_Write_Char(6,0,0x30+xianzhi_h/10%10);
      LCD_Write_Char(8,0,0x30+xianzhi_h%10);
    }
     } 
}
如果需要仿真程序和源文件可以發送“51單片機濕度檢測”獲取相應的下載鏈接。

審核編輯:湯梓紅

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 傳感器
    +關注

    關注

    2528

    文章

    48296

    瀏覽量

    741141
  • 轉換器
    +關注

    關注

    27

    文章

    8236

    瀏覽量

    142402
  • 仿真
    +關注

    關注

    50

    文章

    3876

    瀏覽量

    132250
  • 51單片機
    +關注

    關注

    269

    文章

    5648

    瀏覽量

    120971
  • 程序
    +關注

    關注

    114

    文章

    3630

    瀏覽量

    79643
收藏 人收藏

    評論

    相關推薦

    基于51單片機的SHT11溫濕度監測系統,LCD1602顯示,上下限按鍵設置

    40; } 資源內容 (1)基于51單片機和SHT11的溫濕度監控系統仿真畢設論文完整版; (2)Proteus仿真文件; (3)Kei
    發表于 03-26 17:44

    基于51單片機的數字濕度計的仿真設計

    本帖最后由 eehome 于 2013-1-5 09:48 編輯   求基于單片機的數字濕度計的仿真設計電路圖和程序,proteus繪圖,結合keil
    發表于 05-22 22:39

    基于單片機的遠程溫濕度監測系統。(有報酬)

    基于單片機的遠程溫濕度監測系統。單片機監測溫濕度,在LCD上面顯示出來。用zigbee再把溫濕度
    發表于 05-14 16:26

    基于51單片機的溫濕度監測系統

    基于51單片機的溫濕度監測系統,具體功能:1、LCD1602液晶第一行顯示當前的煙霧值,第二行顯示當前的溫度和濕度值;2、可以設置煙霧、溫
    發表于 07-20 07:38

    基于單片機倉庫溫濕度監測報警系統仿真設計的相關資料分享

    045【畢設課設】基于單片機倉庫溫濕度監測報警系統仿真設計,溫濕度監測報警系統,可以通過按鍵設定
    發表于 11-10 08:16

    基于單片機的溫度監測仿真電路

    基于單片機的溫度監測仿真電路主要包括DS18B20溫度采集電路、LCD溫度顯示電路、蜂鳴器LED燈報警電路和按鍵切換電路等。具體功能如下:1、燒錄程序后,
    發表于 11-18 06:33

    使用C51單片機和Proteus仿真設計遠程倉庫濕度監測系統的應用實例

    本文檔的主要內容詳細介紹的是使用C51單片機和Proteus仿真設計遠程倉庫濕度監測系統的應用實例資料合集免費下載。
    發表于 05-21 08:00 ?13次下載
    使用C<b class='flag-5'>51</b><b class='flag-5'>單片機</b>和Proteus<b class='flag-5'>仿真</b>設計遠程倉庫<b class='flag-5'>濕度</b><b class='flag-5'>監測</b>系統的應用實例

    基于51單片機6264擴展內存仿真設計(proteus仿真+程序

    基于51單片機6264擴展內存仿真設計(proteus仿真+程序)(單片機原理及應用)-基于
    發表于 07-22 11:45 ?78次下載
    基于<b class='flag-5'>51</b><b class='flag-5'>單片機</b>6264擴展內存<b class='flag-5'>仿真</b>設計(proteus<b class='flag-5'>仿真</b>+<b class='flag-5'>程序</b>)

    基于51單片機的智能溫控器設計包含源程序仿真

    基于51單片機的智能溫控器設計包含源程序仿真(手把手教你學單片機)-基于51
    發表于 07-22 14:56 ?87次下載
    基于<b class='flag-5'>51</b><b class='flag-5'>單片機</b>的智能溫控器設計包含源<b class='flag-5'>程序</b>及<b class='flag-5'>仿真</b>

    基于51單片機的智能溫控器設計(包含源程序仿真

    基于51單片機的智能溫控器設計(包含源程序仿真)(單片機課程設計)-基于51
    發表于 07-22 15:02 ?136次下載
    基于<b class='flag-5'>51</b><b class='flag-5'>單片機</b>的智能溫控器設計(包含源<b class='flag-5'>程序</b>及<b class='flag-5'>仿真</b>)

    基于51單片機的貨車超重監測系統仿真設計資料

    基于51單片機的貨車超重監測系統仿真設計資料
    發表于 10-25 10:33 ?4次下載

    基于51單片機的遠程倉庫濕度監測系統仿真設計資料包

    基于51單片機的遠程倉庫濕度監測系統仿真設計資料包
    發表于 10-25 10:37 ?1次下載

    51單片機如何跳出wile循環_51單片機競賽設計44例全部帶proteus仿真+程序

    51單片機如何跳出wile循環_51單片機競賽設計44例全部帶proteus仿真+程序
    發表于 11-21 13:06 ?63次下載
    <b class='flag-5'>51</b><b class='flag-5'>單片機</b>如何跳出wile循環_<b class='flag-5'>51</b><b class='flag-5'>單片機</b>競賽設計44例全部帶proteus<b class='flag-5'>仿真</b>+<b class='flag-5'>程序</b>

    基于51單片機的甲烷監測系統Proteus仿真

    基于51單片機的甲烷監測系統Proteus仿真
    發表于 12-27 09:47 ?19次下載

    分享一個基于51單片機濕度監測仿真程序

    仿真所用的濕度傳感器為SHT11。SHT11是瑞士Scnsirion公司推出的一款數字溫濕度傳感器芯片。該芯片廣泛應用于暖通空調、汽車、消費電子、自動控制等領域。
    發表于 07-05 09:55 ?507次閱讀
    分享一個基于<b class='flag-5'>51</b><b class='flag-5'>單片機</b>的<b class='flag-5'>濕度</b><b class='flag-5'>監測</b><b class='flag-5'>仿真</b>和<b class='flag-5'>程序</b>
    亚洲欧美日韩精品久久_久久精品AⅤ无码中文_日本中文字幕有码在线播放_亚洲视频高清不卡在线观看
    <acronym id="s8ci2"><small id="s8ci2"></small></acronym>
    <rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
    <acronym id="s8ci2"></acronym>
    <acronym id="s8ci2"><center id="s8ci2"></center></acronym>