自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(36)
  • 资源 (1)
  • 收藏
  • 关注

原创 【速成】蓝桥杯嵌入式省一教程

蓝桥杯虽然是水赛,含金量不如其他老牌竞赛那么高,但对提高自身的能力还是有一定帮助的。无论你是想混个奖项加加综测分,还是想学学单片机、嵌入式的知识,蓝桥杯电子类的嵌入式竞赛都值得参加一次。当然蓝桥杯电子类竞赛还有其他组别,嵌入式组主要考察的是STM32的基本使用,而单片机组考察的是CT107D单片机(博主也没听过,貌似是蓝桥杯竞赛专用板)。我个人认为无论是入门单片机,还是入门嵌入式,又或者是为今后做项目、实习工作等做准备,STM32都是非常值得学的,也非常适合入门。

2024-01-16 17:57:02 1955 3

原创 【速成】蓝桥杯嵌入式省一教程:(十一)UART串口通信

一个单片机通常内置有多个UART,而这些UART通常都与单片机上的USB接口连接在一起,因此只需要将单片机通过数据线与电脑相连,即可实现单片机与电脑的UART串口通信。首先选择USART1/2/3/UART4中的任意一个(USART与UART的区别是USART可以进行同步通信,UART只能进行异步通信),将Mode设置为Asynchronous(异步),将Baud Rate(波特率)设置为9600。想要验证程序的正确与否,只需要将接收到的数据通过串口再发送出去,或使用LCD显示出来即可。

2023-08-25 10:33:16 2275 10

原创 【速成】蓝桥杯嵌入式省一教程:(十)利用共用体进行E2PROM读写

这样,val变量就以4个字节的形式,存储在了val_write这一共用体中,其中value的值为0.5,data[0]~data[3]分别为其4个字节。若是对于uint16_t类型的数据,我们可以利用移位操作,将其拆成高八位与低八位存进E2PROM的两个地址中;然而,对于占用字节数更多的数据类型,或占用字节数未知,用这样的办法处理起来就显得较麻烦。在上一节中我们了解到,AT24C02芯片(E2PROM存储器)内部含有256个8位字节,,对于int、float型等大于占用一个字节的数据,需要进行额外处理。

2023-08-24 10:05:17 880

原创 【速成】蓝桥杯嵌入式省一教程:(九)AT24C02芯片(E2PROM存储器)读写操作与I2C协议

R(Read)为1,W(Write)为0。

2023-08-23 10:25:50 3440 6

原创 【速成】蓝桥杯嵌入式省一教程:(八)ADC测量模拟电压

ADC(Analog to Digital Converter),模拟数字转换器,是电子工程师必须掌握的一个内容。由于单片机、计算机等是由0和1组成的,因此其无法直接测量或使用连续的模拟信号,需要用ADC将模拟信号转换为离散的数字信号。ADC的具体原理在此处不做展开,我们需要知道的是,因此,若想要使用ADC测量外界某一量程范围内的电压值,只需要将其输入至ADC的通道,读取ADC的输出值,再用输出值公式反向计算输入电压即可。在圆圈处可以看到,此ADC的分辨率为12位,即它的最大输出为4095。

2023-08-22 10:38:34 1315

原创 【速成】蓝桥杯嵌入式省一教程:(七)定时器输入捕获中断与PWM频率占空比测量

在掌握了这几个概念之后,大家在阅读前几节时对定时器的疑问应该就可以尽数消除。同样,为了提高测量频率的精度,我们将预分频系数设置得尽可能小,计数周期设置得尽可能大。随后,打开定时器中断开关。前文已经讲述过定时器的两个用法:基本定时中断与PWM输出。若要测量占空比,则需要在测量频率的基础上,使用另一个通道作为间接输入,并设置为下降沿捕获。可见PA7引脚同时作为多个定时器的通道,在这里我们选择TIM3的CH2通道。在此之前,需要解释一下前文一直出现过的与定时器有关的概念。这样,我们就完成了在Cube中的设置。

2023-08-21 18:09:18 3669 11

原创 【速成】蓝桥杯嵌入式省一教程:(六)PWM输出

