|
目 錄
1 目的與意義--------------------------------------------------------------------------------------- 1
2 設(shè)計(jì)要求------------------------------------------------------------------------------------------ 1
3 方案設(shè)計(jì)------------------------------------------------------------------------------------------ 1
3.1 方案一------------------------------------------------------------------------------------- 1
3.2 方案二------------------------------------------------------------------------------------------2
4 系統(tǒng)硬件設(shè)計(jì)------------------------------------------------------------------------------------- 2
4.1 STC89C52主控電路---------------------------------------------------------------------- 3
4.2 DTH11溫濕度檢測電路----------------------------------------------------------------- 4
4.3 LCD1602液晶屏顯示電路--------------------------------------------------------------- 5
5 系統(tǒng)軟件設(shè)計(jì)------------------------------------------------------------------------------------- 6
5.1 主程序程序流程圖----------------------------------------------------------------------- 6
5.2 溫濕度檢測程序-------------------------------------------------------------------------- 2
5.3 LCD1206顯示程序----------------------------------------------------------------------- 9
6 系統(tǒng)測試結(jié)果與分析--------------------------------------------------------------------------- 11
6.1 系統(tǒng)測試結(jié)果--------------------------------------------------------------------------- 11
6.2 系統(tǒng)結(jié)果分析--------------------------------------------------------------------------- 11
7 總結(jié)----------------------------------------------------------------------------------------------- 11
參考文獻(xiàn)-------------------------------------------------------------------------------------------- 11
附錄------------------------------------------------------------------------------------------------- 12
附錄A 系統(tǒng)實(shí)物圖------------------------------------------------------------------------ 12
附錄B 系統(tǒng)主程序------------------------------------------------------------------------- 12
1 目的與意義溫濕檢測在倉庫管理、生產(chǎn)制造、氣象觀測、科學(xué)研究、國防軍事以及日常生活中有廣泛的應(yīng)用,傳統(tǒng)的模擬式溫濕度傳感器一般都要設(shè)計(jì)信號調(diào)理電路并需要經(jīng)過復(fù)雜的校準(zhǔn)和標(biāo)定過程,因此測量精度難以保證,且在線性度、重復(fù)度、互換性、一致性等方面往往不盡人意。
由于溫濕度傳感器及其控制系統(tǒng)是20世紀(jì)90年代才興起的行業(yè),因此利用溫濕度傳感器設(shè)計(jì)一款將度高、穩(wěn)定性好、成本低的溫濕度檢測器有一定的市場前景。此單片機(jī)課程設(shè)計(jì)采用具有高精度,防干擾等優(yōu)點(diǎn)的傳感器,結(jié)合單片機(jī)技術(shù),設(shè)計(jì)完成的溫濕度檢測器具有易攜帶、低功率等特點(diǎn)。克服了傳統(tǒng)溫濕度檢測器需要校準(zhǔn)的過程和精度較低的缺點(diǎn)。
2 設(shè)計(jì)要求 (1)模擬單總線協(xié)議與DTH11進(jìn)行通信;
(2)LCD1602第一行顯示檢測的溫度值:Temperature 22℃
(3)LCD1602第二行顯示檢測的濕度值:Humidity 75%RH
3 方案設(shè)計(jì)溫濕度檢測器的組成部分:
附錄B 系統(tǒng)主程序
- #include<reg52.h>#include<intrins.h>//****************************************************
- //***********************定義區(qū)***********************
- //****************************************************#define uchar unsigned char#define uint unsigned int
- #define LCD1602_DB P2 sbit DQ=P3^7; sbit LCD1602_RS = P0^7;sbit LCD1602_RW = P0^6;sbit LCD1602_EN = P0^5;
- void Lcd1602_Delay1ms(uint c);
- void Read_Busy(); void Write_Cmd(unsigned char cmd); void Write_Data(unsigned char dat); void LcdSetCursor(unsigned char x,unsigned chary); void DisplayOneChar (uchar X,uchar Y,uchar DData);void LcdShowStr(unsigned char x,unsigned chary,unsigned char *str); void InitLcd1602(); //****************************************************
- //******************1602顯示初始化****************
- //****************************************************uchar code ASCII[]="0123456789%c";uchar code table0[]="Temperature:00";uchar code table1[]="Humidity:00";uchar tem;uchar hum;
- void InitLcd1602() {Write_Cmd(0x38); Write_Cmd(0x0c); Write_Cmd(0x06); Write_Cmd(0x01); }
- void Read_Busy() unsignedchar sta; LCD1602_DB =0xff; LCD1602_RS =0; LCD1602_RW =1; do { LCD1602_EN = 1; sta =LCD1602_DB; LCD1602_EN = 0; } while(sta& 0x80);}
- void Write_Cmd(uchar cmd) //寫命令{ Read_Busy(); LCD1602_RS =0; LCD1602_RW =0; LCD1602_DB =cmd; LCD1602_EN =1; LCD1602_EN =0; }
- void Write_Data(uchar dat) //讀數(shù)據(jù) Read_Busy(); LCD1602_RS= 1; LCD1602_RW= 0; LCD1602_DB = dat; LCD1602_EN= 1; LCD1602_EN= 0;}
- //*****************************************************//*********************定義顯示函數(shù)********************//*****************************************************
- void LcdSetCursor(unsigned char x,unsigned char y){ unsignedchar addr; if(y == 0) addr =0x00 + x; else addr =0x40 + x; Write_Cmd(addr|0x80);}
- void DisplayOneChar (uchar X,uchar Y,uchar DData)//顯示字符{ if(Y) X|=0X40; //Y=1顯示第一行,Y=0顯示第二行 X|=0X80; Write_Cmd(X);//X用來選擇哪一位Write_Data(DData); //Ddata用來寫數(shù)據(jù)}
- void LcdShowStr(unsigned char x,unsigned chary,unsigned char *str) //顯示字符串{ LcdSetCursor(x,y); //當(dāng)前字符坐標(biāo) while(*str!= '\0') { Write_Data(*str++); }}
- //************************************************
- //**********************延時(shí)函數(shù)******************
- //*************************************************void delay_ms(uint z){uint x,y;for(x=z;x>0;x--)for(y=114;y>0;y--);}
- //*******************************************************
- //*************************DTH11模塊*********************
- //*******************************************************//**************************初始化DTH11bit Init_DTH11(){bit flag;uchar num;DQ=0;delay_ms(19); // >18msDQ=1;for(num=0;num<11;num++); // 20-40us 34.7usflag=DQ;for(num=0;num<27;num++); for(num=0;num<27;num++); return flag;}//****************************讀DTH11數(shù)據(jù)uchar DTH11_RD_CHAR(){uchar byte=0;uchar num;uchar num1;while(DQ==1);for(num1=0;num1<8;num1++){ while(DQ==0);byte<<=1; //¸ßλÔúǰfor(num=0;DQ==1;num++); if(num<10) byte|=0; else byte|=1;}return byte;}//******************************讀取DTH11溫度和濕度void DTH11_DUSHU(){uchar num;if(Init_DTH11()==0){hum=DTH11_RD_CHAR();DTH11_RD_CHAR();tem=DTH11_RD_CHAR();DTH11_RD_CHAR();DTH11_RD_CHAR();for(num=0;num<17;num++); DQ=1;}}
- //****************************************************
- //***************將檢測到的數(shù)據(jù)顯示模塊***************
- //****************************************************
- display0[2]={0,0};display1[2]={0,0};void Display_DTH11(){display0[1]=tem/10%10;display0[0]=tem%10;LcdShowStr(0, 0, table0);DisplayOneChar(12, 0, ASCII[ display0[1] ] );DisplayOneChar(13, 0, ASCII[ display0[0] ] );DisplayOneChar(14, 0, 0xdf );DisplayOneChar(15, 0, 0x43 ); display1[1]=hum/10%10;display1[0]=hum%10;LcdShowStr(0, 1, table1);DisplayOneChar( 9, 1, ASCII[ display1[1] ] );DisplayOneChar(10, 1, ASCII[ display1[0] ] );DisplayOneChar(11, 1, ASCII[10] ); DisplayOneChar(12, 1, 0x52);DisplayOneChar(13, 1, 0x48);} //*****************************************************
- //********************主函數(shù)***************************
- //*****************************************************
- void main(){tem=0;hum=0;delay_ms(1000); InitLcd1602();while(1){ DTH11_DUSHU();Display_DTH11();delay_ms(1000);}
- }
復(fù)制代碼 |
|