单片机10分钟倒计时24秒倒计时麻烦详细解释一下。下面那程序


今天给大家介绍的是一个温湿度檢测设计基于51单片机10分钟倒计时、蓝牙模块、温湿度传感器、Android APP完成。首先先展示一下设计好的实物接下来将从系统方案、硬件设计、軟件设计这三个方面来阐述。

先来看一下整体的架构图:硬件部分由STC89C52单片机10分钟倒计时、DHT11温湿度传感器、BT08蓝牙串口模块和Android手机组成传感器将采集到的温湿度数据传送给单片机10分钟倒计时,然后单片机10分钟倒计时通过蓝牙串口模块将数据发送到手机APP从而将温湿度在APP显示出來。在APP上可以设置温湿度告警的阈值超过阈值将显示“偏高”或者“偏低”的相关信息。

整个设计的原理图如下所示由单片机10分钟倒計时最小系统、蓝牙串口模块、温湿度传感器组成。传感器的DATA管脚连接单片机10分钟倒计时的P2^0口蓝牙串口模块的RXD、TXD分别连接单片机10分钟倒計时的TXD、RXD。
蓝牙串口模块的功能是串口协议和蓝牙协议之间的相互转换在单片机10分钟倒计时上自己编写一套蓝牙驱动代码是非常复杂的,借助这个模块我们在编写单片机10分钟倒计时代码时只需要编写串口收发的代码即可该模块得到串口数据后会转成蓝牙数据。对于APP它接收到的是蓝牙数据开发APP时只需要编写蓝牙相关的代码,Android封装了蓝牙相关的API所以开发起来简单。蓝牙串口模块的引脚图如下图所示在這个设计中用到了四个引脚,VCC、GND接5V电源和地蓝牙模块的TXD接单片机10分钟倒计时的RXD,RXD接TXD
DHT11温湿度传感器负责采集环境中的温湿度数据,在单爿机10分钟倒计时软件设计部分会详细的介绍该传感器的使用步骤引脚说明:
DATA 串行数据,单总线
GND 接地电源负极

单片机10分钟倒计时程序主偠是两个点,一是读取DHT11传感器的温湿度数据二是串口通信。DHT11的官方文档写的很规范有关于读取数据的详细步骤,文档更新也比较及时最新的更新日期是2017年3月31号,官网的下载地址:
DHT11采用单总线通信单总线即只有一根数据线,系统中的数据交换、控制均由单总线完成

DATA 管脚用于DHT11与单片机10分钟倒计时之间的通讯和同步,采用单总线数据格式,一次传送40 位数据高位先出。
注:其中湿度小数部分为0

通过以上兩个示例可以清楚DHT11数据格式以及数据如何去校验有效性。

用户主机(MCU)发送一次开始信号后DHT11 从低功耗模式转换到高速模式,待主机开始信号结束后DHT11 发送响应信号,送出40bit 的数据并触发一次信采集。信号发送如图所示这里的主机是指单片机10分钟倒计时,从机是指DHT11传感器

下面这个图表罗列了时序图相关的参考时间,在读取数据的详细步骤中会用到这些数值

根据时序图和表中的参考时间,我们可以得出讀取传感器数据的步骤

step1:单片机10分钟倒计时输出低电平保持20ms

step2:单片机10分钟倒计时拉高电平保持13us等待DHT11传感器的低电平响应信号

step3:判断DHT11是否給出低电平响应,如果有低电平响应则进入步骤4否则等待下一轮的尝试。

step4:通过while语句等待83us的低电平响应时间结束

step5:通过while语句等待87us的高电岼响应时间结束

step6:计算温湿度数据

step7:单片机10分钟倒计时输出高电平结束一次数据采集的读取

在时序图中可以看到数据读取是每次一位进荇的,数据0位和数据1位的低电平时间是相同的即54us。数据0位的高电平时间是24us而数据1为的高电平时间是71us,通过高电平时间的差异我们就可鉯判断出是数据0还是数据1所以单独写了一个函数用来计算数据0位和1位,由于温湿度的整数和小数部分分别是由8位表示的我们定义该函數得到8位数据之后给出返回值。步骤6对应的函数computeData() 用来完成上述工作我们对步骤6进行详细的描述:

step 6.2:延时30us判断高电平是否结束,因为数据0位的电平最大时长是27us如果超过27us之后高电平结束,则为数据0位否则为数据1位。

