SRM32fx103驱动AM2302温湿度传感器

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

AM2302引脚图

这里写图片描述

这里写图片描述

单总线通信时序

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

#
好的,对于这个问题,您可以通过以下步骤来使用srm32f103c8t6的PWM输出驱动PB3引脚上的无源蜂鸣器: 1. 首先,需要在开发环境中配置srm32f103c8t6的PWM输出。可以通过调用STM32 HAL库中的相应函数来实现。例如,可以使用以下代码来初始化PWM输出: ```c // 初始化PWM GPIO引脚 GPIO_InitTypeDef GPIO_InitStruct = {0}; GPIO_InitStruct.Pin = GPIO_PIN_3; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); // 初始化PWM定时器 TIM_HandleTypeDef htim; TIM_OC_InitTypeDef sConfigOC = {0}; htim.Instance = TIM1; htim.Init.Prescaler = 0; htim.Init.CounterMode = TIM_COUNTERMODE_UP; htim.Init.Period = 1000; htim.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; HAL_TIM_PWM_Init(&htim); sConfigOC.OCMode = TIM_OCMODE_PWM1; sConfigOC.Pulse = 500; HAL_TIM_PWM_ConfigChannel(&htim, &sConfigOC, TIM_CHANNEL_4); HAL_TIM_PWM_Start(&htim, TIM_CHANNEL_4); ``` 这个代码初始化了PB3引脚作为PWM输出引脚,同时初始化了一个定时器(这里使用的是TIM1)来产生PWM波形。其中,定时器的周期设置为1000,占空比设置为50%。 2. 接下来,需要在程序中控制PWM的占空比来控制蜂鸣器的声音。可以通过调用以下代码来改变PWM的占空比: ```c // 改变PWM占空比 TIM_OC_InitTypeDef sConfigOC = {0}; sConfigOC.OCMode = TIM_OCMODE_PWM1; sConfigOC.Pulse = 250; HAL_TIM_PWM_ConfigChannel(&htim, &sConfigOC, TIM_CHANNEL_4); HAL_TIM_PWM_Start(&htim, TIM_CHANNEL_4); ``` 这个代码将PWM的占空比改为25%,从而使蜂鸣器发出更低的声音。 3. 最后,需要在程序中实现适当的逻辑来控制蜂鸣器的声音。例如,可以使用以下代码来使蜂鸣器持续发出一段时间的声音: ```c // 持续发出声音 HAL_Delay(1000); HAL_TIM_PWM_Stop(&htim, TIM_CHANNEL_4); ``` 这个代码使用了HAL_Delay函数来让程序等待1000毫秒,然后停止PWM输出,从而停止蜂鸣器的发声。 希望这个回答能够帮助您解决问题,如果您还有其他问题,请随时提出。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值