使用STM8驱动温湿度传感器DHT11的代码实现

发布者:JoyfulMelody最新更新时间:2020-08-19 来源: eefocus关键字:STM8  温湿度传感器  DHT11 手机看文章 扫描二维码
随时随地手机看文章

最近希望恢复性学习一下 STM8 的相关知识,于是我选择了从头开始写温湿度传感器 DHT11 驱动代码的方式。其中遇到一些问题,也有一些收获,希望会帮助到遇到类似问题的朋友,也希望不足之处得到大家的指导。

 

首先介绍一下 DHT11 的必要知识


一 复位时序 以及 数据时序

 

 

下面是数据时序

 

 

 

此外,根据数据手册得知,一次通信需要的时间是 3 毫秒左右,这很重要,在后面的 BUG 分析环节会说到

 

二 贴上关键代码以及分析

// 复位 DHT11

voidDHT11_RST()

{

TIM4_CR1=0x00;// 关闭定时器

TIM4_CNTR=0;// 保证下次的第一个数据位的准确

DATA_SET;//ODR 设置为 1

DATA_OUT();// 推挽输出模式,此时输出高电平

DATA_CLR;// 此时处于主机输出模式,总线拉低

TIM2_Delayus(20000);// 拉低 20 毫秒

DATA_SET;// 释放总线

TIM2_Delayus(40);// 释放总线以后等待 40 微秒 DHT 会发出响应信号

}

// 检测 DHT11 是否响应

ucharDHT11_CHECK()

{

if(!DATA_GET)// 如果顺利拉低,就说明有了响应

{

while((!DATA_GET)&&(outline《100))// 先是低电平

{

TIM2_Delayus(1);

}

if(outline》90)// 起始信号超时退出

return0;

outline=0;

while((DATA_GET)&&(outline《100))// 接着是高电平

{

TIM2_Delayus(1);

}

if(outline《90)

TIM4_CR1=0x81;// 立刻打开定时器开始计时第一个数据位

else

return0;

DATA_IN();// 引脚设置为外部中断模式

outline=0;

return1;// 一切成功返回 1

}

else

return0;

}

#pragmavector=0x05//PA 的中断向量位

__interruptvoidGPIOA_IRQHandler()

{

datatime=TIM4_CNTR;// 获取两次下降沿之间的数据宽度

TIM4_CNTR=0;// 清零,再次获取下一位

datareg《《=1;// 高位先出,左移操作

if((datatime》75)&&(datatime《85))// 数据 0 我就默认高位开始获取了

datareg&=0xfe;

if((datatime》120)&&(datatime《130))// 数据 1

datareg|=0x01;

if(datanum==7)

dataall[0]=datareg;// 获取第一个字节也就是湿度整数位

if(datanum==23)// 获取第三个字节也就是温度整数位

dataall[1]=datareg;

if(datanum==39)// 获取第五个字节也就是校验(温度+湿度)位

dataall[2]=datareg;

datanum++;// 每次读取一位进 1

if(datanum》=40)// 数据接收完了结束

datanum=0;

}

 

三 总结以及 BUG 分析

总的来说 这是一款使用起来非常简单的传感器,但是作为菜鸟的我依旧是遇到了好多的问题

 

BUG 1 Q: 复位完毕以后,DHT11 拉低总线然后再度拉高之后就不再拉低,不出数据

 

A: 因为在之前的程序中,我喜欢在 DHT 拉低以后用串口发送一个“0 FINISH”来标记 DHT 的引脚响应情况,而且这样也显得很叼。可是之前说过了,一次 DHT 的数据通信大概就 3 毫秒,可是你知道串口发送字符串是一件多么努力而且费时间的事情吗,你把人家 DHT 最好的年华都错过了啊,当你再次读取高电平的时候,对不起,这已经是数据通信结束的事情了。所以,单总线时序中不要加入一些影响读取时序的代码。

 

BUG 2 Q:用下降沿获取数据位数的时候,发现触发非常多,而且无论如何修改触发方式都无法改变这一现状

 

A:这里要说到一个之前不知道的小知识,EXTI_CR 寄存器只有在总中断关闭的是时候才可以修改,所以之前一直无法修改,默认的进行了下降沿以及低电平触发的方式。当然失败了。至于其他寄存器是不是也这样就不得而知了。在之后的学习中会慢慢记住的。

关键字:STM8  温湿度传感器  DHT11 引用地址:使用STM8驱动温湿度传感器DHT11的代码实现

上一篇:stm8s的assert_param()的说明
下一篇:STM8的数据@near@tiny定义

推荐阅读最新更新时间:2024-11-07 14:25

