原创 DHT21(AM2301) 数字温湿度传感器在stm32F0和stm8s105的移植

2016-1-5 17:16 4992 16 22 分类: MCU/ 嵌入式

     写在之后:排版有些混乱,见谅哈。转载请注明出处。

     写在之后的之后: 我再放几张实物图哈哈,由于我之前在STM32F0移植的时候没有放照片,只能用现在用STM8S105的照片先拿上来,以飨读者。手头还有一些东西玩玩,就是手机控制LCD,这是目前的一部分。由于目前还没做出来,只是处于功能完善阶段,所以有些简陋。小弟就做个抛砖引玉。

20151124092821509.jpg

 

     首先感谢ST王先生给我一块STM32F0-Discovery,实话说,在此之前也没想到会拿到。EDN CHINA 诚不欺我哈哈,废话少说,今天给大家带来的是一款温湿度传感器DHT21(AM2301),
这是一款性能优良的温湿度监测传感器,最近公司要求在STM32F0上还有在STM8S105上面进行移植,为下一步项目做一些准备。Discovery 确实是一个很好的开发环境,集成了STLINK,很方便调试和下载,做工也堪称精炼。
      在这里也感慨一下,由于本人走嵌入式这条路自己在网络上收益良多,在这里也感谢各位陌生而亲切的同行,也希望以此为契机,大家集思广益,共同建设EDN CHINA的大家庭。
     有问题大家联系我,鄙人乐向哲,362245396@qq.com.
     简单说一下,温湿度传感器DHT21(AM2301)是一款优良的温湿度传感器,具体的介绍在我的附件里面。

我附上的附件有以下三个
1,温湿度传感器DHT21(AM2301)的介绍,时序图,还有汇编,C51例程
2,温湿度传感器DHT21(AM2301) 在stm32F0上的移植
3,温湿度传感器DHT21(AM2301) 在stm8S105上面的移植

由于时间有限,我把重点的部分说一下
首先,温湿度传感器DHT21(AM2301)是单总线。

时序图入上所示,不知道为什么我的这边上传不了图片
简单说一下,

1,接线是简单的。如图1_1所示

20151120185313359.jpg

                                                 图1_1
/******
       黑色: GND
       红色: VCC
       黄色: 接MCU的普通IO (注意不要接到特殊IO 如VSS VDD 等等)
      第四线:NC
*******/

2,时序是:
 
空闲时总线为高电平,通讯开始时主机(MCU)拉低总线500us后释放总线,延时20-40us后主机开始检测从机(DHT21)的响应信号。从机的响应信号是一个80us左右的低电平,随后从机在拉高总线80us左右代表即
将进入数据传送。(要注意程序给主机一个下降沿)
如图2_1所示:

20151120185603877.jpg

                                           图2_1

如图2_2所示:

20151120185828958.jpg

                                          图2_2
3,引脚配置如下:这是重点! 这是重点! 这是重点! 重要的事情说四遍。。。
STM32F0版本
上拉输入是必须的!上拉输入是必须的!上拉输入是必须的!
***是中国的!***是中国的!***是中国的!***是中国的!说远了。。


stm32F0版本
void GPIO_Initializations(void)
 {
  GPIO_InitTypeDef GPIO_InitStructure;
  
  /* USART1_Tx/Rx Configuration */             //USART1接口初始化
  GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_1); //数据手册中有介绍
  GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_1);

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10; 
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;       //PA9/10 alternate function
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_Level_3;    //high speed
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;  //pushpull mode
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;   //可以没有上拉
  GPIO_Init(GPIOA, &GPIO_InitStructure); 

  /* GPIOB Configuration */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;          //AM2301接口初始化
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;   //output mode
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_Level_3;  //high speed
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;           //上拉输入
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;   //pull up
  GPIO_Init(GPIOB, &GPIO_InitStructure);
 }

 

 

STM8S105版本:

#define SET_OUT_STATUS  { PC_DDR |= (1<);>

);>


#define SET_IN_STATUS   { PC_DDR &=~(1<);>

}<>

}<>

 

 

);>

C51 汇编见附件 《AM2301(DHT21)规格书》

 

 

4,“1” 和 “0”的区别:两者的区别在于 高电平时间的长短

 

“0” 如图 4_1所示

20151120190540739.jpg

                                           图4_1

“1” 如图 4_2所示

20151120190703816.jpg

                                             图4_2

5,关键程序演示和讲解

 

 

stm32F0版本

unsigned char AM23XX_Read(void)      //读取温湿度
 {  
  unsigned char i, AM23XX_answerFlag=0;
  unsigned int cnt=0;
 
  AM23XX_OUT_SET;     //IO设置为输出
 
  AM23XX_OUT(0);
      //主机发开始信号, 单总线拉低(至少500us)
  delay_ms(1);      
  
  AM23XX_OUT(1);      //释放总线, 等待从机响应
  delay_us(30);    //延时(20~40us)
  AM23XX_IN_SET;      //IO设置为输入
  
  if(AM23XX_IN == 0)     //检测从机响应信号 
  {
   cnt = 0;
   while(! AM23XX_IN)    //等待低电平结束(80us)
   {
    if(++cnt >= 100000)
     return 0;
   }
   cnt = 0;
   while(AM23XX_IN)    //等待高电平结束
   {
    if(++cnt >= 100000)
     return 0;
   }
   
   for(i=0; i<5; i++)
   {
    AM_SensorData = AM23XX_Read_Byte();
   }
   AM23XX_answerFlag = 1;   //应答标志变量置位
  }
  else
  {
   AM23XX_answerFlag = 0;
  }
  
  return AM23XX_answerFlag;
 }

 

 

 

