设计思路温湿度采集传感器:DHT11实物图与单片机连接图DHT11时序主机发送请求信号从机发送应答信号位数据“0”的格式位数据“1”的格式温湿度显示:LCD1602引脚LCD_1602初始化一些重要指令:0x38设置16*2显示,5*7点阵,8位数据接口0x01清屏0x0F开显示,显示光标,光标闪烁0x08只开显示0x0e开显示,显示光标,光标不闪烁0x0c开显示,不显示光标0x06地址加1,当写入数据的时候光标右移0x02地址计数器AC=0;(此时地址为0x80)光标归原点,但是DDRAM中断内容不变0x18光标和显示一起向左移动1602读写时序图总电路图程序如下:#include#includetypedefunsignedcharuchar;typedefunsignedintunint;unsignedcharstr1[]={""};unsignedcharstr2[]={""};unsignedcharcodedis1[]={"TRHRH:"};unsignedcharcodedis2[]={"TRHT:"};sbitTRH=P2^7;//温湿度传感器DHT11数据接入sbitLCD_RS=P2^3;sbitLCD_RW=P2^4;sbitLCD_EN=P2^5;sbitjiare=P1^4;sbitjiangwen=P1^5;sbitzengshi=P1^6sbitjiangshi=P1^7;ucharTH_data,TL_data,RH_data,RL_data,CK_data;ucharTH_temp,TL_temp,RH_temp,RL_temp,CK_temp;ucharcom_data,untemp,temp;ucharrespond;voiddelayNOP(){_nop_();_nop_();_nop_();_nop_();}voiddelay_us()//5us级延时程序{uchari;i--;i--;i--;i--;i--;i--;}voiddelay_ms(unsignedcharms)//毫秒级延时子程序{unsignedchari;while(ms--){for(i=0;i<150;i++){_nop_();_nop_();_nop_();_nop_();}}}•//测试LCD忙碌状态lcd_busy()为1时,忙,等待。lcd_busy()为0时,闲,可写指令与数据。•bitlcd_busy()•{•bitresult;•LCD_RS=0;•LCD_RW=1;•LCD_EN=1;•delayNOP();•result=(bit)(P0&0x80);•LCD_EN=0;•return(result);•}//写入指令数据到LCDvoidlcd_wcmd(unsignedcharcmd){while(lcd_busy());LCD_RS=0;LCD_RW=0;LCD_EN=0;_nop_();_nop_();P0=cmd;delayNOP();LCD_EN=1;delayNOP();LCD_EN=0;}•//写显示数据到LCD:RS=高电平,RW=低电平,E=高脉冲,D0-D7=数据。•voidlcd_wdata(unsignedchardat)•{•while(lcd_busy());•LCD_RS=1;•LCD_RW=0;•LCD_EN=0;•P0=dat;•delayNOP();•LCD_EN=1;•delayNOP();•LCD_EN=0;•}•//LCD初始化设定•voidlcd_init()•{•delay_ms(15);•lcd_wcmd(0x38);//16*2显示,5*7点阵,8位数据•delay_ms(5);•lcd_wcmd(0x0c);//显示开,关光标•delay_ms(5);•lcd_wcmd(0x06);//移动光标•delay_ms(5);•lcd_wcmd(0x01);//清除LCD的显示内容•delay_ms(5);•}•//设定LCD显示位置•voidlcd_dis_pos(unsignedcharpos)•{•lcd_wcmd(pos|0x80);//数据指针=80+地址变量•}•//收发信号检测,数据读取•charreceive()•{•uchari;•com_data=0;•for(i=0;i<=7;i++)•{•respond=2;•while((!TRH)&&respond++);•delay_us();•delay_us();•delay_us();•if(TRH)•{•temp=1;•respond=2;•while((TRH)&&respond++);•}•else•temp=0;•com_data<<=1;•com_data|=temp;•}•return(com_data);•}•//读取温湿度子程序•voidread_TRH()•{•TRH=0;•delay_ms(18);•TRH=1;•delay_us();•delay_us();•delay_us();•delay_us();•if(!TRH)•{•respond=2;•while((!TRH)&&respond++);•respond=2;•while(TRH&&respond++);//数据接收状态•RH_temp=receive();•RL_temp=receive();•TH_temp=receive();•TL_temp=receive();•CK_temp=receive();•TRH=1;//数据校验untemp=(RH_temp+RL_temp+TH_temp+TL_temp);if(untemp==CK_temp){RH_data=RH_temp;RL_data=RL_temp;TH_data=TH_temp;TL_data=TL_temp;CK_data=CK_temp;}}str1[0]=(char)(0X30+RH_data/10);str1[1]=(char)(0X30+RH_data%10);str1[2]=0x2e;//小数点str1[3]=(char)(0X30+RL_data/10);str1[5]=0X25;//"%"str1[6]=0X52;//"R"str1[7]=0X48;//"H"str2[0]=(char)(0X30+TH_data/10);str2[1]=(char)(0X30+TH_data%10);str2[2]=0x2e;//小数点str2[3]=(char)(0X30+TL_data/10);str2[5]=0X27;//"'"str2[6]=0X43;//"C"}•主程序•voidmain()•{•unsignedchari,n=0x40,m;•lcd_init();•delay_us();•while(1)•{•read_TRH();•for(i=0;i<=7;i++)•{•lcd_dis_pos(i);//显示字符•lcd_wdata(dis1[i]);•lcd_dis_pos(n+i);//显示字符•lcd_wdata(dis2[i]);•}//写湿度数据•m=0x08;•for(i=0;i<=7;i++)•{•lcd_dis_pos(m);•lcd_wdata(str1[i]);•m++;•}•//写温度数据•m=0x48;•for(i=0;i<=7;i++)•{•lcd_dis_pos(m);•lcd_wdata(str2[i]);•m++;•}