没有合适的资源?快使用搜索试试~ 我知道了~
首页常用51单片机实现DHT11和ESP8266实现温湿度数据无线传输
常用51单片机实现DHT11和ESP8266实现温湿度数据无线传输 第一篇文章 这个是我在CSDN尝试写的第一篇文章,这个项目来源是大学的大创项目,在制作的过程中,因为自己也是受到了很多来自CSDN平台的大神的支持,同时也总结了类似文章中没有提到的问题,写的有不好的和不专业的地方还希望大家多多指正,废话不多说开始吧。 DHT11模块 这个模块基本就是买上手就能知道怎么接线(就直接把三个端口对应接在单片机开发板上即可,后面需要扩展多个时候只需要重新定义数据口,要是电源线不够可以使用面包板,定义时注意别用单片机上的有特定功能的端口)。 DHT11程序部分 这个传感器的程序是我在制作整个阶段耗费时
资源详情
资源评论
资源推荐

常用常用51单片机实现单片机实现DHT11和和ESP8266实现温湿度数据无线传输实现温湿度数据无线传输
常用常用51单片机实现单片机实现DHT11和和ESP8266实现温湿度数据无线传输实现温湿度数据无线传输
第一篇文章第一篇文章
这个是我在CSDN尝试写的第一篇文章,这个项目来源是大学的大创项目,在制作的过程中,因为自己也是受到了很多来自CSDN平台的大神的支持,同时也总结了类似文章中没有
提到的问题,写的有不好的和不专业的地方还希望大家多多指正,废话不多说开始吧。
DHT11模块模块
这个模块基本就是买上手就能知道怎么接线(就直接把三个端口对应接在单片机开发板上即可,后面需要扩展多个时候只需要重新定义数据口,要是电源线不够可以使用面包板,
定定
义时注意别用单片机上的有特定功能的端口义时注意别用单片机上的有特定功能的端口
)。
DHT11程序部分程序部分
这个传感器的程序是我在制作整个阶段耗费时间最长的部分,因为刚接触这个东西的时候很多东西没有学,代码写的也很少,完全掌握这个模块的代码还是在完成了单片机与微机两
门课后。实际上现在看起来这是这个系统最简单的一份代码了。
DHT11采集数据采集数据
先要看懂时序图,关于这个时序图网上包括说明书上都有介绍这里就不啰嗦了,掌握数电和单片机之后,完全有能力掌握。
这个是开始信号,和大部分的DHT11的代码是一样的,主要还是delay-1ms要写好后面的4个1us延时可用可不用。
void start()//开始信号
{
i0=1;
delay_1us();
i0=0;
delay_1ms(20); //拉低至少 18ms 保证能检测到起始信号
i0=1; //检测到开始信号后,将电平拉高20-40us
delay_1us(); //可替换成20-40us程序
delay_1us();
delay_1us();
delay_1us();
}
这个是开始信号结束之后的代码,主要看懂recive这个函数其实说白了就是照着时序写,后面吧得到的40位输出按温湿度和校验位分开,我们主要还是用到温湿度的高八位,温湿度
的低八位我也尝试显示出来过结果都是0,所以如果是自己编写可以舍弃掉低八位数据。
这里值得注意的是校验位是不能舍弃的,舍弃掉校验位后是对最后的数据有影响的。这里值得注意的是校验位是不能舍弃的,舍弃掉校验位后是对最后的数据有影响的。
uchar receive_byte()//接收一个字节
{
uchar i,temp;
for(i=0;i<8;i++)
{
while(!i0);//等待50us的低电平开始信号结束
delay_1us(); //开始信号结束后,延时26us-28us
delay_1us();
delay_1us();
temp=0; //如果时间为26us-28us 则表示接收的数据为‘0’
if(i0==1)
temp=1;//如果时间超过26us-28us 则表示收到的数据为‘1’
while(i0);//等待数据信号高电平, ‘0’为26us-28us;‘1’为70us
data_byte<<=1;//将接收到的数据向高位左移
data_byte|=temp;
}
return data_byte;
}
void receive() //接收数据
{
uchar T_H,T_L,R_H,R_L,check,num_check;
start();//开始信号
i0=1; //主机设为输入 判断从机DHT11的响应信号
if(!i0) //判断是否有响应信号
{
while(!i0);//判断从机发出80us低电平信号是否结束
while(i0);
R_H= receive_byte();//湿度高位
R_L= receive_byte();//湿度低位
T_H= receive_byte();//温度高位
T_L= receive_byte();//温度低位
check= receive_byte();//检验位
i0=0;//当所有的数据接收完成后,将从机电平拉低50us
delay_1us(); //拉低50us
delay_1us();
delay_1us();
delay_1us();
delay_1us();
i0=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;















安全验证
文档复制为VIP权益,开通VIP直接复制

评论0