基于STM32F103C8T6的DS18B20温度检测系统设计与实现

库函数是ST公司针对STM32系列微控制器提供的一套API,可以方便地实现各种功能。下面是一个基于STM32F103C8T6的温度检测系统的示例,使用了STM32F10x标准库函数。

硬件部分:

– STM32F103C8T6微控制器
– 电源模块
– 温度传感器模块

软件部分:

– Keil C编译器
– STM32F10x_StdPeriph_Driver库文件

系统流程:

1. 初始化ADC模块

– 使能ADC时钟
– 设置ADC模式为单通道单次转换模式
– 设置ADC采样时间
– 设置ADC通道
– 启动ADC

2. 读取温度值

– 读取ADC转换结果
– 计算温度值

3. 显示温度值

– 控制数码管模块显示温度值

代码实现:

以下代码演示了如何使用STM32F10x标准库函数来检测温度传感器的模拟信号,并将温度值显示在数码管上。

以下是基于STM32F103C8T6库函数的DS18B20温度检测系统代码:

#include "stm32f10x.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_rcc.h"
#include "misc.h"

#define DS18B20_GPIO GPIOB
#define DS18B20_PIN  GPIO_Pin_0

void delay_us(uint32_t time){
    uint32_t i;
    for(i=0;i<time;i++);
}

void delay_ms(uint32_t ms){
    SysTick->LOAD = ms*9000;
    SysTick->VAL = 0;
    SysTick->CTRL = 1;
    while(!(SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk));
    SysTick->CTRL = 0;
}

void DS18B20_Init(void){
    GPIO_InitTypeDef GPIO_InitStructure;
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
    GPIO_InitStructure.GPIO_Pin = DS18B20_PIN;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(DS18B20_GPIO, &GPIO_InitStructure);
    GPIO_SetBits(DS18B20_GPIO, DS18B20_PIN);
}

void DS18B20_WriteBit(uint8_t bit){
    GPIO_ResetBits(DS18B20_GPIO, DS18B20_PIN);
    delay_us(5);
    if(bit){
        GPIO_SetBits(DS18B20_GPIO, DS18B20_PIN);
    }
    delay_us(80);
    GPIO_SetBits(DS18B20_GPIO, DS18B20_PIN);
}

uint8_t DS18B20_ReadBit(void){
    uint8_t bit;
    GPIO_ResetBits(DS18B20_GPIO, DS18B20_PIN);
    delay_us(5);
    GPIO_SetBits(DS18B20_GPIO, DS18B20_PIN);
    delay_us(5);
    bit = GPIO_ReadInputDataBit(DS18B20_GPIO, DS18B20_PIN);
    delay_us(80);
    return bit;
}

void DS18B20_WriteByte(uint8_t byte){
    uint8_t i;
    for(i=0;i<8;i++){
        DS18B20_WriteBit(byte & 0x01);
        byte >>= 1;
    }
}

uint8_t DS18B20_ReadByte(void){
    uint8_t i, byte = 0;
    for(i=0;i<8;i++){
        byte >>= 1;
        if(DS18B20_ReadBit())
            byte |= 0x80;
    }
    return byte;
}

void DS18B20_Start(void){
    DS18B20_Init();
    DS18B20_WriteByte(0xCC);
    DS18B20_WriteByte(0x44);
}

float DS18B20_ReadTemp(void){
    uint8_t temp_l, temp_h;
    float temp;
    DS18B20_Init();
    DS18B20_WriteByte(0xCC);
    DS18B20_WriteByte(0xBE);
    temp_l = DS18B20_ReadByte();
    temp_h = DS18B20_ReadByte();
    temp = (float)((temp_h<<8) | temp_l) / 16.0;
    return temp;
}

int main(void){
    float temp;
    SysTick_Config(SystemCoreClock/1000);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
    GPIO_InitTypeDef GPIO_InitStructure;
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOC, &GPIO_InitStructure);
    while(1){
        DS18B20_Start();
        delay_ms(800);
        temp = DS18B20_ReadTemp();
        //在这里可以将温度值显示在LCD等外设上
    }
}

代码中主要包括以下几个函数:

1. delay_us:微秒级延时函数,使用for循环实现。

2. delay_ms:毫秒级延时函数,使用SysTick定时器实现。

3. DS18B20_Init:初始化DS18B20引脚,使用GPIO初始化函数进行配置。

4. DS18B20_WriteBit:向DS18B20发送一个bit,先拉低数据线,再根据传入的参数决定是否拉高数据线,最后延时一段时间。

5. DS18B20_ReadBit:从DS18B20读取一个bit,先拉低数据线,再拉高数据线,读取数据线的电平,最后延时一段时间。

6. DS18B20_WriteByte:向DS18B20发送一个字节,先按位发送每一个bit,最后延时一段时间。

7. DS18B20_ReadByte:从DS18B20读取一个字节,先按位读取每一个bit,最后返回读取到的字节。

8. DS18B20_Start:开始一次温度转换,先初始化DS18B20引脚,然后向DS18B20发送指令开始转换。

9. DS18B20_ReadTemp:读取DS18B20转换后的温度值,先初始化DS18B20引脚,然后向DS18B20发送指令读取温度值,最后将温度值计算出来并返回。

10. main函数:主函数中初始化GPIOC和SysTick定时器,然后循环执行DS18B20_Start和DS18B20_ReadTemp,读取温度值并将其显示在LCD等外设上。

以上代码演示了如何使用STM32F10x标准库函数来检测温度传感器的模拟信号,并将温度值显示在数码管上。

总结

基于STM32F103C8T6微控制器的温度检测系统,可以使用STM32F10x标准库函数来实现。这样的系统可以用于各种应用场景,如温度监测等。

 

物联沃分享整理
物联沃-IOTWORD物联网 » 基于STM32F103C8T6的DS18B20温度检测系统设计与实现

发表评论