基于C8051F410的am2305温湿度传感器的驱动编写
这个和那个DHT11差不多,精度稍高一点,价格相差十倍呢。程序很有改进,中间如果连线出问题则会自动恢复。 直接上程序吧。 #include C8051F410.h // SFR declarations #include stdio.h #define SYSCLK 24500000 // SYSCLK frequency in Hz #define BAUDRATE 9600 // Baud rate of UART in bps #define WAIT 50000 sbit led1 = P2^1; sbit led2 = P2^3; sbit dht_dat
[单片机]
STM8 如何实现主时钟输出功能
下面我就以 STM8S103K 为例讲一下使用STM8的主时钟输出功能。 一: 我们先要打开 STM8的 程序烧写软件 STVP ,选择相应的芯片。 二:如果我们要修改选项字节,也叫就是修改 OPTION BYTE,所以在主窗体下面的三个复选框中选择OPTION BYTE 选项,点击过后的显示界面如下: 三: 我们要对上衣个界面的一些选项进行调整 1 :ROP 选项 ,2 是 ARP5 ,这两个选项在上一个界面上都能找到到,修改过后的界面如下。 注意上面个红圈标记的两处就是我们需要修改过后的模式。 四:下面我们要把修改过的 OPTION BYTE 下载到我们的 STM8 的芯片中。 五:当上一步提示下载成功
[单片机]
<font color='red'>STM8</font> 如何实现主时钟输出功能
IAR开发STM8字体异常问题解决
在使用IAR开发STM8时发现,在设置完字体后,有的文件的字体的正常的,而有的文件的字体则是异常的,为此,一直感觉不爽,最近终于通过网络,参考网友的设置修正了这一问题: 字体异常 字体正常 解决问题很简单,通过对IAR进行重新设置,并重启IAR即可解决,Tools- Options...进入菜单设置,具体的设置如下图所示: 记住,先要设置字体,字体设置完后,在设置上图,设置完后需要重启IAR,即可正常。
[单片机]
IAR开发<font color='red'>STM8</font>字体异常问题解决
以太网温湿度传感器选型经验
目前市场上出现了多种以太网温湿度传感器,鱼龙混杂,良莠不齐,好像以太网接口 温湿度传感器就是以太网温湿度传感器,单看宣传页技术指标参数,好像都差不多,给工程师带来选择上的困惑,到底该选择哪种类型的传感器呢??笔者根据实际测试,现场了解等方面总结了以下几点来进行选择,供各位工程师参考: 1、专业,看一家公司是否专业,要看这家公司在该行业的地位以及设备是否先进,技术领域上是否有所建树,公司的成立时间也是一个考察标准,毕竟成立的时间长,经验和技术上都比较成熟。 湿度测量不单纯是一个技术问题,作为电子技术和物理化学专业的复合技术,经验非常重要的,无知者无畏,并不是所有电子工程师都了解这一点,特别是生产工艺的设计。做出产品和生产出产
[嵌入式]
stm8下载程序(使用ST-LINK下载器和STVP下载软件)
首先要说下为什么要建立烧写工程呢- -原因只有一个。因为你不可能将源码工程交给别人去帮你烧程序。 - -然后要吐槽下ST官方的IDE。真的。用得我极度不爽。所以后来转战IAR。结果发现IAR没法批量生产- -因为IAR少程序貌似一定要在工程下。不能直接将HEX文件烧写进板子里。所以最后还是要用STVP来批量烧。 首先要准备好你的烧写文件。HEX或者S19。文件。(用IAR或者STVD生成的,前提必须保证你程序没问题- -这个肯定不用说)。 第一步:然后打开STVP 打开之后是这样的 第二步:点击OPTION BYTE 。ROP ON。这个是每次烧写完将FLASH锁住。以免别人读你的IC。 还有如果你晶振是24M
[单片机]
<font color='red'>stm8</font>下载程序(使用ST-LINK下载器和STVP下载软件)
(八) stm8程序段定位,理解lkf文件
要修改.lkf 文件。 ST 有个中文文档: 如何基于STM8S系列MCU进行项目开发 当“Auto”选择框被勾选时,.lkf文件会自动生成在项目主目录下的 debug/ 和 release/ 目录中。下面以上图所示 io_test Project的 lkf 文件为例,来进一步理解.lkf 。在.lkf中,以“#”开头的行是注释行,为方便用户理解,将原注释删除,代之以中文注释如下: # 定义(+seg)一个常量段(.const),开始(b)于0x8080,最大分配(m)0x1ff80个字节(即不超过# 0x27FFF),为该段起名(n)为.const(和常量段的保留字同名),需要初始化的变量的初始值存# 放于此段(-it) +
[单片机]
IAR for stm8安装破解
1.下载安装包和注册机 链接:https://pan.baidu.com/s/1maBEtoyps2HhcdGYxmZUcA 提取码:31dn 复制这段内容后打开百度网盘手机App,操作更方便哦 百度云下载下来 这个样子: 2.双点击EWSTM8-3104-Autorun安装 同意,下一步到结束 。。。 中间会装几个驱动,装就是了 装完退出,打完收工 3. 注册 IAR for STM8是一个收费的软件,官方严厉打击盗版,若你是商业用途,建议购买正版软件。当然,我这里是针对个人开发学习的朋友而言,进行非商业用途的使用。 3.1 打开上面安装好的IAR for STM8软件(没有创建桌面快捷方式,可以从开始菜
[单片机]
IAR for <font color='red'>stm8</font>安装破解
关于STM8上电复位和掉电复位 以及工作电压
STM8S 为双电源MCU,外设工作电压为3V-5.5V,内核工作电压为1.8V。因MCU内部 已集成1.8V低功耗电压(LPVR)调节器,MCU工作仅需要 提供一个供电电源。 POR - Power -On Reset 上电复位 POR的功能是在VDD电压由低向高上升越过规定的阀值(VIT+)之前,保持 芯片复位,当越过这个阀值(VIT+)后的一小段时间后(Reset temporition) 结束复位开始取复位向量执行指令。 BOR - Brown Out Reset 掉电复位 在VDD 电压由高向低下降越过规定的阀值(VIT-)后,将在芯片内部产生复位。 芯片的复位地址指向0x6000(内部Bootloader)存
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved