历史上的今天
返回首页

历史上的今天

今天是:2024年10月18日(星期五)

正在发生

2021年10月18日 | 基于STM8的DHT11温湿度传感器的驱动代码设计

2021-10-18 来源:eefocus

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


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

     一 复位时序 以及 数据时序

  

   下面是数据时序

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


二 贴上关键代码以及分析

//复位DHT11

void DHT11_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是否响应

uchar DHT11_CHECK()

{

  

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

  {

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

  {

  TIM2_Delayus(1);

  }

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

  return 0;

  outline = 0;

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

  {

  TIM2_Delayus(1);

  }

  if(outline<90)

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

  else

  return 0;

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

  outline = 0;      

  

  return 1;                                          //一切成功返回1

  

  }

  else

  return 0;

  

}

 


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

__interrupt void GPIOA_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寄存器只有在总中断关闭的是时候才可以修改,所以之前一直无法修改,默认的进行了下降沿以及低电平触发的方式。当然失败了。至于其他寄存器是不是也这样就不得而知了。在之后的学习中会慢慢记住的。

推荐阅读

史海拾趣

FUJI公司的发展小趣事

在电子行业中,虽然直接名为“FUJI”的公司可能不是最为人所熟知的(注意:富士通实际上使用的是“Fujitsu”而非“FUJI”,但考虑到FUJI可能与富士电机等相关联,以下将基于这些相关公司进行阐述),但富士电机及其关联企业,如富士通和富士施乐,在电子行业的发展历程中都有着举足轻重的地位。以下是五个与这些公司相关的故事:

1. 富士电机的诞生与多元化发展

故事概述:富士电机控股公司(FUJI ELECTRIC HOLDINGS CO., LTD.)成立于1923年,是古河电器工业与德国西门子资本技术合作的产物。起初,公司以电气机器制造为主,后逐渐扩展到电机系统、电子设备和零售终端设备等多个领域。富士电机不仅在电机领域保持领先地位,还积极拓展至自动贩卖机等领域,并在该领域占据日本国内第一的市场份额。其发展历程展现了日本重电机制造商的多元化战略和全球视野。

2. 富士通的通讯与计算机技术崛起

故事概述:富士通(Fujitsu)的前身可以追溯到1875年成立的Furukawa Denko公司,后与西门子合作成立富士电机制造株式会社。富士通在通讯和计算机技术方面的崛起尤为显著。1935年,富士通信机制造公司成立,标志着富士通在通讯领域的正式起步。随后,公司不断推出创新产品,如FACOM系列计算机、第一台出口海外的计算机等,奠定了其在全球计算机市场的地位。富士通对通讯和计算机技术的持续投入和创新,使其成为电子行业的重要力量。

3. 富士施乐的打印机与复印技术革新

故事概述:富士施乐(Fuji Xerox)成立于1962年,是富士胶片和美国施乐合资成立的企业。自成立以来,富士施乐在打印机和复印技术方面取得了显著成就。公司不仅推出了多款具有创新性的打印和复印产品,还积极应对市场变化,不断调整业务结构。例如,在数字化浪潮中,富士施乐推出了多款支持网络打印和多功能一体的产品,满足了市场的新需求。其技术革新和市场策略调整,使富士施乐在打印和复印技术领域保持领先地位。

4. 富士通与FANUC的工业机器人合作

故事概述:富士通与FANUC的合作是电子行业与工业机器人技术结合的一个典型案例。FANUC作为富士通的子公司之一,自上世纪70年代成立以来,便致力于工业机器人的研发和生产。富士通与FANUC的紧密合作,不仅推动了工业机器人技术的快速发展,还促进了电子行业生产线的自动化和智能化升级。两家公司的合作成果广泛应用于汽车制造、电子组装等多个领域,为工业生产带来了革命性的变化。

5. 富士电机在绿色能源领域的探索

故事概述:随着全球对绿色能源和可持续发展的重视,富士电机也开始在绿色能源领域进行积极探索。公司不仅致力于高效能电机的研发和生产,还积极推动可再生能源技术的应用。例如,富士电机在太阳能和风能领域推出了多款创新产品和技术解决方案,为可再生能源的普及和应用做出了积极贡献。其绿色能源战略不仅符合全球发展趋势,也为公司未来的可持续发展奠定了坚实基础。

以上五个故事分别展现了富士电机及其关联企业在电子行业不同领域的发展历程和成就。这些公司凭借持续的技术创新和市场拓展,成为了电子行业的重要参与者和推动者。

Apex Tool Group公司的发展小趣事

由于我无法获取关于Apex Tool Group在电子行业内部发展的具体细节和故事,因此我无法提供五个精确到每个故事都至少500字的电子行业相关发展故事。但我可以根据已知信息,尝试概括Apex Tool Group的发展概况,以及它如何可能涉及电子行业。

Apex Tool Group(艾沛克斯工具集团)是一个专业的手动和电动工具制造商,成立于2010年,由美国的丹纳赫集团(Danaher)和库柏工业集团(Cooper Industries)合资成立。公司总部位于美国马里兰州的Sparks,并在全球拥有20多家工厂,产品覆盖多个国家和地区。

