目 录
1 目的与意义--------------------------------------------------------------------------------------- 1
2 设计要求------------------------------------------------------------------------------------------ 1
3 方案设计------------------------------------------------------------------------------------------ 1
3.1 方案一------------------------------------------------------------------------------------- 1
3.2 方案二------------------------------------------------------------------------------------------2
4 系统硬件设计------------------------------------------------------------------------------------- 2
4.1 STC89C52主控电路---------------------------------------------------------------------- 3
4.2 DTH11温湿度检测电路----------------------------------------------------------------- 4
4.3 LCD1602液晶屏显示电路--------------------------------------------------------------- 5
5 系统软件设计------------------------------------------------------------------------------------- 6
5.1 主程序程序流程图----------------------------------------------------------------------- 6
5.2 温湿度检测程序-------------------------------------------------------------------------- 2
5.3 LCD1206显示程序----------------------------------------------------------------------- 9
6 系统测试结果与分析--------------------------------------------------------------------------- 11
6.1 系统测试结果--------------------------------------------------------------------------- 11
6.2 系统结果分析--------------------------------------------------------------------------- 11
7 总结----------------------------------------------------------------------------------------------- 11
参考文献-------------------------------------------------------------------------------------------- 11
附录------------------------------------------------------------------------------------------------- 12
附录A 系统实物图------------------------------------------------------------------------ 12
附录B 系统主程序------------------------------------------------------------------------- 12
1 目的与意义温湿检测在仓库管理、生产制造、气象观测、科学研究、国防军事以及日常生活中有广泛的应用,传统的模拟式温湿度传感器一般都要设计信号调理电路并需要经过复杂的校准和标定过程,因此测量精度难以保证,且在线性度、重复度、互换性、一致性等方面往往不尽人意。
由于温湿度传感器及其控制系统是20世纪90年代才兴起的行业,因此利用温湿度传感器设计一款将度高、稳定性好、成本低的温湿度检测器有一定的市场前景。此单片机课程设计采用具有高精度,防干扰等优点的传感器,结合单片机技术,设计完成的温湿度检测器具有易携带、低功率等特点。克服了传统温湿度检测器需要校准的过程和精度较低的缺点。
2 设计要求 (1)模拟单总线协议与DTH11进行通信;
(2)LCD1602第一行显示检测的温度值:Temperature 22℃
(3)LCD1602第二行显示检测的湿度值:Humidity 75%RH
3 方案设计温湿度检测器的组成部分:
附录B 系统主程序
- #include<reg52.h>#include<intrins.h>//****************************************************
- //***********************定义区***********************
- //****************************************************#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) //读数据 Read_Busy(); LCD1602_RS= 1; LCD1602_RW= 0; LCD1602_DB = dat; LCD1602_EN= 1; LCD1602_EN= 0;}
- //*****************************************************//*********************定义显示函数********************//*****************************************************
- 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用来写数据}
- void LcdShowStr(unsigned char x,unsigned chary,unsigned char *str) //显示字符串{ LcdSetCursor(x,y); //当前字符坐标 while(*str!= '\0') { Write_Data(*str++); }}
- //************************************************
- //**********************延时函数******************
- //*************************************************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数据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;}}
- //****************************************************
- //***************将检测到的数据显示模块***************
- //****************************************************
- 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);} //*****************************************************
- //********************主函数***************************
- //*****************************************************
- void main(){tem=0;hum=0;delay_ms(1000); InitLcd1602();while(1){ DTH11_DUSHU();Display_DTH11();delay_ms(1000);}
- }
复制代码 |