STM8S105版本:

unsigned char  Read_Temperature(void)   //读温度
{
  unsigned char i;
  SET_OUT_STATUS;
  PB6(1);
  delay_us(10000);
  PB6(0);
  delay_us(600);
  asm("sim");
  SET_IN_STATUS;
  EXTI_CR1 |= (1<<5)+(1<<4);  //配置上下沿都可以
  asm("rim");
  RecvStatrFg=1; //开始接受标志位
  RecvUselessBit=0;  //第一个下降沿是没有意义的
  RecvBytePot=0; //索引
  RecvBit=0;     //位索引
  RecvTimeout =0; // 超时标志位

}
这个要与中断相联系。

#pragma vector = 7   //中断向量
__interrupt void PC_470Rx(void)
{
    if(RecvStatrFg)
    {
     
       if(PC_IDR_IDR5==0)//下降沿
       {
         RecvUselessBit++;//两者同时实现了i=i+1,但是++i返回值是i+1,而i++返回值是i.
         RecvTimeout=0;
         if(RecvUselessBit>1)  //第一个下降沿不采用
         {
           if(RecvUselessBit>2)
           {
            
             if(DataTime<10)
             {
                RecvData[RecvBytePot] &= ~(1<<(7-RecvBit)); //判断 0
             }
             else
             {
                RecvData[RecvBytePot] |= (1<<(7-RecvBit));    //判断 1
             }
             RecvBit++;
             if(RecvBit>7)  //8位满清零
             {
               RecvBytePot++;
               RecvBit=0;
             }  
           }
           DataTime=0;
         }
       }  
    }
  
}

 

 

 

C51版本和汇编版本在我发的附件里面 《AM2301(DHT21)规格书》里面

 

 


5,读数的话在 《AM2301(DHT21)规格书》讲得很详细,还是上面的话,有问题大家一起探讨。

      组合为:湿度高八位+湿度低八位+温度高八位+温度低八位+校验

 

6,效果照片展示

 

 

在示波器上的演示

20151120190952658.jpg

 

 

 

明显看出 “1”与 “0”

20151120191027681.jpg

 

20151124092508884.jpg

 

 

3,在串口调试助手上的表示

20151120191102729.jpg

在LCD(JLX12864G_086)上面的移植

关于JLX12864G_086的移植我在下一篇博客写写  最近在赶点东西哈

20151124092709710.jpg

 

由于时间有限,有些混乱。大家要交流的可以联系我,很期待与大家的联系。转载请注明出处。

 

);>);>

 

作者: Bruce-Woo, 来源:面包板社区

链接: https://mbb.eet-china.com/blog/uid-me-1850657.html

版权声明:本文为博主原创,未经本人允许,禁止转载!

文章评论6条评论)

登录后参与讨论

用户420356 2016-4-3 18:01

感谢分享,准备调试,谢谢

用户1268034 2016-3-3 11:55

好东西

Bruce-Woo 2015-11-23 14:30

谢谢支持!

用户1696769 2015-11-23 09:45

博主动手DIY的作品,基于STM32 MCU的板子,很不错。

用户377235 2015-11-20 20:22

刚好需要这个,谢谢楼主。

Bruce-Woo 2015-11-20 19:26

STM8S105版本: #define SET_OUT_STATUS { PC_DDR |= (1< #define SET_IN_STATUS { PC_DDR &=~(1< 这部分上传的时候有些问题,特此更正: #define SET_OUT_STATUS { PC_DDR |= (1<
相关推荐阅读
Bruce-Woo 2023-03-07 15:14
嵌入式面试之系统
最近一段时间在开始找工作,自己以前也面试过其他人,想从实际工作的角度,来提出一些有意义的问题并做一些浅薄的解答,期望帮助到找工作或者刚开始当面试官的朋友。我把面试要准备的地方列成一下几个注意点,大家...
Bruce-Woo 2023-02-25 21:59
芯片选型的思路
近来在面试,不知为何很多人问起我刚毕业的时候的项目中的一个芯片选型的事情,回过头来整理下,希望可以帮助到后面的朋友1. 开发难度 开发难度,要考虑本身的程序员的开发能力,擅长的领域和工具等。综合下你...
Bruce-Woo 2021-03-17 14:19
记一次调用动态库报错的处理过程( undefined symbol)
最近工作在调用其他同事的一个动态库的时候发现有 未识别的错误 特此记录一下         首先我们用ldd查一下动态库连接是否有问题   ...
Bruce-Woo 2021-03-11 15:03
ubuntu16.04下安装svn
SVN和GIT相信是大家使用最多的代码协同工具,不过可能在win下用的比较多,那今天在ubuntu上运行一遍,操作都差不多。某种程度上讲,我也更喜欢指令操作。1. 远程登录虚拟机,也可以页面操作,看个...
Bruce-Woo 2021-02-09 01:08
2020,我想和你谈谈
这篇文字无关技术,也没有代码。 这是最好的时代,也是最坏的时代!写在回家前夜。 不到10个小时后就要开始坐车回家,手头的工作也没有做完。正经的事儿没完成,乱七八糟的事情倒是想了不少,说话是一种表达方...
Bruce-Woo 2021-01-19 12:34
cmake的安装过程
今天在编译opencv的时候突然发现cmake失败,显示版本不同遂决定修复之方法如下下载更高版本cmake,可在cmake官网下载 解压 tar -zxvf cmake-3.19....
我要评论
6
16
关闭 站长推荐上一条 /2 下一条