定时器除了用于最基本的定时器计时中断以外,还可以用于输出PWM(Pulse Width Modulation)波,即脉冲宽度调制波形,也就是频率与占空比均可改变的矩形波。考虑到题目要求在5s内均匀升高或降低频率,而我们是通过改变重装载值的方式来改变频率的,为方便计算,我们通常将重装载值设置为100-1(或200-1),这样比较值(或Pulse)的值(或除以2)即为PWM波的占空比。)为80,000,000/(100*200)=4kHz,而所得PWM波的频率与定时器频率一致,为4kHz。

2023-08-20 13:07:55 3262 7

原创 【速成】蓝桥杯嵌入式省一教程:(五)用按键和屏幕实现嵌入式交互系统

在前四节中,我们已经讲解了LED、LCD和按键,用这三者就能够实现一个人机交互系统,也即搭建整个嵌入式系统的框架。因此,尽管你什么都不会,只会使用LED、LCD和按键,也至少能获得省三或省二的奖项。B2的要求相对于B1来说,只是增加了不同界面的不同功能,其本质是一样的。注意,第二个小要求需要切换选择参数,这就需要一个标志变量。结合要求2,当choose=='R'时,对R进行++;要求4的第1个要求与要求3类似,不再赘述。将所有有关LED、LCD与按键的操作封装成函数,在主循环中调用,即可实现一个交互系统。

2023-08-19 18:24:23 3403 7

原创 【速成】蓝桥杯嵌入式省一教程:(四)按键短按、长按与双击

此外,短按、长按和双击涉及到按键的时间长短问题,因此我们需要利用定时器的基本计时功能来计算按键按下的长短。因此,大体可以敲定代码的框架:利用0.01s的定时器中断扫描按键,并在按下按键时开始计时,以区分长短按;然而,由于按键有限,在现实生活中,仅靠几个按键当然无法完成很多指令,于是人们想到了通过一个按键的短按、长按与双击来区分不同的指令,这也是蓝桥杯的考点之一。在这里,我们设置了0.01s的中断周期,因此当按下按键时,在第二次进入定时器中断时,其电平状态就能稳定下来,故需要定义一个变量。

2023-08-18 10:12:52 4794 23

原创 【速成】蓝桥杯嵌入式省一教程:(三)按键扫描与定时器中断

这样,每当时间过去了0.01s,CPU就会进入定时中断回调函数中,运行我们预先写好的中断程序(在此处是读取按键端口的电平,随后执行相应任务),即定时按键扫描,而不是一直循环扫描按键是否按下,这样就为CPU节省下了大量的时间,大大提高了程序的运行效率。在点亮LED时,我们已经使用了GPIO输出模式,在按键识别中,我们将要使用GPIO输入模式。正如打断我们的有可能是电话铃声,有可能是门铃声,也有可能是短信铃声等等,打断CPU的中断方式也是多种多样的,如GPIO外部中断、定时器中断、定时器捕获中断等等……

2023-08-17 15:41:39 1846 3

原创 【速成】蓝桥杯嵌入式省一教程:(二)LCD显示

在嵌入式开发中,屏幕显示是一个非常重要的功能。然而,在蓝桥杯中,比赛方已经为我们提供了与LCD有关的库,这让我们能够简单方便地使用LCD屏幕。如果想要将某变量的值实时显示在LCD屏幕上,就要通过sprintf函数将变量赋值到一个字符串数组中,再通过LCD_DisplayStringLine函数该字符串数组。通过调用lcd.c(在Src文件夹中)、lcd.h、fonts.h(在Inc文件夹中),就可以方便地使用LCD屏幕进行显示。这样就能在LCD屏幕上以指定的背景及字体颜色在第一行显示。

2023-08-16 23:08:58 3060 7

原创 【速成】蓝桥杯嵌入式省一教程:(一)点亮LED

在点亮LED前,我们需要先了解一个重要概念——GPIO(General Purpose Input Output),即通用输入输出端口。可以看到,STM32G431RBT6是通过控制PC8~PC15以及PD2的电平状态来控制LED的亮灭的。如同所有编程入门的第一个教程——打印"Hello world"一样,点亮LED可以算得上是嵌入式开发中的"Hello world",所有的单片机开发入门都从这里开始。另外,LED操作中还使用到了一个非常常用的函数——延时函数,它是以ms为单位进行延时的。

