|
這是本學(xué)期我們兩周課程設(shè)計(jì)的內(nèi)容,因?yàn)槲业幕A(chǔ)不太好,所以基本電路比較簡(jiǎn)單,實(shí)現(xiàn)的功能也簡(jiǎn)單,希望對(duì)初學(xué)者能有一定的借鑒意義。圖片中有用Proteus仿真的截圖,附件中有源代碼。
仿真圖
SHT11.h文件:
- #ifndef __SHT11_H__
- #define __SHT11_H__
- /*************************
- SHT11相關(guān)命令
- **************************/
- #define uchar unsigned char
- #define uint unsigned int
- #define TEM_TEST 0x03//溫度檢測(cè)命令
- #define HUM_TEST 0x05//濕度檢測(cè)命令
- #define REG_READ 0x07//讀寄存器
- #define REG_WRITE 0x06//寫寄存器
- #define FUNCTION_SET 0x01//設(shè)置SHT11的工作精度為8位/濕度 12位溫度
- /**************************
- SHT11端口定義
- ***************************/
- sbit SHT11_DATA=P3^1;
- sbit SHT11_SCK=P3^0;
- sbit P33=P3^3;
- sbit P32=P3^2;
- sbit P36=P3^6;
- sbit P37=P3^7;
- uchar flag_tempeture=0; //顯示溫度位置的標(biāo)志
- uchar flag_humidity=0; //顯示濕度位置的標(biāo)志
- uchar code str1[]={ 0x10,0x06,0x09,0x08,0x08,0x09,0x06,0x00};//溫度圖標(biāo)
- uchar code str6_sht11[]="%RH ";
- uchar code str4_sht11[]="humi=";
- uchar code str2_sht11[]="temp=";
- uchar code str7_sht11[]=" ";//清除沒不要的顯示
- /***************************
- 函數(shù)名稱:Delay()
- 函數(shù)功能:SHT11內(nèi)部延時(shí)
- ****************************/
- void Delay()
- {
- ;
- ;
- }
- /***************************
- 函數(shù)名稱:Delay_Ms()
- 函數(shù)功能:SHT11檢測(cè)等待延時(shí)
- 函數(shù)說明:11ms/55ms/210ms 分別對(duì)應(yīng)8位/12位/14位 測(cè)量結(jié)果
- 對(duì)應(yīng)的形參為N 則延時(shí)Nms
- ****************************/
- void Delay_Ms(uint ms) // ms延時(shí)函數(shù) (AT89C51 @ 11.0592MHz)
- {
- uint i;
- uchar j;
- for(i=0;i<ms;i++)
- {
- for(j=0;j<200;j++);
- for(j=0;j<102;j++);
- }
- }
- /**************************
- 函數(shù)功能:SHT11啟動(dòng)時(shí)序
- ***************************/
- void SHT11_Start()
- {
- SHT11_SCK=1;
- SHT11_DATA=1;
- Delay();
- SHT11_DATA=0;
- Delay();
- SHT11_SCK=0;
- Delay();
- SHT11_SCK=1;
- Delay();
- SHT11_DATA=1;
- }
- /******************************
- 函數(shù)名稱:SHT11_Sendbyte(uchar dat)
- 函數(shù)功能: 向SHT11發(fā)送8bite數(shù)據(jù)
- ******************************/
- void SHT11_Sendbyte(uchar dat)
- {
- uchar i;
- SHT11_SCK=0;
- Delay();
- for(i=0;i<8;i++)
- {
- if(dat&0x80)
- {
- SHT11_DATA=1;
- Delay();
- }
- else
- {
- SHT11_DATA=0;
- Delay();
- }
- dat=dat<<1;
- SHT11_SCK=1;
- Delay();
- SHT11_SCK=0;
- }
- }
- /*********************************
- 函數(shù)名稱SHT11_Answer():
- 函數(shù)功能:檢測(cè)SHT11的響應(yīng)信號(hào)(在第九個(gè)時(shí)鐘周期)
- ***********************************/
- void SHT11_Answer()
- {
- SHT11_SCK=1;
- Delay();
- while(SHT11_DATA==1);
- SHT11_SCK=0;
- SHT11_DATA=1;
- }
- /************************************
- 函數(shù)名稱:SHT11_Test_Finish()
- 函數(shù)功能:檢測(cè)SHT11溫濕度檢測(cè)是否完畢
- *************************************/
- void SHT11_Test_Finish()
- {
- while(SHT11_DATA==1);
- }
- /************************************
- 函數(shù)名稱:SHT11_Receivebyte()
- 函數(shù)功能:從SHT11接收8bite數(shù)據(jù)
- *************************************/
- uchar SHT11_Receivebyte()
- {
- uchar i;
- uchar dat;
- SHT11_SCK=0;
- Delay();
- for(i=0;i<8;i++)
- {
- SHT11_SCK=1;
- Delay();
- dat=dat<<1;
- if(SHT11_DATA)
- {
- dat=dat|0x01;
- Delay();
- }
- else
- {
- dat=dat&0xfe;
- Delay();
- }
- SHT11_SCK=0;
- Delay();
- }
- SHT11_DATA=1; //釋放數(shù)據(jù)總線
- return(dat);
- }
- /***********************************
- 函數(shù)名稱:MCU_Answer()
- 函數(shù)功能:單片機(jī)向SHT11發(fā)送應(yīng)答信號(hào)
- *************************************/
- void MCU_Answer()
- {
- SHT11_SCK=0;
- Delay();
- SHT11_DATA=0;
- Delay();
- SHT11_SCK=1;
- Delay();
- SHT11_SCK=0;
- Delay();
- SHT11_DATA=1; //釋放數(shù)據(jù)總線 這條指令非常重要 不加的話導(dǎo)致單片機(jī)不能讀取低8位
- }
- /***********************************
- 函數(shù)名稱:SHT11_End()
- 當(dāng)接收兩個(gè)8byte數(shù)據(jù)后部接收CRC校驗(yàn)碼
- ************************************/
- void SHT11_End()
- {
- SHT11_DATA=1;
- SHT11_SCK=1;
- Delay();
- SHT11_SCK=0;
- Delay();
- }
- /*************************************
- 函數(shù)名稱:void SHT11_Write_Register(uchar command ,uchar dat)
- 函數(shù)說明:向SHT11的狀態(tài)寄存器設(shè)置功能
- command為REG_WRITE 0x06寫寄存器
- dat為 設(shè)置SHT11的功能 可以設(shè)置檢測(cè)的數(shù)據(jù)位數(shù)
- */
- void SHT11_Write_Register(uchar command ,uchar dat)
- {
- SHT11_Start();
- SHT11_Sendbyte(command);
- SHT11_Answer();
- SHT11_Sendbyte(dat);
- SHT11_Answer();
- }
- /***************************************
- 函數(shù)名稱:uchar SHT11_Read_Register(uchar command)
- 函數(shù)說明:command為REG_READ 0x07//讀寄存器
- 返回值為狀態(tài)寄存器的值
- 位6顯示當(dāng)前檢測(cè)完一次數(shù)據(jù)后電源供電情況
- 當(dāng)位6為0時(shí)表明VDD>2.47V 當(dāng)位6為1時(shí)表明VDD<2.47V即電量不足
- 位0表明當(dāng)前的測(cè)量分辨率
- 當(dāng)位0為1時(shí)表明測(cè)量精度:8位/濕度 12位溫度
- 當(dāng)位0為0時(shí)表明測(cè)量精度:12位濕度 14位溫度
- 默認(rèn)為0
- *******************************************/
- uchar SHT11_Read_Register(uchar command)
- {
- uchar dat;
- SHT11_Start();
- SHT11_Sendbyte(command);
- SHT11_Answer();
- dat=SHT11_Receivebyte();
- SHT11_End();
- return(dat);
- }
- /***************************************
- 函數(shù)名稱:SHT11_Measure(uchar command,uint time);
- 函數(shù)功能:設(shè)置SHT11檢測(cè)功能,并返回相應(yīng)的檢測(cè)結(jié)果
- 函數(shù)說明:command形參用于設(shè)定溫度檢測(cè)還是濕度檢測(cè),
- time形參用于設(shè)定檢測(cè)過程中的等待時(shí)間,以確定檢測(cè)結(jié)果的位數(shù)
- 11ms/55ms/210ms 分別對(duì)應(yīng)8位/12位/14位
- ****************************************/
- uint SHT11_Measure(uchar command,uchar time)
- {
- uint dat=0;
- uchar data_high,data_low;
- SHT11_Start();
- SHT11_Sendbyte(command);
- SHT11_Answer();
- Delay_Ms(time);
- SHT11_Test_Finish();
- data_high=SHT11_Receivebyte();
- MCU_Answer();
- data_low=SHT11_Receivebyte();
- SHT11_End();
- dat=(dat|data_high);
- dat=(dat<<8)|data_low;
- return(dat);
- }
- /****************************************
- 函數(shù)名稱:Convert_Tempeture12bit(uint dat);
- 函數(shù)功能:將檢測(cè)到的數(shù)據(jù)轉(zhuǎn)化為相應(yīng)的溫度數(shù)據(jù)
- 函數(shù)說明:溫度轉(zhuǎn)換公式--T=d1+d2*SOt
- 公式中的參數(shù)d1=-40,d2=0.04
- 適用于12位測(cè)量精度
- */
- float SHT11_Convert_Tempeture12bit(uint dat)
- {
- float tempeture1;
- tempeture1=-40+0.04*dat;
- if(tempeture1>23)
- tempeture1=tempeture1+1;
- if(tempeture1>55)
- tempeture1=tempeture1+1;
- if(P37==1)
- {
- if(tempeture1>=16&&tempeture1<30)
- {
- P33=1;
- P32=0;
- }
- else
- {
- P33=0;
- P32=1;
- }
- }
- return(tempeture1);
- }
- /*****************************************
- 函數(shù)名稱:SHT11_Convert_Humidity8bit(uint dat,float temp)
- 函數(shù)功能:將檢測(cè)到的數(shù)據(jù)轉(zhuǎn)化為相應(yīng)的濕度數(shù)據(jù)
- 函數(shù)說明:相對(duì)濕度轉(zhuǎn)換公式-----RHline=C1+C2*SOrh+C3*SOrh*SOrh(檢測(cè)數(shù)據(jù)的線性化 SOrh為單片機(jī)接收到的數(shù)據(jù))
- -----RHtrue=(tempeture-25)*(t1+t2*SOrh)+RHline
- 公式中的參數(shù):C1=-4,C2=0,648,C3=-0.00072
- t1=0.01,t2=0.00128
- 適用于8位測(cè)量精度
- */
- uint SHT11_Convert_Humidity8bit(uint dat,float temp)
- {
- float RHline,RHtrue;
- uint r;
- RHline=-4+0.648*dat-0.00072*dat*dat;
- RHtrue=(temp-25)*(0.01+0.00128*dat)+RHline;
- r=(RHtrue-3)*10+0.5;
- if(P37==0)
- {
- if(r>=400&&r<600)
- {
- P33=1;
- }
- else
- {
- P33=0;
- }
- if(r>=600)
- {
- P32=1;
- }
- else
- {
- P32=0;
- }
- }
- return(r);
- }
- #endif
- Display.c文件:
- #include <reg52.h>
- #include "SHT11.h"
- #define uchar unsigned char
- #define uint unsigned int
- #define TEM_TEST 0x03//溫度檢測(cè)命令
- #define HUM_TEST 0x05//濕度檢測(cè)命令
- #define REG_READ 0x07//讀寄存器
- #define REG_WRITE 0x06//寫寄存器
- #define FUNCTION_SET 0x01//設(shè)置SHT11的工作精度為8位/濕度 12位溫度
- uchar DispData[4] = {0, 1, 2, 3};
- code uchar DispSegmentP0[10]={0x3f,0x06,0x1b,0x0f,0x26,0x2d,0x3d,0x07,0x3f,0x2f};
- code uchar DispSegmentP2[10]={0x00,0x00,0x22,0x22,0x22,0x22,0x22,0x00,0x22,0x22};
- // 0 1 2 3 4 5 6 7 8 9 %
- code uchar DispCtrl[4] = {0xef, 0xdF, 0xbf ,0x7F};
- sbit P16=P1^6;
- sbit P26=P2^6;
- sbit P34=P3^4;
- void Temp_delay(unsigned int j)
- {
- uchar i;
- for(i=100;i>0;i--)
- {
- for(j;j>0;j--);
- }
- }
- void Show(uchar *Buffer)
- {
- uchar i;
-
- for (i=0; i<4; i++)
- {
- P1 = DispCtrl[i];
- P0 = DispSegmentP0[*Buffer];
- P2 = DispSegmentP2[*Buffer];
- if(P16==0)
- P26=1;
- Temp_delay(2);
- Buffer++;
- }
- }
- void DispConvert(uchar *DispAddr, uint Temp2Con)
- {
- DispAddr[0] = Temp2Con/1000;
- DispAddr[1] = (Temp2Con - DispAddr[0]*1000)/100;
- DispAddr[2] = (Temp2Con - DispAddr[0]*1000 - DispAddr[1]*100)/10;
- DispAddr[3] = Temp2Con - DispAddr[0]*1000 - DispAddr[1]*100 - DispAddr[2]*10;
- }
- void main()
- {
- uint temp;
- uint dat;
- uint Hum;
- //float f;
- while(1)
- {
- Show(DispData);
- SHT11_Write_Register(REG_WRITE,FUNCTION_SET);
- temp=SHT11_Measure(TEM_TEST,0x37);
- temp=SHT11_Convert_Tempeture12bit(temp);
- dat=SHT11_Measure(HUM_TEST,0x0b);
- Hum=SHT11_Convert_Humidity8bit(dat,temp);
- if(P34==0)
- {
- P36=1;
- P37=0;
- DispConvert(DispData,Hum);
- }
- else
- {
- P36=0;
- P37=1;
- DispConvert(DispData,temp*10);
- }
- }
- }
復(fù)制代碼
|
|