stm32f103中ds18
时间: 2023-07-14 18:13:53 浏览: 91
20温度传感器的接法和程序如下:
首先,将DS18B20的VCC引脚连接到STM32F103的5V电源,将GND引脚连接到STM32F103的GND引脚,将数据线引脚连接到STM32F103的任意一个GPIO引脚。在此示例中,将数据线引脚连接到GPIOA的PIN0引脚。
接法如下图所示:
![DS18B20](https://img-blog.csdnimg.cn/20210719101748762.png)
程序如下所示:
```c
#include "stm32f10x.h"
/* 定义DS18B20引脚 */
#define DS18B20_DQ_OUT() GPIOA->CRL &= ~(0x0F); GPIOA->CRL |= 0x03;
#define DS18B20_DQ_IN() GPIOA->CRL &= ~(0x0F); GPIOA->CRL |= 0x08;
/* DS18B20初始化 */
void DS18B20_Init(void) {
/* 打开GPIOA时钟 */
RCC->APB2ENR |= RCC_APB2ENR_IOPAEN;
/* 配置GPIOA的PA0引脚为输出模式 */
DS18B20_DQ_OUT();
/* 初始化DS18B20 */
DS18B20_Reset();
DS18B20_WriteByte(0xCC);
DS18B20_WriteByte(0x44);
}
/* DS18B20复位 */
void DS18B20_Reset(void) {
/* 将数据线拉低 */
GPIOA->BSRR = GPIO_BSRR_BR0;
/* 延时480us */
Delay_us(480);
/* 将数据线拉高 */
GPIOA->BSRR = GPIO_BSRR_BS0;
/* 延时60us */
Delay_us(60);
/* 切换到输入模式 */
DS18B20_DQ_IN();
/* 等待DS18B20的响应 */
while((GPIOA->IDR & GPIO_IDR_IDR0) != 0);
/* 等待DS18B20的响应结束 */
while((GPIOA->IDR & GPIO_IDR_IDR0) == 0);
/* 切换到输出模式 */
DS18B20_DQ_OUT();
}
/* DS18B20写一个字节 */
void DS18B20_WriteByte(uint8_t data) {
uint8_t i;
for(i = 0; i < 8; i++) {
/* 将数据线拉低 */
GPIOA->BSRR = GPIO_BSRR_BR0;
/* 写入数据 */
if((data >> i) & 0x01) {
Delay_us(6);
GPIOA->BSRR = GPIO_BSRR_BS0;
Delay_us(64-6);
} else {
Delay_us(60);
GPIOA->BSRR = GPIO_BSRR_BS0;
Delay_us(10);
}
}
}
/* DS18B20读一个字节 */
uint8_t DS18B20_ReadByte(void) {
uint8_t data = 0;
uint8_t i;
for(i = 0; i < 8; i++) {
/* 将数据线拉低 */
GPIOA->BSRR = GPIO_BSRR_BR0;
/* 延时6us */
Delay_us(6);
/* 将数据线拉高 */
GPIOA->BSRR = GPIO_BSRR_BS0;
/* 延时9us */
Delay_us(9);
/* 读取数据 */
if((GPIOA->IDR & GPIO_IDR_IDR0) != 0x00) {
data |= (1 << i);
}
/* 延时45us */
Delay_us(45);
}
return data;
}
/* DS18B20读温度值 */
int16_t DS18B20_ReadTemperature(void) {
uint8_t temp_l;
uint8_t temp_h;
int16_t temp = 0;
/* 复位DS18B20 */
DS18B20_Reset();
/* 发送读取温度命令 */
DS18B20_WriteByte(0xCC);
DS18B20_WriteByte(0xBE);
/* 读取温度值的低8位 */
temp_l = DS18B20_ReadByte();
/* 读取温度值的高8位 */
temp_h = DS18B20_ReadByte();
/* 计算温度值 */
temp = (temp_h << 8) | temp_l;
temp = temp * 0.0625;
return temp;
}
/* 延时函数 */
void Delay_us(uint32_t us) {
uint32_t i;
for(i = 0; i < us; i++) {
__NOP();
}
}
int main(void) {
int16_t temperature;
/* 初始化DS18B20 */
DS18B20_Init();
while(1) {
/* 读取温度值 */
temperature = DS18B20_ReadTemperature();
/* 延时1s */
Delay_us(1000000);
}
}
```
这个程序可以不使用库函数来控制STM32F103的GPIO引脚,通过直接操作GPIO寄存器来实现。在该程序中,使用了一个Delay_us()函数来延时。可以根据实际需要自行编写该函数。
阅读全文