基于51单片机的DHT11温湿度系统(已调试成功,无需置疑)

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

/*系统名:基于51单片机的DHT11温湿度系统系统使用说明:通过无线蓝牙进行数据传输,上位机需通过蓝牙调试软件向系统发送命令获取信息,若要获取当前温度、湿度,则发送“?Z”即可。系统将会自动回复当前温度和湿度。注意事项:蓝牙需设置成主从模式(即通过AT命令设置蓝牙名和密码相同,再设置成主从模式)蓝牙灯同步闪烁代表蓝牙连接成功。*/#includereg51.h#includeintrins.htypedefunsignedcharBYTE;typedefunsignedintWORD;#defineuintunsignedint#defineucharunsignedchar/************辅助全局变量块*****************/chart,buf[6],buf_cnt;bitsec,flag,send_flag;/*sec:秒信号;flag:串行口接收到命令标志;send_flag:回复数据标志*//************辅助全局变量块*****************//*************DHT11变量块*******************/sbitio=P3^2;//DHT11数据端接单片机的P3^2口typedefbitBOOL;//此声明一个布尔型变量即真或假uchardata_byte;ucharRH,RL,TH,TL;//TH保存温度,RH保存湿度/*************DHT11变量块*******************///*******************************延时函数*******************************************voiddelay(ucharms){uchari;while(ms--)for(i=0;i100;i++);}voiddelay1()//一个for循环大概需要81us12MHz8us{uchari;for(i=0;i1;i++);}voiddelay1ms(chart){inti,j;for(i=0;it;i++)for(j=0;j1000;j++);}//***************************延时函数*****************************************//**************************DHT11模块*****************************************voidstart()//开始信号{io=1;delay1();io=0;delay(25);//主机把总线拉低必须大于18msDHT11能检测到起始信号io=1;//20-40usdelay1();//以下三个延时函数差不多为24usdelay1();delay1();}ucharreceive_byte()//接收一个字节//{uchari,temp;for(i=0;i8;i++)//接收8bit的数据{while(!io);//等待50us的低电平开始信号结束delay1();//26us-28usdelay1();delay1();temp=0;//时间为26us-28us'0'if(io==1)temp=1;//如果26us-28us'1'while(io);//'0'为26us-28us'1'为70usdata_byte=1;//data_byte|=temp;}returndata_byte;}voidreceive()//接收数据{ucharT_H,T_L,R_H,R_L,check,num_check,i;start();//开始信号//io=1;//DHT11if(!io)//判断从机是否有低电平响应信号//{while(!io);//判断从机发出80us的低电平响应信号是否结束//while(io);//判断从机发出80us状态R_H=receive_byte();//湿度高位R_L=receive_byte();//湿度低位T_H=receive_byte();//温度高位T_L=receive_byte();//温度低位check=receive_byte();//校验位io=0;//当最后一bit50us//for(i=0;i7;i++)//差不多50us的延时delay1();io=1;//num_check=R_H+R_L+T_H+T_L;if(num_check==check)//判断读到的四个数据之和是否与校验位相同{RH=R_H;RL=R_L;TH=T_H;TL=T_L;check=num_check;}}}//********************************DHT11模块*********************************************//********************************中断服务函数块*********************************************voidComSer()interrupt4//串行口中断服务函数(串口数据接收){if(RI){t=SBUF;buf[buf_cnt++]=t;RI=0;if(t=='Z'){flag=1;buf_cnt=0;}}}//********************************中断服务函数块*********************************************//************************串行口字符(字符串)发送块******************************************voidputchar(unsignedcharn){SBUF=n;while(!TI);TI=0;}voidputs(unsignedchar*q){while(*q)putchar(*q++);}voidEnter()//换行函数{putchar(0x0d);putchar(0x0a);}voidDispNum(unsignedcharn){unsignedchart[8]={0};t[0]=n/10+'0';t[1]=n%10+'0';t[2]=0;puts(t);Enter();}//************************串行口字符(字符串)发送块******************************************//********************************串行口请求判断块****************************************voidDill(){if(buf[0]=='?'){delay1ms(50);send_flag=1;}}//********************************串行口请求判断块*********************************************//********************************初始化函数块*********************************************voidinit_com()//寄存器初始化函数{SCON=0x50;//串行口工作方式0,多机通信,允许接收IE|=0X90;//定时器T1和总中断允许PCON=0X80;//SMOD为1TMOD|=0X21;//T1工作在方式2,T0工作在方式1TH1=250;//T1高八位赋值TR1=1;//T1打开TR0=1;//T0关闭}//********************************初始化函数块*********************************************voidmain(){init_com();while(1){receive();//读取温湿度if(send_flag){send_flag=0;puts(Wendu:);DispNum(TH);puts(Shidu:);DispNum(RH);Enter();}if(flag){flag=0;ES=0;Dill();//无线设置函数ES=1;}}}

1 / 6
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功