使用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-20 10:30

STM8 AD转换
系统功能 大部分STM8内部带有AD,本节以使用STM8S105的内部AD为例,给出AD转换中断程序。    硬件设计 AD转换值低位,LED控制电路原理图 AD转换值高位,LED控制电路原理图 软件设计 /********************************************************************* 目标系统: 基于STM8单片机 应用软件: Cosmic CxSTM8 *********************************************************************/ #include stm8s207s8.h v
[单片机]
<font color='red'>STM8</font> AD转换
IAR开发STM8字体异常问题解决
在使用IAR开发STM8时发现,在设置完字体后,有的文件的字体的正常的,而有的文件的字体则是异常的,为此,一直感觉不爽,最近终于通过网络,参考网友的设置修正了这一问题: 字体异常 字体正常 解决问题很简单,通过对IAR进行重新设置,并重启IAR即可解决,Tools- Options...进入菜单设置,具体的设置如下图所示: 记住,先要设置字体,字体设置完后,在设置上图,设置完后需要重启IAR,即可正常。
[单片机]
IAR开发<font color='red'>STM8</font>字体异常问题解决
STM8 入门学习与实验(一)GPIO与UART
简介:这一章节将描述如何配置GPIO,以及如何配置UART STM8工程模版:http://download.csdn.net/detail/u012388993/9904051 这两则实验将使用到的基本的系统配置初始化函数 CLK_PeripheralClockConfig(CLK_PERIPHERAL_UART1, ENABLE);//配置UART1时钟 CLK_SYSCLKConfig(CLK_PRESCALER_HSIDIV1);配置时钟分频为1,则系统时钟频率为16Mhz/1 = 16Mhz CLK_HSICmd(ENABLE);//使能内部振荡器 实验一、点亮LED灯,灯正极接电源负极连接到引
[单片机]
<font color='red'>STM8</font> 入门学习与实验(一)GPIO与UART
基于AVR单片机的多通道温湿度传感器检定系统
随着地面自动气象站的投入业务使用,山东省的大监自动气象站和区域自动气象站已经建成1 500多个,使我省的业务水平大幅提高,随着业务量增加的同时,也给计量检定工作能力提出了新的要求。但近些年来温湿度传感器的检定很大程度上仍停留在人工检定阶段。这种检定方法耗时、检定效率低,因此迫切设计出一套自动检定温湿度传感器的系统,为了改善这种状况,在VC 6.0环境下使用MSComm通信控件和数据库技术,开发了自动站温湿度传感器数据采集及处理系统,实现8路温湿传感器的数据批量采集,用以提高温湿度传感器的检定效率和准确度。 1 系统的整体结构及功能描述 该设计以AVR单片机和高精度A/D转换芯片ADS1232为核心,能对温湿度传感器进行检定。
[单片机]
基于AVR单片机的多通道<font color='red'>温湿度</font><font color='red'>传感器</font>检定系统
stm8的IIC库的使用
一.前言 stm8是一款低功耗的MCU芯片,它具备stm32库函数和资源丰富的优势。也同时具有价格便宜,低功耗的特点。在一些项目中,能起到很好的作用。下面我介绍一下stm8的IIC硬件库函数驱动代码及实现。 二.IIC基本操作 iic基本操作分为读操作和写操作,这两个操作就可以对设备进行一些基本的操作了。还要知道设备的地址就ok了,具体的IIC时序大家可以上网看看。 三.实现代码 1.先要启动IIC的时钟,保证可以正常工作。 CLK_PeripheralClockConfig (CLK_Peripheral_I2C1,ENABLE);//开启IIC1时钟 2.再对IIC进行初始化的操作 void Init(void
[单片机]
STM8 单工通信
STM8 单工通信 SPI能够以两种配置工作于单工方式: 1条时钟线和1条双向数据线 1条时钟线和1条数据线(双工或接收方式) 1条时钟线和1条双向数据线 设置SPI_CR2寄存器中的BDM位启用此模式。在这个模式中,SCK用作时钟,主模式中的MOSI或从模式中的MISO用作数据通信。 传输的方向(输入或输出)由SPI_CR2寄存器里的BDOE控制,当这个位是1的时候,数据线是输出,否则是输入。 1条时钟和1条数据线(双工或只接收方式) 为了释放一根I/O脚作为它用,可以通过设置SPI_CR2寄存器中的RXONLY位来禁止SPI输出功能。这样的话,SPI将运行于只接收模式。当RXONLY位置0时,SPI又会恢复到全
[单片机]
STM8 GPIO输入输出模式
悬浮输入 悬浮输入,也叫浮空输入,顾名思义,即引脚悬空。这种方式的输入阻抗很高。当悬浮输入的引脚上加上信号时,单片机所得到的信号并不确定是高电平或是低电平,是一个不确定的信号。悬浮输入的典型应用就是模数转换,外部的任何一个小信号都要经过A/D采样转换为数字信号。 上拉输入 上拉就是把电位拉高,比如拉到Vcc。上拉就是将不确定的信号通过一个电阻嵌位在高电平!电阻同时起限流作用!强弱只是上拉电阻的阻值不同。 上拉输入最典型的应用就是外部按键,当按键未按下时,我们要保证它是高电平,当按键按下时才被拉低。 推挽输出 推挽输出(Push-pull output),也称为互补输出,推拉式输出。推挽输出模式导通损耗小,效率高。在此
[单片机]
<font color='red'>STM8</font> GPIO输入输出模式
如何在STM8微控制器上使用GPIO
原理图 通用设计 使用PIC和AVR器件时,您通常需要获取该特定器件的数据表,并了解如何使用外设。有时,一个PIC上的外设可能与另一个PIC上的外设不同,因此不能简单地将代码从一个PIC复制并粘贴到另一个PIC。但是,STM8完全不同,因为所有STM8设备都使用通用布局而不是具有唯一配置。这意味着为一个STM8设计的代码可以直接复制并粘贴到不同的控制器,它仍然可以工作(假设新设备具有所需的外设)。 一个典型的例子是UART外设。 STM8器件最多可以有三个UART端口(1,2和3),一个STM8器件上的UART1与另一个STM8器件上的UART1相同。但是,各个STM8器件的数据表中没有太多关于如何使用外设的信息,因此在使
[单片机]
如何在<font color='red'>STM8</font>微控制器上使用GPIO
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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