step 6.4:通过移位和或与的方式保存一个数据位

step 6.5:循环6.1到6.4步骤8次得到一个字节的数据

 //step2:单片机10分钟倒计时拉高电平保持13us等待DHT11传感器的低电平响应信号
 //step3:判断DHT11是否给出低电平响应,如果有低电平响应则進入步骤4否则等待下一轮的尝试。
 //step4:通过while语句等待83us的低电平响应时间结束
 //step5:通过while语句等待87us的高电平响应时间结束 
 //step6:计算温湿度数据
 //step7:单爿机10分钟倒计时输出高电平结束一次数据采集的读取
*根据时序计算温湿度值
 //step 6.4:通过移位和或与的方式保存一个数据位 
 
温湿度数据读取完毕接下来就是通过串口发送出去,串口发送数据的代码相对简单了我们在主函数中对串口通信进行初始化,然后在一个while语句中每隔2s读取數据然后发送
 //调用温湿度读取子程序
 //读取模块数据周期不易小于 2S
 
至此,单片机10分钟倒计时端的主要代码就讲解完了可以看到核心代码昰如何读取DHT11的数据。
4.手机APP软件设计
APP这种方式已经过时并且以后会被淘汰,Google在2016年底已经停止了对ADT的更新我之前所在的公司已经将Eclispe的代码铨部迁移到AS平台了,推荐使用Google自家的AS集成开发环境AS有很多优点,但是在使用时也有问题AS借助gradle进行项目构建,至于为什么Google利用gradle进行Android app项目構建读者可以自行上网搜索。gradle插件版本要和AS版本相对应不同的开发者的gradle版本可能不同,所以当你拿到另外一个开发者的代码在自己的AS運行时时有可能会构建失败这个现象对于国外开发者而言不是一个问题,AS可以自动去下载所需要的gradle插件版本但是在国内,由于众所周知的原因如果不会科学上网那么AS直接尝试下载gradle插件时会失败,会令很多初学者不知所措在以后有时间我会单独写一篇blog来讲解如何去解決这个问题。最近听到Google要重返中国市场如果能回归成功,对于国内的很多开发者和学术研究者而言是个好消息
言归正传,本设计APP的代碼主要分成两个部分一是蓝牙数据的接收,二是图表显示
 
蓝牙通信的三个基本步骤:搜索、配对、连接。这之后就可以进行数据传输叻
 
 
 
建立蓝牙通信之前需要验证是否有蓝牙设备,以及蓝牙设备是否已经开启对于一个Android系统而言只有一个蓝牙适配器,通过getDefaultAdapter()方法可以返囙其一个实例如果返回为null,则说明该设备不支持蓝牙
 
接下来是检查蓝牙设备是否已经开启,如果没有开启可以调用startActivityForResult()方法来弹出对话框让用户选择开启,这种方式不会停止当前的应用
 
 
搜索设备可以分成两部分,一是查找已经与本机配对的设备通过getBondedDevices()方法返回已经配对嘚设备信息:
 
二是搜索周围可用的但是还未配对的设备。
系统在发现蓝牙设备会通过广播的形式通知app所以在搜索设备之前需要注册广播接收器来接收发现蓝牙设备的消息,在销毁Activity时注销广播接收器
 
6.0及以上,除了在manifest中声明还需要在java代码中申请获取了该权限之后,在搜索藍牙设备时才能收到系统发出的蓝牙设备发现的广播搜索设备调用startDiscovery()方法,当周围有可用设备时系统会通过广播的形式通知应用。
 
 
在建竝连接时需要一个UUIDUUID是用来标识不同设备的ID,对于蓝牙串口设备而言其对应的UUID是“0-805F9B34FB”
 
 
确保在建立连接之前始终调用cancelDiscovery(),而且调用时无需实際检查其是否正在运行如果确实想要执行检查,请调用isDiscovering()
 

}

· TA获得超过1.1万个赞

就是到0 时再减僦是#0FFH了

作用就是R2到0 返回到LOOP1,重新从60开始

你对这个回答的评价是?


· 超过64用户采纳过TA的回答

你对这个回答的评价是

下载百度知道APP,抢鮮体验

使用百度知道APP立即抢鲜体验。你的手机镜头里或许有别人想知道的答案

}

我要回帖

更多关于 单片机10分钟倒计时 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信