学习STC51单片机28(芯片为STC89C52RCRC)
每日一言
梦想不会自动成真,需要你一步一个脚印去追逐。
硬件:DHT11温湿传感器
时序图
DHT11的供电电压为 3-5.5V。传感器上电后,要等待 1s 以越过不稳定状态在此
期间无需发送任何指令。
1:检测DHT11模块是否好用
我们将模块好用就把灯点亮,作为评判的标准,我们利用时序图来编写代码
整体思路是这样的,因为,DHT响应信号在主机拉高20us-40us后DHT就会变成低电平且保持80us,也就是这段时间DHT11就响应信号了,就可以用此证明DHT11模块我们连接上了。因为这段时间DHT是必连上的,所以我们根据时序图,可以将这一段DHT,我们设置为主机拉高后的60us的这个时间点测试,如果DHT为低电平,我们就让led亮起来,那么不就可以证明DHT11模块测试出没有问题吗
最后main函数那边开始给个1s,给上电后的模块稳定一下度过不稳定的状态
大家一定要学会看手册和看时序图
2:让DHT11传输输出数据(读取数据)我觉得都很重要
我们上一步不是只是检测一下模块吗,其实他这个代码也仅仅是检测模块的作用,如果拿来模块的开发是很不稳定的,因为我们这个时间的延时他需要精确到ns,很不稳定。那么我们该怎么做呢??
我们根据时序图继续写代码,获取数据
整个时序图(这边我标注了各个点,后面就用的到)
我们这个主机信号是自己要让单片机发出来的,后面的DHT信号是DHT11发出来的,
所以我们根据模块的特性,我们只要将主机初始化之后的dht信号,我们去检测它,只要到点了DHT11自己会做出行为(模块的信号到时间了会自动到切换dht信号的电平高低)自动会切换高低电平,这样我们可以利用这一点,我们就可以不用去添加延时,我们直接用while(dht信号)我们去卡住他
细说:
如果此时dht信号为高电平经过一段时间比如50us后下降为低电平那么我们就可以用while循环,只要dht的信号为高电平那么我就让他一直在while里面循环,只有当模块自动将dht切换到低电平的时候才会跳出循环,这样我们就可以不用添加时间延时了(不稳定),因为这样的方法就可以不用考虑时间了,到时间了自动会跳出循环,是一个很好的方法
所以叫这个方法为卡点法
卡d点 卡e点 卡f点 卡g点
代码
因为传输数据是40bit 每次8bit,所以设置的有5轮,每轮发一个bit,什么时候这个bit是1还是0呢:根据我们的时序图来看:
很简单,循环开始的时候我们先卡一下g点,因为当g点为高电平的时候才开始传输数据,根据时序图数字信号1和数字信号0的DHT信号保持的时间不一样,所以我们依据这个特性,这个时候我们可以添加延时个60us这样我们来判断一下dht是否在低电平还是高电平
如果为高电平那么就是信号1,如果是0那么就是信号0
这个信号0和1的话我们用flag记录标志位来记录
并直接就是存在tmp这个8位2进制里面了
关键点::
这个tmp = tmp << 1 是tmp向左边移1个位置(新知识点)
tmp |= flag 是将flag存放在tmp空的那个位置(最低位)
讲解一下:原理
也就是说每一轮的每8次中的每一次都会生成一个数字信号1或者0作为位,并且向左移,下一次循环继续向左移,8次后属于DHT11的1个字节就组装好了,
那么总共会执行5轮那就是5个字节
每一轮都将组装好的(8位bit)赋值到datainfo[i]这个数组里面,i就是每一轮的i,所以最后会装5个字节到datainfo[5]这个数组
那么我们的DHT11的数据就在这个数组里面了存放着了
最后main函数里面我们做一个while循环,循环调用就好了,这样数据就会循环的刷新了。