2023-08-15 19:14:54 1835 5

原创 C语言丨数制转换

数值进位制的换算是计算机实现计算和处理的基本问题。例如,将十进制数N转换为j进制的数,其解决的方法很多,其中一个常用的算法是除j取余法。本文就来介绍这种算法。

2022-02-11 23:20:33 4535 1

原创 C语言丨栈(二):链栈

栈是限定仅在表尾进行插入或删除操作的线性表,表尾称为栈顶(top),表头称为栈底(bottom)。栈的最主要特点就是“先进后出”(FILO),或“后进先出”(LIFO)。本文在介绍栈的基本概念的基础上,重点介绍栈的顺序表示及相应的算法。

2022-02-10 23:46:15 3368 3

原创 C语言丨栈(一):顺序栈

栈是限定仅在表尾进行插入或删除操作的线性表,表尾称为栈顶(top),表头称为栈底(bottom)。栈的最主要特点就是“先进后出”(FILO),或“后进先出”(LIFO)。本文在介绍栈的基本概念的基础上,重点介绍栈的顺序表示及相应的算法。

2022-02-09 23:31:05 3525 3

原创 C语言丨约瑟夫问题(约瑟夫环)

约瑟夫问题又称为约瑟夫环,约瑟夫问题有很多变种。本文就以几个经典的约瑟夫问题介绍其几种解法。

2022-01-27 13:54:34 30805 7

原创 C语言丨线性表(四):循环链表

本文在介绍线性表的基本概念的基础上,重点介绍单循环链表和双循环链表及相应的算法。

2022-01-20 16:47:05 752

原创 C语言丨线性表(三):双链表

本文在介绍线性表的基本概念的基础上,重点介绍双链表及相应的算法。

2021-12-28 21:41:33 1297

原创 C语言丨线性表(二):线性链表(单链表)

本文在介绍线性表的基本概念的基础上,重点介绍线性链表(单链表)及相应的算法。

2021-12-26 23:18:11 3663 1

原创 C语言丨线性表(一):顺序表

本文在介绍线性表的基本概念的基础上,重点介绍线性表的顺序表示及相应的算法。

2021-12-24 21:02:41 1654 1

原创 C语言丨函数的递归调用和递归函数

如果一个对象部分地由它自己组成或按它自己定义,则我们称它是递归(Recursive)的。在日常生活中,字典就是一个递归问题的典型实例,字典中的任何一个词汇都是由“其他词汇”解释或定义的,但是“其他词汇”在被定义或解释时又会间接或直接地用到那些由它们定义的词。在数学中,数学归纳法也是递归的一种体现。

2021-12-22 18:56:35 5402 2

原创 C语言丨筛法求素数(质数)

素数(质数)是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数。素数被广泛用于密码学、汽车变速箱齿轮设计、害虫的生物生长周期与杀虫剂使用之间的关系、导弹和鱼雷等领域上,具有重要意义。本文就来介绍求素数的一种方法:筛法。

2021-12-17 13:20:57 12961 8

原创 C语言丨定积分的近似计算

本文分别介绍定积分的近似计算的三种方法:矩形法、梯形法、抛物线法。

2021-12-13 13:54:13 3949

原创 C语言丨求两个正整数的最大公约数

两个正整数的最大公约数(Greatest Common Divisor, GCD)是能够整除这两个整数的最大整数。两个正整数的最大公约数的求法有多种解答,本文就三种方法做详细介绍:穷举法、欧几里得算法(辗转相除法)、递归方法。

2021-12-10 14:14:40 18420 4

原创 C语言丨小 学 数 学(二):高精度乘法

今天让我们来当一回小学生吧~(误)本文解决的问题是如何实现多位数字的高精度乘法。

2021-12-06 23:33:24 1271

原创 C语言丨快速排序法

