我的自己做的硬件时直接用STM32f103的最小板外界AM2302实现的温湿度采集,证实不用上拉电阻也可以实现温湿度采集功能。
但不知道为什么效验位≠湿度高8位+湿度低8位+温度高8位+温度低8位。
所以我的程序上并没有加效验位判断。

AM2302引脚图

单总线通信时序


主机和传感器之间的通信可通过下面四个步骤

一、 AM2302 上电后(AM2302 上电后要等待 2S 以越过不稳定状态,在此期间读取设备不能发送任何指令),测试环境温湿度数据,并记录数据,此后传感器自动转入休眠状态。AM2302 的 SDA 数据线由上拉电阻拉高一直保持高电平,此时 AM2302 的 SDA 引脚处于输入状态,时刻检测外部信号。

二、微处理器的 I/O 设置为输出,同时输出低电平,且低电平保持时间不能小于 800us,典型值是拉低 1MS,然后微处理器的 I/O 设置为输入状态,释放总线,由于上拉电阻,微处理器的 I/O 即 AM2302的 SDA 数据线也随之变高,等主机释放总线后,AM2302 发送响应信号,即输出 80 微秒的低电平作为应答信号,紧接着输出 80 微秒的高电平通知外设准备接收数据。

三、AM2302 发送完响应后,随后由数据总线 SDA 连续串行输出 40 位数据,微处理器根据 I/O 电平的变化接收 40 位数据。
位数据“0”的格式为: 50 微秒的低电平加 26-28 微秒的高电平;
位数据“1”的格式为: 50 微秒的低电平加 70 微秒的高电平;

连续读取五个数据

AM2302.C

