专业的编程技术博客社区

网站首页 > 博客文章 正文

新手小白如何用STM32F103C8T6打造自己的开发板

baijin 2025-05-16 11:36:48 博客文章 3 ℃ 0 评论

嗨!大家好!我是路师傅,是一名电子技术方面的从业者,在这里分享自己的所见、所学,希望大家多多支持,点赞关注!

前提条件你得有C语言的基础,从软件着手入门。会看懂电路图和芯片手册。

对于新手小白来讲,在什么平台上开始练习单片机编程可能已经挑花眼了吧。面对众多博主,有的说要从51单片开始,有的说要从STM32 的平台开始练习。下面听我来讲一讲。

stm32和51单片机的区别

1.不同的开发方式

51单片机一般直接操作寄存器,STM32主操作库函数编程。

2.系统资源不同

一般来说,STM32的资源比51单片机多。

3.开发环境可能不同

一般来说,51和STM32都可以在KEIL下开发,但是STM32的选择更多,可以在Linux、windows esplease,甚至vscode+插件模式下开发。

4.操作系统差异

一般来说,51单片机不支持操作系统,STM32支持各种主流操作系统,STM32更容易开发,可以很方便的使用系统实现各种场景的应用。由于51单片机没有操作系统,其发展存在一定的障碍,有时不得不牺牲一些功能来实现整体功能的和谐运行。

从新手的角度来讲,从STM32的平台开始练习更为简单, STM32平台有库文件支持,暂时不用理解底层寄存器的操作,程序更具可读性。

硬件平台我建议用STM32F103C8T6的最小系统板搭建,比如要上手流水灯实验,可以自己买元件焊接流水灯模块,根据你编程的需要连接电路编程验证就可以了。


今天我们将学习 DS18B20 温度传感器的用法。由于DS18B20 不支持 Arduino Dallas 库和 OneWire 库。这就是为什么我们必须在不使用库的情况下编写代码的原因。STM32F103C 的 DS18B20 代码有点长且复杂,因为没有库的参与,并且所有寻址模式都在代码中定义。

DS18B20 是一款单线防水传感器,用于测量 -55 至 125°C 之间的液体温度。用于读取、写入和执行温度转换的电源可以从数据线本身获得,无需外部电源。由于每个 DS18B20 都包含唯一的芯片序列号,因此同一 1-Wire 总线上可以存在多个 DS18B20。

DS18B20 防水数字温度传感器

这是DS18B20 传感器的预接线防水版本。当您需要测量远处或潮湿条件下的物体时非常方便。传感器可以测量-55 至 125°C(-67°F 至 +257°F)之间的温度。该电缆采用 PVC 护套。

因为它是数字的,所以即使长距离也不会出现信号衰减。这些 1 线数字温度传感器相当精确,即在大部分范围内为 ±0.5°C。它可以通过板载数模转换器提供高达 12 位的精度。它们可以与任何使用单个数字引脚的微控制器配合使用。

唯一的缺点是它们使用 Dallas 1-Wire 协议,该协议有点复杂,需要一堆代码来解析通信。我们添加了一个 4.7k 电阻,在使用传感器时需要将其用作 DATA 到 VCC 线的上拉电阻。

要了解有关该传感器的更多信息,您可以查阅DS18B20 传感器数据手册

DS18B20 温度传感器与 STM32 的连接

现在让我们将 DS18B20 传感器与 STM32F103C8T6最小系统板连接起来。连接图如下。

传感器由 STM32 的 3.3V 引脚供电,GND 连接到 GND。同样,数字Pin连接到Bluepill的PA8。数字引脚通过 4.7K 电阻拉动。

DS18B20 STM32代码(仅供参考)

将以下代码上传到STM32F103C板,用于读取DS18B20感测到的温度。您可以使用任何方法上传代码。我使用串行方法并使用USB-TTL转换器模块上传代码。

int DSPIN = PA8;

void setup() {

// put your setup code here, to run once:

Serial.begin(115200);

}


void loop()

{

// put your main code here, to run repeatedly:

double temp = TempRead();

temp = temp * 0.0625; // conversion accuracy is 0.0625 / LSB

Serial.print("Temperature: ");

Serial.print(temp);

Serial.println(" °C");

Serial.println("");

delay(500);

}


boolean DS18B20_Init()

{

pinMode(DSPIN, OUTPUT);

digitalWrite(DSPIN, HIGH);

delayMicroseconds(5);

digitalWrite(DSPIN, LOW);

delayMicroseconds(750);//480-960

digitalWrite(DSPIN, HIGH);

pinMode(DSPIN, INPUT);

int t = 0;

while (digitalRead(DSPIN))

{

t++;

if (t > 60) return false;

delayMicroseconds(1);

}

t = 480 - t;

pinMode(DSPIN, OUTPUT);

delayMicroseconds(t);

digitalWrite(DSPIN, HIGH);

return true;

}


void DS18B20_Write(byte data)

{

pinMode(DSPIN, OUTPUT);

for (int i = 0; i < 8; i++)

{

digitalWrite(DSPIN, LOW);

delayMicroseconds(10);

if (data & 1) digitalWrite(DSPIN, HIGH);

else digitalWrite(DSPIN, LOW);

data >>= 1;

delayMicroseconds(50);

digitalWrite(DSPIN, HIGH);

}

}


byte DS18B20_Read()

{

pinMode(DSPIN, OUTPUT);

digitalWrite(DSPIN, HIGH);

delayMicroseconds(2);

byte data = 0;

for (int i = 0; i < 8; i++)

{

digitalWrite(DSPIN, LOW);

delayMicroseconds(1);

digitalWrite(DSPIN, HIGH);

pinMode(DSPIN, INPUT);

delayMicroseconds(5);

data >>= 1;

if (digitalRead(DSPIN)) data |= 0x80;

delayMicroseconds(55);

pinMode(DSPIN, OUTPUT);

digitalWrite(DSPIN, HIGH);

}

return data;

}


int TempRead()

{

if (!DS18B20_Init()) return 0;

DS18B20_Write (0xCC); // Send skip ROM command

DS18B20_Write (0x44); // Send reading start conversion command

if (!DS18B20_Init()) return 0;

DS18B20_Write (0xCC); // Send skip ROM command

DS18B20_Write (0xBE); // Read the register, a total of nine bytes, the first two bytes are the conversion value

int temp = DS18B20_Read (); // Low byte

temp |= DS18B20_Read () << 8; // High byte

return temp;

}

下载代码后,打开串行监视器。串行监视器将立即开始显示室温。

总结,这样最初代的开发板就搭建好了。后期如果我们想做其他的项目,我们就可以根据自己的需要来扩充来设计了。加油!欢迎大家关注,点赞,转发!

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表