找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2502|回复: 0
打印 上一主题 下一主题
收起左侧

一线总线温湿度传感器AM2301 STM32驱动程序

[复制链接]
跳转到指定楼层
楼主
一线总线温湿度传感器AM2301驱动程序

单片机源程序如下:
  1. #include "AM23XX.h"
  2. uint8_t a=0;
  3. uint8_t flag11=0;
  4. uint16_t count =0;
  5. /*
  6. * 函数名:DHT11_GPIO_Config
  7. * 描述  :配置DHT11用到的I/O口
  8. * 输入  :无
  9. * 输出  :无
  10. */
  11. void delay(int tt)
  12. {           int j;
  13.     for(;tt!=0;tt--)
  14.                 for(j=44;j>0;j--);
  15. }
  16. void DHT11_GPIO_Config(void)
  17. {               
  18.         /*定义一个GPIO_InitTypeDef类型的结构体*/
  19.         GPIO_InitTypeDef GPIO_InitStructure;

  20.         /*开启GPIOD的外设时钟*/
  21.         RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA, ENABLE);

  22.         /*选择要控制的GPIOD引脚*/                                                                                                                          
  23.           GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;       

  24.         /*设置引脚模式为通用推挽输出*/
  25.           GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;   

  26.         /*设置引脚速率为50MHz */   
  27.           GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;

  28.         /*调用库函数,初始化GPIOD*/
  29.           GPIO_Init(GPIOA, &GPIO_InitStructure);                  

  30.         /* 拉高GPIOD12        */
  31.         GPIO_SetBits(GPIOA, GPIO_Pin_5);
  32.         printf("DHT11 配置完!!");         
  33. }

  34. /*
  35. * 函数名:DHT11_Mode_IPU
  36. * 描述  :使DHT11-DATA引脚变为输入模式
  37. * 输入  :无
  38. * 输出  :无
  39. */
  40. static void DHT11_Mode_IN_FLOATING(void)
  41. {
  42.           GPIO_InitTypeDef GPIO_InitStructure;

  43.                   /*选择要控制的GPIOD引脚*/       
  44.           GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;

  45.            /*设置引脚模式为浮空输入模式*/
  46.           GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING ;

  47.           /*调用库函数,初始化GPIOD*/
  48.           GPIO_Init(GPIOA, &GPIO_InitStructure);         
  49. }

  50. /*
  51. * 函数名:DHT11_Mode_Out_PP
  52. * 描述  :使DHT11-DATA引脚变为输出模式
  53. * 输入  :无
  54. * 输出  :无
  55. */
  56. static void DHT11_Mode_Out_PP(void)
  57. {
  58.         GPIO_InitTypeDef GPIO_InitStructure;

  59.                  /*选择要控制的GPIOD引脚*/                                                                                                                          
  60.           GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;       

  61.         /*设置引脚模式为通用推挽输出*/
  62.           GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;   

  63.         /*设置引脚速率为50MHz */   
  64.           GPIO_InitStructure.GPIO_Speed =GPIO_Speed_10MHz;

  65.         /*调用库函数,初始化GPIOD*/
  66.           GPIO_Init(GPIOA, &GPIO_InitStructure);                  
  67. }
  68. //-----------------------------------------------------------------------------------------------
  69. //-----------------------------------------------------------------------------------------------
  70. //void SDA_Pin_Output_High(void)
  71. //{
  72. //        GPIOA->DDR |= SDA_Pin;                //输出模式
  73. //        GPIOA->ODR |= SDA_Pin;                //输出'1'       
  74. //        GPIOA->CR1 |= SDA_Pin;                //推挽模式  开漏端口此位无效
  75. //        GPIOA->CR2 |= SDA_Pin;                //高速输出
  76. //}
  77. //
  78. //void SDA_Pin_Output_Low(void)
  79. //{
  80. //        GPIOA->DDR |= SDA_Pin;                 //输出模式
  81. //        GPIOA->ODR &= (~SDA_Pin);                //输出'0'       
  82. //        GPIOA->CR1 |= SDA_Pin;                  //推挽模式  开漏端口此位无效
  83. //        GPIOA->CR2 |= SDA_Pin;                 //高速输出
  84. //}
  85. //
  86. //void SDA_Pin_IN_FLOATING(void)
  87. //{
  88. //        GPIOA->CR2 &= ~(SDA_Pin);                        //禁止外部中断
  89. //        GPIOA->DDR &= ~(SDA_Pin);                        //输入模式
  90. //        GPIOA->CR1 &= ~(SDA_Pin);                        //悬浮输入
  91. //}
  92. //-----------------------------------------------------------------------------------------------
  93. static uint8_t Read_Byte(void)
  94. {          

  95.             uint8_t i, temp=0;

  96.          for(i=0;i<8;i++)   
  97.          {
  98.            /*每bit以50us低电平标置开始,轮询直到从机发出 的50us 低电平 结束*/  
  99.             while(DHT11_DATA_IN()==Bit_RESET);//{if(++count>5000) break;};
  100.                  
  101.                  /*DHT11 以27~28us的高电平表示“0”,以70us高电平表示“1”,
  102.                           通过检测60us后的电平即可区别这两个状态*/

  103.                 //delay(5); //延时60us
  104.                 SysTickDelay(40);                             
  105.        
  106.                   if(DHT11_DATA_IN()==Bit_SET)//60us后仍为高电平表示数据“1”
  107.                    {
  108.                            /*轮询直到从机发出的剩余的 30us 高电平结束*/
  109.                                     while(DHT11_DATA_IN() ==Bit_SET);//{if(++count>500) break;}
  110.                                  // SysTickDelay(1);
  111.                                  temp|=(uint8_t)(0x01<<(7-i));  //把第7-i位置1
  112.                        
  113.                    }
  114.                    else         //60us后为低电平表示数据“0”
  115.                    {//SysTickDelay(1);                          
  116.                              temp&=(uint8_t)~(0x01<<(7-i)); //把第7-i位置0
  117.                    }
  118.          }
  119.           return temp;
  120. }

  121. uint8_t Read_DHT11(DHT11_Data_TypeDef *DHT11_Data)
  122. {  

  123.         DHT11_Mode_Out_PP();
  124.                 DHT11_DATA_OUT(HIGH);
  125.                 SysTickDelay(500000);
  126.         /*主机拉低*/
  127.         //DHT11_Mode_Out_PP();
  128.           DHT11_DATA_OUT(LOW);
  129.    //*延时18ms*/800US
  130.            SysTickDelay(2000);        //一定要2MS 的起始信号
  131.   //        DHT11_Mode_IN_FLOATING();
  132.    /*总线拉高 主机延时30us*/
  133.            //DHT11_DATA_OUT(HIGH);
  134.         DHT11_DATA_OUT(HIGH);
  135.           SysTickDelay(30);
  136.            /*主机设为输入 判断从机响应信号*/
  137.    //        DHT11_Mode_IN_FLOATING();
  138.         DHT11_Mode_IN_FLOATING();
  139.   //delay(3);
  140. /*判断从机是否有低电平响应信号 如不响应则跳出,响应则向下运行*/   
  141.   //while(DHT11_DATA_IN() ==Bit_SET){a++;if(a>10) break;}
  142.    SysTickDelay(10);
  143.                         if(DHT11_DATA_IN()==Bit_RESET)
  144.                                 {       
  145.                                           /*轮询直到从机发出的 80us 高电平 标置信号结束*/
  146.                                         count =0;
  147.                                         while(DHT11_DATA_IN()==Bit_RESET);// {if(++count>500) break;}
  148.                                         count =0;
  149.                                         while(DHT11_DATA_IN()==Bit_SET);//{if(++count>500) break;}

  150.           /*轮询直到从机发出的 80us 高电平 标置信号结束*/
  151.           /*开始接收数据*/   
  152.                                           DHT11_Data->humi_int= Read_Byte();           //0
  153.                                                                
  154.                                          DHT11_Data->humi_deci= Read_Byte();          //1
  155.                                
  156.                                          DHT11_Data->temp_int= Read_Byte();                         //2

  157.                                          DHT11_Data->temp_deci= Read_Byte();                        //3
  158.                                                 
  159.                                          DHT11_Data->check_sum= Read_Byte();
  160.                                                                                    
  161.                  delay(1);
  162.                          /*读取结束,引脚改为输出模式*/
  163.                    DHT11_Mode_Out_PP();
  164.                    /*主机拉高*/
  165.                  DHT11_DATA_OUT(HIGH);
  166.                  DHT11_Data->check_sum_tep=DHT11_Data->humi_int + DHT11_Data->humi_deci + DHT11_Data->temp_int+ DHT11_Data->temp_deci;
  167.                    /*检查读取的数据是否正确*/
  168.                  if(DHT11_Data->check_sum == DHT11_Data->check_sum_tep)
  169.                           {
  170.                         //        display(DHT11_Data->temp_int,DHT11_Data->humi_int) ;
  171.                         //        delay(200000);
  172.                         //        display(DHT11_Data->temp_deci,DHT11_Data->humi_deci) ;
  173.                         //        delay(200000);
  174.                         /* AM23XX 处理程序********/
  175.                                 DHT11_Data->hh = DHT11_Data->humi_int;
  176.                                 DHT11_Data->hh <<= 8;
  177.                                 DHT11_Data->hh |= DHT11_Data->humi_deci;
  178.                                 if(0>DHT11_Data->hh||DHT11_Data->hh>=1000)DHT11_Data->hh=999;
  179.                                

  180.                                 DHT11_Data->tem = DHT11_Data->temp_int;
  181.                                 DHT11_Data->tem <<= 8;
  182.                                 DHT11_Data->tem |= DHT11_Data->temp_deci;
  183.                                 if(0>DHT11_Data->tem||DHT11_Data->tem>=1000)DHT11_Data->tem=999;


  184.                                 DHT11_Data->hh_10=DHT11_Data->hh/10;
  185.                                 DHT11_Data->tem_10 =DHT11_Data->tem/10;


  186.                                 return SUCCESS;

  187.                         }
  188.                   else
  189.                           {
  190.                 //        printf("和值不相等\n");
  191.                         return ERROR;
  192.                         }
  193.    }
  194.    else
  195.            {               
  196.                         return ERROR;
  197.                 }
  198.                                    
  199. }

  200.           


  201. /*************************************END OF FILE******************************/
复制代码

所有资料51hei提供下载:
AM2301.7z (199.84 KB, 下载次数: 26)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表