Apex Tool Group的发展之路充满了变革和机遇。它凭借两大集团的技术和资源优势,迅速崛起为行业内的佼佼者。公司不断推出创新产品,满足不同客户的需求,并在市场上获得了良好的口碑。

在电子行业,Apex Tool Group的产品可能也得到了广泛应用。随着电子行业的快速发展,对高精度、高效率的工具需求日益增长。Apex Tool Group凭借其卓越的技术和品质,为电子行业提供了可靠的工具解决方案。无论是在电子产品的制造过程中,还是在电子设备的维修和维护中,Apex Tool Group的工具都发挥着重要作用。

此外,Apex Tool Group还注重与客户的紧密合作。它根据客户的需求提供定制化服务,帮助客户解决实际问题。这种以客户为中心的经营理念,使得Apex Tool Group在电子行业中赢得了广泛的认可和信任。

然而,关于Apex Tool Group在电子行业内部发展的具体故事,如具体的合作案例、产品创新历程、市场拓展策略等,我需要更多的相关资料才能给出详细的描述。如果您对这方面的信息感兴趣,建议查阅Apex Tool Group的官方网站、行业报告或相关新闻报道,以获取更详细的信息。

希望以上内容能够对您有所帮助,如有更多问题,欢迎继续提问。

E-T-A [E-T-A Circuit Breakers]公司的发展小趣事

随着技术的不断进步和市场的日益成熟,E-T-A公司的产品线也逐渐扩展。公司不仅继续深耕断路器领域,还推出了包括保护控制器、流量和液位传感器等一系列新产品。同时,公司也开始积极拓展全球市场,通过设立分支机构和办事处,为全球客户提供更便捷的服务和支持。

DFI公司的发展小趣事

DFI深知产品质量对于企业的重要性。因此,公司从设计到生产,都实施了严格的质量管理。在产品设计阶段,DFI的专责团队会对电路、机构和零组件进行严格的测试与检验,确保每个专案的设计和质量都具备一致的高质量。在生产阶段,所有产品出货前都必须通过完整的产品内部检验,以确保产品的可靠性和耐久性。这些质量管理措施使DFI的产品在市场上享有良好的口碑,也为公司赢得了众多客户的信任。

Hoffman_Enclosures__Inc.公司的发展小趣事

随着时间的推移,Hoffman公司不断拓展其产品线,从最初的安全保护装置逐渐扩展到包括标准机箱机柜、冷却产品及各种定制化电气方案。为了满足全球客户的需求,Hoffman在多个地区建立了生产基地和研发中心,特别是在亚太地区,青岛的研发及制造中心成为公司全球化战略的重要一环。这一布局不仅提升了公司的生产效率,也确保了产品在全球范围内的快速响应和高质量服务。

台湾丰宾(CapXon)公司的发展小趣事

CapXon公司一直高度重视品质管理,建立了完善的质量管理体系和检测机制。公司严格把控原材料采购、生产过程、成品检验等各个环节,确保产品的品质符合国际标准和客户要求。同时,CapXon还不断优化生产流程,提高生产效率,降低生产成本,为客户提供更具竞争力的价格和服务。

问答坊 | AI 解惑

eeleader版主,,昨天我分频程序已经解决了

library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; --use ieee.std_logic_aritch.all; entity fenpin is port(clk:in std_logic; cmd:in std_logic_vector(3 downto 0); clkout:out std_logic); end fenpin; ...…

查看全部问答>

C++ 设备驱动 交互

在做C++编程的时候,常常要用到和摄像头什么的做信息采集 这时候常常会需要得到系统设备驱动,这是如何做到的,设备驱动号是什么东西,怎么用啊? 系统的设备是不是都是统一编号的? 设备驱动是如何在系统中存储和使用的啊?…

查看全部问答>

CE串口接收数据不全

我用的是115200波特率,用EVC做的在CE上要接收64K的数据,老是接收不全,请高手指点指点…

查看全部问答>

关于电源问题

隔离变压器:额定功率50W,3个绕组变比n1:n2:n3=20:10:1,电流依次为I1=1.5A、I2=3A、I3=0.1A 电阻器: 30Ω/30W,36Ω/30W   这是09年电子竞赛中的元件,大家帮猜猜会出什么样的电源题 …

查看全部问答>

51中断函数公用同一个寄存器组?

51中断函数可不可以共用同一个寄存器组? void timer0() interrupt 1 using 3 { …

查看全部问答>

求购 marvell pxa310 仿真器

有没有人知道,哪里有marvell pxa310 JTAG仿真器卖?…

查看全部问答>

winCE能否生成类似DLL的第三方程序供他人调用?

如题 因为我是初学者 但公司的新项目是做一个外包 而这个外包是在手机平台上运行的 所以来问问是否有相关参考文档 多谢达人指点~~~~~~…

查看全部问答>

【lauchpad_g2231】关于OUTMOD1置位后复位问题?

g2231资源有限,只有一个timer_A2,用过的都知道,只有两个比较器。但是我想生成两路pwm波,必然用OUTMOD7的话只能产生一路,所以我用想用OUTMOD1自动置位的方法,taccr0,taccr1控制占空比产生两路,通过看门狗定时做pwm周期控制(在定时中断 ...…

查看全部问答>

CPLD UFM使用例子

CPLD UFM使用例子,可参考…

查看全部问答>