DS18b20DQ引脚接stm32f103c8t6pb11引脚代码
时间: 2023-07-09 12:47:41 浏览: 131
好的,下面是将DS18b20的DQ引脚连接到STM32F103C8T6的PB11引脚,并使用STM32的标准库读取DS18B20温度传感器数据的代码:
```
#include "stm32f10x.h"
#define DQ_PIN GPIO_Pin_11
#define DQ_PORT GPIOB
// 延时函数,延时us微秒
void Delay_us(uint32_t us)
{
uint32_t i;
for(i=0; i<us*8; i++);
}
// 设置DQ引脚为输出模式
void SetDQOutput(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
// 使能GPIOB时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitStruct.GPIO_Pin = DQ_PIN;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(DQ_PORT, &GPIO_InitStruct);
}
// 设置DQ引脚为输入模式
void SetDQInput(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.GPIO_Pin = DQ_PIN;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(DQ_PORT, &GPIO_InitStruct);
}
// 发送一个复位信号
void ResetDS18B20(void)
{
SetDQOutput(); // 设置DQ引脚为输出模式
GPIO_ResetBits(DQ_PORT, DQ_PIN); // 将DQ引脚拉低
Delay_us(500); // 延时500us
GPIO_SetBits(DQ_PORT, DQ_PIN); // 将DQ引脚拉高
Delay_us(30); // 延时30us
SetDQInput(); // 设置DQ引脚为输入模式
while(GPIO_ReadInputDataBit(DQ_PORT, DQ_PIN) == 1); // 等待DS18B20的回应信号
while(GPIO_ReadInputDataBit(DQ_PORT, DQ_PIN) == 0); // 等待DS18B20恢复
}
// 发送一个位数据
void WriteBit(uint8_t bit)
{
SetDQOutput(); // 设置DQ引脚为输出模式
GPIO_ResetBits(DQ_PORT, DQ_PIN); // 将DQ引脚拉低
Delay_us(3); // 延时3us
if(bit)
{
GPIO_SetBits(DQ_PORT, DQ_PIN); // 将DQ引脚拉高
}
Delay_us(60); // 延时60us
GPIO_SetBits(DQ_PORT, DQ_PIN); // 将DQ引脚拉高
}
// 发送一个字节数据
void WriteByte(uint8_t byte)
{
uint8_t i;
for(i=0; i<8; i++)
{
WriteBit(byte&0x01); // 发送一个位数据
byte >>= 1; // 右移一位
}
}
// 读取一个位数据
uint8_t ReadBit(void)
{
uint8_t bit;
SetDQOutput(); // 设置DQ引脚为输出模式
GPIO_ResetBits(DQ_PORT, DQ_PIN); // 将DQ引脚拉低
Delay_us(3); // 延时3us
GPIO_SetBits(DQ_PORT, DQ_PIN); // 将DQ引脚拉高
SetDQInput(); // 设置DQ引脚为输入模式
Delay_us(10); // 延时10us
bit = GPIO_ReadInputDataBit(DQ_PORT, DQ_PIN); // 读取DQ引脚状态
Delay_us(50); // 延时50us
return bit;
}
// 读取一个字节数据
uint8_t ReadByte(void)
{
uint8_t i, byte = 0;
for(i=0; i<8; i++)
{
byte >>= 1; // 右移一位
byte |= (ReadBit()<<7); // 读取一位数据
}
return byte;
}
// 读取DS18B20的温度数据
float ReadDS18B20Temp(void)
{
uint8_t tempL, tempH;
int16_t temp;
ResetDS18B20(); // 发送复位信号
WriteByte(0xCC); // 跳过ROM操作
WriteByte(0x44); // 启动温度转换
while(!ReadBit()); // 等待转换完成
ResetDS18B20(); // 发送复位信号
WriteByte(0xCC); // 跳过ROM操作
WriteByte(0xBE); // 读取温度数据
tempL = ReadByte(); // 读取温度低8位
tempH = ReadByte(); // 读取温度高8位
temp = (tempH<<8) | tempL; // 将温度高8位和低8位组合成一个16位整数
return (float)temp/16.0; // 将温度数据转换成浮点数
}
int main(void)
{
float temp;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);
while(1)
{
temp = ReadDS18B20Temp(); // 读取DS18B20的温度数据
// 这里可以将温度数据输出到数码管、LCD等显示设备上
Delay_us(1000000); // 延时1秒
}
}
```
上述代码中,我们使用STM32的标准库来实现了DS18B20的初始化、复位、发送数据、接收数据等功能。我们将DS18B20的DQ引脚连接到了STM32F103C8T6的PB11引脚上,并通过读取DS18B20的温度数据来演示DS18B20的读取过程。需要注意的是,我们在代码中使用了延时函数`Delay_us()`,需要在程序中实现该函数。
阅读全文
相关推荐
![-](https://img-home.csdnimg.cn/images/20241231045053.png)
![-](https://img-home.csdnimg.cn/images/20241231045053.png)
![-](https://img-home.csdnimg.cn/images/20241231045053.png)
![7z](https://img-home.csdnimg.cn/images/20241231044736.png)
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)
![rar](https://img-home.csdnimg.cn/images/20241231044955.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![rar](https://img-home.csdnimg.cn/images/20241231044955.png)
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)