程序员在程序设计时常常需要对存储在数组中的大量数据进行处理,如排序、查找等。排序是把一系列无序的数据按照特定的顺序(如升序或降序)重新排列为有序序列的过程。对数据进行排序是最重要的应用之一。实际生活中的很多问题都需要对数据进行排序。之前我们已经介绍过了交换排序法、选择排序法、冒泡排序法,这次我们来介绍一种经过优化的排序法:快速排序法。

2021-12-05 14:39:00 2189 3

原创 C语言丨折半查找(对分搜索)

程序员在程序设计时常常需要对存储在数组中的大量数据进行处理,如排序、查找等。使用数据库时,用户可能需要频繁通过输入键字值来查找相应的记录。在数组中搜索一个特定元素的处理过程,称为查找。上次我们已经介绍了一种最基础的查找算法——线性查找(顺序查找)这次我们来介绍一种查找算法:折半查找。

2021-12-01 20:13:05 6020

原创 C语言丨线性查找(顺序查找)

程序员在程序设计时常常需要对存储在数组中的大量数据进行处理,如排序、查找等。使用数据库时,用户可能需要频繁通过输入键字值来查找相应的记录。在数组中搜索一个特定元素的处理过程,称为查找。这次我们来介绍一种查找算法:线性查找。

2021-11-27 17:13:28 2328 2

原创 C语言丨冒泡排序法

程序员在程序设计时常常需要对存储在数组中的大量数据进行处理,如排序、查找等。排序是把一系列无序的数据按照特定的顺序(如升序或降序)重新排列为有序序列的过程。对数据进行排序是最重要的应用之一。实际生活中的很多问题都需要对数据进行排序。这次我们来介绍一种排序方法:冒泡排序法。

2021-11-25 11:22:08 1120 3

原创 C语言丨选择法排序

程序员在程序设计时常常需要对存储在数组中的大量数据进行处理,如排序、查找等。排序是把一系列无序的数据按照特定的顺序(如升序或降序)重新排列为有序序列的过程。对数据进行排序是最重要的应用之一。实际生活中的很多问题都需要对数据进行排序。上次我们已经介绍过了交换法排序,这次我们来介绍一种经过交换法改进的排序法:选择法排序。

2021-11-24 19:39:57 6105

原创 C语言丨交换法排序

程序员在程序设计时常常需要对存储在数组中的大量数据进行处理,如排序、查找等。排序是把一系列无序的数据按照特定的顺序(如升序或降序)重新排列为有序序列的过程。对数据进行排序是最重要的应用之一。实际生活中的很多问题都需要对数据进行排序。这次我们就来介绍一种最简单的排序法:交换法排序。...

2021-11-23 20:34:26 3707

原创 C语言丨小 学 数 学(一):高精度加法

今天让我们来当一回小学生吧~(误)本文解决的问题是如何实现多位数字的高精度加法。

2021-11-21 09:27:25 1564 4

原创 C语言丨格式化屏幕输出(二)——日历

在一些问题中,问题经常规定了屏幕输出的格式,让我们以固定的格式编程输出某些图案或表格,甚至是今天我们要讲的:日历。让我们来看看如何入手吧!

2021-11-13 09:47:02 2098 1

原创 C语言丨格式化屏幕输出(一)

在一些问题中,问题经常规定了屏幕输出的格式,让我们以固定的格式编程输出某些图案或表格。那我们应该怎么解决这类问题呢?

2021-11-11 23:29:29 1056 2

原创 C语言丨比较浮点数的大小

由于计算机所能表示的实数的精度是有限的,通常来说浮点数的大小是不准确的。那么我们要如何比较浮点数的大小呢?

2021-11-06 13:03:43 4322 1

原创 C语言丨检测用户键盘输入数据的合法性

在写程序的时候,我们经常会要求用户从键盘输入数据,以增强程序的互动性。但是,有时因为用户从键盘输入的数据不是程序想要的,会引发程序运行错误,轻则无法运行,重则引发系统崩溃。那么我们应该如何使用户输入数据合法化呢?

2021-11-05 13:42:24 6396 6

C语言教程-小白入门(日历)

可以实现输出从1900年开始任一年的日历

2021-11-11

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除