(单片机)显示温湿度程序

2019-04-15 18:31发布

* 【实验平台】: QX-MINI51 单片机开发版 * 【外部晶振】: 11.0592mhz * 【主控芯片】: STC89C52 * 【显示器    】: 1602 * 【传感器    】: DHT11 * 【编译环境】: Keil μVisio3 * 【程序功能】: DHT11  第三脚悬空    DHT11孔面面向开发板外                     * 【使用说明】:  *  说明:免费开源,不提供源代码分析.
**********************************************************************************/ // 湿度20-90 温度0-50 采样间隔1S #include #include "lcd.h" sbit DQ=P3^7; //DTH11 uchar code ASCII[]="0123456789%c"; uchar code table0[]=" Hum:00"; uchar code table1[]=" Tem:00"; uchar tem; uchar hum; display0[2]={0,0}; display1[2]={0,0}; //**************************延时函数 void delay_ms(uint z) { uint x,y; for(x=z;x>0;x--) for(y=114;y>0;y--); } //**************************初始化DTH11 bit Init_DTH11() { bit flag; uchar num; DQ=0; delay_ms(19); // >18ms DQ=1; for(num=0;num<10;num++); // 20-40us 34.7us for(num=0;num<12;num++); flag=DQ; for(num=0;num<11;num++); //DTH响应80us for(num=0;num<24;num++); //DTH拉高80us 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|=0x00; else byte|=0x01; } return byte; } //******************************读取DTH11温度和湿度 void DTH11_DUSHU() { uchar num; if(Init_DTH11()==0) { hum=DTH11_RD_CHAR(); //比正常值高7度左右 DTH11_RD_CHAR(); tem=DTH11_RD_CHAR(); DTH11_RD_CHAR(); DTH11_RD_CHAR(); for(num=0;num<17;num++); //最后BIT输出后拉低总线50us DQ=1; } } //***********************************显示函数 void Display_DTH11() { display0[1]=hum/10%10; display0[0]=hum%10; LcdShowStr(0, 0, table0); DisplayOneChar (8, 0, ASCII[ display0[1] ] ); DisplayOneChar (9, 0, ASCII[ display0[0] ] ); DisplayOneChar (10, 0, ASCII[10] ); //显示湿度 display1[1]=tem/10%10; display1[0]=tem%10; LcdShowStr(0, 1, table1); DisplayOneChar (8, 1, ASCII[ display1[1] ] ); DisplayOneChar (9, 1, ASCII[ display1[0] ] ); DisplayOneChar (10, 1, 0xdf ); DisplayOneChar (11, 1, ASCII[11] ); //显示温度 } //*******************************主函数 main() { tem=0; hum=0; delay_ms(1000); //DTH11开始1s有错误输出 InitLcd1602(); while(1) { DTH11_DUSHU(); Display_DTH11(); delay_ms(2000); } }