stm32F103 PA2控制DS18b20
时间: 2023-08-13 19:04:55 浏览: 52
DS18b20是一款数字温度传感器,它的数据线可以通过单个GPIO口进行控制。在使用STM32F103控制DS18b20时,需要按以下步骤进行操作:
1. 将PA2口设置为输出模式
```c
GPIO_InitTypeDef GPIO_InitStruct;
/* GPIOA Periph clock enable */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
/* Configure PA2 in output pushpull mode */
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_2;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOA, &GPIO_InitStruct);
```
2. 发送复位脉冲
DS18b20在通信前需要接收到一个复位脉冲,该脉冲持续至少480us。发送复位脉冲的代码如下:
```c
GPIO_ResetBits(GPIOA, GPIO_Pin_2);
delay_us(500); // 持续至少480us
GPIO_SetBits(GPIOA, GPIO_Pin_2);
```
3. 等待DS18b20发出存在脉冲
在发送复位脉冲后,需要等待DS18b20发出存在脉冲(Presence Pulse),该脉冲持续60-240us。检测存在脉冲的代码如下:
```c
GPIO_ResetBits(GPIOA, GPIO_Pin_2);
delay_us(10);
GPIO_SetBits(GPIOA, GPIO_Pin_2);
delay_us(10);
GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_2); // 检测存在脉冲
```
4. 发送读取温度命令
发送读取温度命令后,DS18b20会将温度值存储在内部寄存器中,并准备好发送给主控制器。读取温度命令的代码如下:
```c
GPIO_ResetBits(GPIOA, GPIO_Pin_2);
delay_us(5);
GPIO_SetBits(GPIOA, GPIO_Pin_2);
delay_us(60);
GPIO_ResetBits(GPIOA, GPIO_Pin_2);
delay_us(5);
GPIO_SetBits(GPIOA, GPIO_Pin_2);
delay_us(5);
```
5. 接收温度值
DS18b20会将温度值以序列的形式发送给主控制器。接收温度值的代码如下:
```c
uint8_t i, j;
uint8_t byte;
uint16_t temperature;
for (i = 0; i < 8; i++)
{
byte = 0;
for (j = 0; j < 8; j++)
{
GPIO_ResetBits(GPIOA, GPIO_Pin_2);
delay_us(5);
byte >>= 1;
if (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_2))
byte |= 0x80;
delay_us(60);
GPIO_SetBits(GPIOA, GPIO_Pin_2);
delay_us(5);
}
if (i == 0)
temperature = byte;
else if (i == 1)
temperature |= (byte << 8);
}
temperature >>= 4; // 去掉小数部分
```
以上就是控制STM32F103读取DS18b20温度值的基本步骤,需要注意的是,由于DS18b20使用了单线通信协议,因此在写入和读取时需要进行适当的延时。另外,为了提高代码的可读性和可维护性,可以将复位脉冲、读取温度命令和接收温度值的代码封装成函数进行调用。