#include "AM2302.h"uint8_t Hum_H,Hum_L,Temp_H,Temp_L,Check;
uint16_t Hum,Temp;
void AM2302_DATA_OUT(uint8_t a)//输出模式下,输出高低电平
{if(a==1){GPIO_SetBits(GPIOA, GPIO_Pin_9);}else if(a==0){GPIO_ResetBits(GPIOA, GPIO_Pin_9);}
}
uint8_t AM2302_DATA_IN(void)//输入模式下,读取引脚是高电平还是低电平
{uint8_t a;a=GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_9);return a;
}
void AM2302_OUT(void)//设置为推挽输出模式
{       GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure);
}
void AM2302_IN(void)//设置为上拉输入模式
{GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure);
}uint8_t Read_Byte(void)
{uint8_t i,temp=0;for(i=0;i<8;i++){while(AM2302_DATA_IN()==0);Delay_us(5);//50usif(AM2302_DATA_IN()==1){while(AM2302_DATA_IN()==1);//直到高电平结束跳出temp|=(uint8_t)(0x01<<(7-i)); //把7-i位置1}else{temp&=(uint8_t)~(0x01<<(7-i)); //把7-i位置0}}return temp;
}
void AM2302_RESET(void)//2s的启动延时
{uint16_t i;AM2302_OUT();AM2302_DATA_OUT(1);for(i=0;i<2000;i++){Delay_us(100);}
}
void Read_AM2302(void)
{AM2302_OUT();AM2302_DATA_OUT(0);Delay_us(180);//1ms-2ms之间都可以,设置为1.8msAM2302_DATA_OUT(1);Delay_us(3); //30usAM2302_IN();if(AM2302_DATA_IN()==0)//判断AM2302是否返回响应{while(AM2302_DATA_IN()==0);//响应80ms低电平while(AM2302_DATA_IN()==1);//响应80ms高电平Hum_H=Read_Byte(); //读取湿度高8位Hum_L=Read_Byte(); //读取湿度低8位Temp_H=Read_Byte(); //读取温度高8位Temp_L=Read_Byte();//读取温度低8位Check=Read_Byte();//读取效验位AM2302_OUT();AM2302_DATA_OUT(1);Delay_us(5); //50us}
}
void AM2302(void)
{Hum=(Hum_H*256+Hum_L);//此处的湿度为实际湿度的10倍Temp=Temp_H*256+Temp_L;//此处的湿度为实际温度的10倍
}

主函数


#include "stm32f10x.h"
#include "Systick.h"
#include "AM2302.h"int main(void)
{   SysTick_Init();AM2302_RESET();while(1)                            {      Read_AM2302();AM2302();//湿度、温度均为实际的10倍}
}

AM2302.h

#ifndef __AM2302_H
#define __AM2302_H  #include "stm32f10x.h"
#include "SysTick.h"
void AM2302_DATA_OUT(uint8_t a);
uint8_t AM2302_DATA_IN(void);
void AM2302_IN(void);
void AM2302_OUT(void);
uint8_t Read_Byte(void);
void Read_AM2302(void);
void AM2302(void);
void AM2302_RESET(void);#endif /* __AM2302_H */

滴答时钟函数,用来做延时(SysTick.c)


#include "SysTick.h"
#include "bsp_key.h"static uint64_t TimingDelay;void SysTick_Init(void)
{if (SysTick_Config(SystemCoreClock / 100000)){ while (1);}SysTick->CTRL &= ~ SysTick_CTRL_ENABLE_Msk;
}void Delay_us(__IO u32 nTime)//10us为一个单位,例如Delay—us(1)=10us
{ TimingDelay = nTime;    SysTick->CTRL |=  SysTick_CTRL_ENABLE_Msk;while(TimingDelay != 0);
}void TimingDelay_Decrement(void)
{if (TimingDelay != 0x00){ TimingDelay--;}}

SysTick.h

#ifndef __SYSTICK_H
#define __SYSTICK_H#include "stm32f10x.h"
void SysTick_Init(void);
void Delay_us(__IO u32 nTime);
#define Delay_ms(x) Delay_us(100*x)

写到这,AM2302驱动程序就写完了。
单总线器件只要认真看时序图照着一步一步写就行了。

SRM32fx103驱动AM2302温湿度传感器相关推荐

  1. STM32F1驱动AM2302温湿度传感器

    先来个AM2302的自我介绍:          AM2302数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器.它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高的可靠性与卓 ...

  2. NORDIC52832 TWI(I2C) 特点 (2)驱动CHT8305C 温湿度传感器

    1. nRF52832 TWI特点 本章描述的是 TWIM (带 EasyDMA 的 TWI 主机) ),本章中的 TWI 均指的是 TWIM 即 TWI 主机. nRF 52832 片内集成的 TW ...

  3. STM32驱动 HTU21D温湿度传感器

    STM32驱动 HTU21D温湿度传感器 温湿度传感器模块HTU21D产品简介 基于法国Humirel公司高性能的湿度感应元件制成,新一代HTU21D温度和湿度传感器在尺寸与智能方面建立了新的标准:它 ...

  4. 51单片机驱动AHT10温湿度传感器

    51单片机驱动AHT10温湿度传感器 AHT10温湿度传感器 AHT10参数 工作原理 数据转换 驱动 接线 驱动代码 实验结果 AHT10温湿度传感器 AHT10是新一代温湿度传感器,传感器输出经过 ...

  5. ⑦ ESP8266 开发学习笔记_By_GYC 【ESP8266 驱动 DHT11 温湿度传感器】

    目录 一.准备材料 二.硬件连接 三.软件编程 1.修改工程名 2.添加组件 3.编程 4.反馈结果 5.核心代码 四.总结 ⑦ ESP8266 开发学习笔记_By_GYC [ESP8266 驱动 D ...

  6. STM32F103使用硬件IIC驱动SHT30温湿度传感器

    文章目录 前言 一.SHT30温湿度传感器原理图 二.代码部分 1.SHT30.c文件 2.SHT30.h文件 总结 前言 SHT30是一种常见的温湿度传感器,该传感器广泛应用于各种场景,小米的温湿度 ...

  7. [单片机芯片]CH32V307驱动单总线温湿度传感器DHT22

    手头有一个DHT22温湿度传感器和CH32V307开发板,可玩性极强.DHT22是已校准的数字温湿度传感器,用于检测环境温湿度,采用DHT22(AM2302),标准单总线接口.拥有比常见的DHT11更 ...

  8. 【STM32】【STM32CubeMX】STM32CubeMX的使用之四:IIC总线协议驱动SHT30温湿度传感器

    文章目录 0.前言 1.传感器介绍 1.1.传感器简介 1.2.传感器板原理图 1.3.传感器引脚定义 1.4.数据采集工作流程 1.4.1.单次数据采集模式 1.4.2.周期型数据采集模式 1.5. ...

  9. STM32模拟IIC驱动sht30温湿度传感器

    最近有在使用sht30这个传感器,相比于新手常用的dht11传感器,sht30更精确,自己花了半小时调好了 所以拿出来分享给大家. sht30外观 驱动不是自己写的, 是采用CSDN上的一位朋友的 , ...

最新文章

  1. tkinter项目实战_Python GUI项目实战(二)主窗体的界面设计与实现
  2. sidekiq安装及使用
  3. sqlplus登录时遇到的ORA-12560: TNS: 协议适配器错误解决办法
  4. 数据结构源码笔记(C语言):分块法查找
  5. 用R语言把数据玩出花样
  6. Linux下的屏保设置 xset s 与 xset dpms
  7. 地震了?不,是心动了!
  8. 仿百度地图全景小球旋转
  9. Out of memory error : GC overhead limit exceeded
  10. UTF-8 's format
  11. 监控摄像头服务器中断是什么原因,监控系统常见问题故障及处理方法
  12. 电影片段素材网,自媒体必备素材网站推荐,视频素材免费下载网站
  13. linux网桥动态ip,使用Linux主机当网桥
  14. IDM下载出现503错误
  15. windows10开启与关闭休眠模式
  16. 我的挨踢人生(16)——往事如云烟
  17. php接入飞鹅打印机
  18. 虚幻引擎图文笔记:使用布料模拟(Cloth Simulation)系统制作一面可以随风飘动的旗帜(更新)
  19. 应用程序如何使用驱动程序
  20. 人工智能里你不知道的那些事!所有人都感兴趣的文章

热门文章

  1. 【java学习】 static
  2. linux环境部署apollo,安装ctrip-apollo多环境部署总结
  3. 训练营打卡Day45
  4. 如何打印time_t时间类型? time_t时间类型详解
  5. Harbor2.2.4在CentOS7.9安装、部署
  6. ABBYY FineReader 12激活过程详解
  7. 五舟科技华丽现身计算化学年会
  8. git忽略文件 取消忽略文件
  9. 在 WinCC 中实现三挡转换开关功能
  10. 2019-12-08 周立的博客