- 博客(47)
- 收藏
- 关注
原创 STM32 串口通信①:USART 全面理解 + 代码详解
本文深入解析了USART通信的核心概念与应用。首先对比了串行与并行通信的特点,指出串行通信虽然物理线多但数据是按位传输的。重点阐述了USART的功能优势,它支持UART异步模式、同步模式等多种通信方式,并提供详细的功能对比表格。文章还解释了波特率与比特率的区别,以及复用功能和重映射的应用场景。最后给出了STM32中USART的硬件配置代码示例,包括中断模式下的发送接收实现,并详细说明了关键寄存器标志位(TXE、TC、RXNE)的作用机制。通过理论结合实践的方式,帮助读者全面掌握USART通信技术。
2025-05-31 22:37:57
834
原创 STM32 控制 OLED 全攻略(二):实现字符和汉字的显示
本文详细介绍了如何使用STM32通过I2C通信控制OLED显示屏,重点讲解了SSD1306芯片的工作原理、OLED屏幕的显示机制以及相关代码的实现。文章首先回顾了OLED的基本引脚配置,随后详细解释了如何通过SSD1306芯片控制OLED的显示,包括指令和数据的传输方式。接着,文章通过代码示例展示了如何初始化OLED、设置显示坐标、显示字符串和汉字等操作。特别地,文章还介绍了如何通过PCtoLCD2002软件生成汉字的字模,并将其嵌入代码中实现汉字的显示。最后,提供了完整的OLED控制源代码
2025-05-19 19:50:44
1339
原创 别急着点亮 OLED,先把 STM32 的 I2C 通信搞明白
我最近在学oled查相应的代码时,我发现网上的资源和讲解良莠不齐,我现在分享一下我的思路,我会用大概两篇的文章来说一下oled显示字符串、汉字的原理以及代码如何写,最后也会提供相应的我写的项目工程,这篇文章呢,会先讲解iic的原理以及硬件iic的代码如何写,我会一步步教大家的。由于我使用硬件i2c写的,可能会和网上的大部分人的代码不太一样,因为网上的博主们大部分用的是软件i2c写的,还请大家认真阅读下去本篇文章,希望大家有不一样的收获。
2025-05-18 17:35:40
668
原创 蓝桥杯电子赛_继电器和蜂鸣器
本章会介绍一些蓝桥杯中 考的不是那么频繁的知识点,但是最好还是要学一学。后续会写一些关于pwm、NE555、串口等,国赛需要的超声波和一些比较难的,后续再写相关博客。
2025-05-02 12:09:55
888
原创 蓝桥杯电子赛_E2PROM(AT24C02)
这次讲的E2PROM和前面的PCF8591有着千丝万缕的联系,这次的E2PROM也是基于前面的文章中的IIC,所以,如果大家看不懂本章的内容,有可能是前一篇文章中的IIC不会,建议大家先学前一篇的PCF8591,再学本篇E2PROM是一种存储技术,AT24C02是一个2K位串行CMOS E2PROM, 内部含有256个8位字节,CATALYST公司的先进CMOS技术实质上减少了器件的功耗。AT24C02有一个16字节页写缓冲器。该器件通过IIC总线接口进行操作,有一个专门的写保护功能。
2025-04-14 00:03:53
1157
1
原创 蓝桥杯_如何快速记忆数码管的段码
我们都知道,在往届蓝桥杯电子赛的比赛试题中,总能碰见在数码管用字母来表示的时候,我摘取部分试题给大家看一下:break;break;break;break;break;break;break;break;break;break;break;如果大家硬要背诵的话,可能会十分的困难,所以我自己思考了一下如何快速记忆这些段码的方法,需要大家稍微的动脑写一下。
2025-04-05 19:36:16
474
原创 蓝桥杯_PCF8591
在蓝桥杯比赛中提供的板子原理图中,上面这张照片就是PCF8591的原理图,大家仔细观察本章图片的右下角位置,你会发现:P20、P21后面的SCL和SDA,这两个线就是I2C的核心线,I2C需知道的相关底层知识点,如若不理解I2C通信,推荐大家去哔哩哔哩看这个博主的视频【4分钟看懂!I2C通讯协议 最简单的总线通讯!1 SDA:提供信息通道 SCL:提供精确的频率 GND:接地线2 当SCL为高电平时:(1)SDA从高到低的跳变为开始信号(2)SDA从低到高的跳变为结束信号。
2025-04-04 15:46:34
862
原创 蓝桥杯_DS18B20温度传感器
关于DS18B20,他是一个CMOS器件,也就证明了他是一个低功耗的设备,在正式进入这个模块学习之前,我们要知道一个课外小知识:VDD和VCC有什么区别?答:VDD强调用于低功耗及多种电压,VCC通常表示5v,但是他们俩并没有本质的区别,只是使用习惯上有不同而已,大家不必纠结这两个符号的区别我会介绍相关比较重要的点,具体的功能和器件请搜寻其他博主的博客,自行查阅1.DS18B20的温度测量范围从-55℃到+125℃2.分辨率在9位到12位之间,可以由用户自己进行设置。
2025-03-26 20:05:33
1181
原创 蓝桥杯_DS1302时钟
DS1302是时钟的芯片,可以显示对应的时钟和日期,这里有一个前提,需要连接着电源,如果把程序在今天烧录到板子里,然后不连电,第二天的数据并不准确,所以说,如果想要准确的日期,那么需要一直给板子提供电源。这里所说的数据,使用841BCD码来保存并传输,传输八位数据,这八位数据的最后一位,决定着是读还是写;1表示读,0表示写,如果想要真正运行DS1302,需要先写再读。
2025-03-23 11:00:35
1092
原创 蓝桥杯_通过按键控制数码管显示数字
由于中断和定时器相关的知识点略简单,我目前并没有打算写该两部分的内容,如果大家有需要这部分的,可以在评论区反馈,如果需要我会及时补上蓝桥杯中的中断和定时器的部分。大家看这篇文章的标题,按键控制数码管显示数字,首先脑子里要有一个整体框架,我们需要创建两个.c文件,一个是按键key,另一个是数码管seg,然后用main.c文件显示数字即可。
2025-03-16 14:18:22
1096
原创 scanf函数
表示该输入项,读之后不赋予相应变量,跳过该输入值例如:scanf(”%d%*d%d“,&a,&b)当输入1 2 3时,就会把1赋予a,2被跳过,3赋予b。
2024-01-09 23:17:52
644
原创 数据输入输出的概念及在C语言中的实现
1 所谓输入输出是以计算机为主体而言的2 本章介绍的是向标准输出设备显示器输出数据的语句3 在C语言中,所有的数据输入、输出 都是由库函数完成的,因此都是函数语句4 在使用C语言库函数时,要用编译命令#include将有关“头文件”包括到源文件中,使用标准输入输出库函数时要用到“stdio.h”文件,因此源文件开头由以下预编译指令#include<stdio.h>或者#include"stdio.h"stdio是standard input&output的意思标准的输入输出。
2024-01-08 10:40:55
1403
原创 数据结构补充知识点
在这里呢,有一个非常有意思的题,这道题很容易出错在这里,如果正常分析的话,q应该是21 ,为什么最后出现了22呢,那么这里面就有一个意外,由于编译器的原因,他会先运算【(++j)+(++j)】,也就是说他所运行出来的应该是7,那么结果就应该是7+7+8=22,记住吧,应该学到数据结构就能解释通了。
2024-01-07 20:26:45
430
原创 数据类型----基本类型
1 基本数据类型:不可以再分解成其他类型了,是自我说明的2 构造数据类型:一个构造类型的值可以分解成若干个成员或者元素,每个成员都是一个基本数据类型或者又是一个构造类型例如:数组类型、结构体类型、共用体(联合体)类型3指针类型:他的值是用来表示某个变量在存储器中的地址4 空类型:再调用函数时,通常向调用者返回一个函数值,这个函数值具有一定的数据类型,应在函数定义及函数说明中给以说明,例如在前序中,写的int max(int a,int b);
2024-01-07 15:18:16
936
原创 字符指针
将指针指向ch1,通过修改指针p的值,让他的h变成了H,那么ch1的值也被修改了,所以说输出的p和ch1都是大写H,之后,又将ch2的h赋值给了p,那么ch2正常还是小写h。2通常,我们把char数据类型的指针变量称为字符指针变量。字符指针变量与字符有着密切关系,他也被用来处理字符串。3初始化字符指针是把内存中字符串的首地址赋予指针,并不是把该字符串复制到指针中。FE00表示的是指针所对应的内存单元。
2023-12-26 16:59:44
585
原创 指针和二级数组
看上面的代码,我们观察最后两个式子,a+1表示从a[0]行换到a[1]行,然后在加一个*(a+1)就是降级了,从二级指针降到一级指针,我在*(a+1)的基础上,再+1就替换成了一级指针,在*(a+1)+1的基础上最前面在加一个*就会移动到a[1][1]的位置,以上呢就是用行指针来表示二维数组的某个元素。二维数组名代表数组的起始地址,数组名加1,是移动的一行元素,因此,二维数组名常被称为行地址。·int a3,含有三个元素,a[0],a[1],a[2]·元素a[0],a[1],a[2]都是一维数组名。
2023-12-25 13:41:01
946
原创 指针与数组
(1)在C语言中,数组的指针是指数组在内存中的起始地址,数组元素的地址是指指数组元素在内存中的起始地址。指针变量和数组在访问数组中元素时,一定条件下其使用方法具有相同的形式,因为指针变量和数组名都是地址量。一共可以分为两大类,a[i]和*(p+i),又因为p=a,所以说,前面的两大项,p和a是可以互换的。(x+i) 和px[i]具有完全相同的功能:访问数组的第i+1个数组元素。(2)一维数组的数组名为一维数组的指针(其实地址)但指针变量和数组的指针(或叫数组名)在本质上不同,a+1 ,*(a+2) (对)
2023-12-24 18:17:25
358
原创 指针的含义
pa这个含义就是取pa的地址,那么pa是一个虚拟的地址,只是简单的存放了pa而已,所以输出的该是pa的虚拟地址。如果电脑是64位的,不管是int、double、char等,那么都是8个字节。*pa就是指针,最后指向了a=10,所以他最后程序输出是10。pa表示的意思就是这个地址,并不会显示出10这个数字。(2)指针有多少个字节?
2023-12-24 05:32:22
403
原创 字符串逆序输出
逆序输出就是本来abc输出的,然后我想让他输出成cba,那么我们还是要用到for循环,只不过原先是从零开始往上加,这回呢,是从上面往下减。我们观察上面这个图片,我们想要输出olleh,那么我们就要从4开始往后减,所以说应该为n-1,然后i>=0。在最后的最后,我再写一种高级写法,这种方法,是面试的时候经常出的方法———调换位置。那么我们如何去省略倒序后的前面的一堆零,我们要引入后面的一个知识,strlen。然后我们进入下一个层次,如何添加输入的前缀,那么我们假如宏定义,例如这样。
2023-12-19 18:29:35
489
原创 字符数组初始化二维数组
C语言中没有字符串常量,用字符数组处理字符串,字符串结束表示:‘\0’n表示行,行数=一维数组,整个二维数组/单行数组。m表示列,单行总共占据的大小/他的元素类型。putchar是输出字符。
2023-12-19 17:15:15
611
原创 字符数组的初始化
s表示的是字符输出,那么我们可以发现为什么第一行后面有两个问号,在前面的学习中,我们知道字符和字符串之间只差\0,那么如果输出的话,他们俩是不可以相等的,第一行str1他是缺少\0,所以说str1他输出的时候存在问题;第二行为什么就能输出正确呢,因为str2他在中括号里面存在6,但是后面只存在三个字符,所以说后面的他只会用0去填充,虽然说abc是三个字符,但是程序在识别的时候,他的后面存在\0,那么他最后输出的就可以是“abc”了。putchar是单独输出字符的,字符输出函数。
2023-12-18 22:42:55
349
原创 二维数组的定义
因为他是要写出两行三列,那么我们就需要去用两个for循环嵌套,就跟九九乘法表的意思差不多。我们观察这个代码,可以发现二维数组它可以看成两个一维数组的结合,2*3*4=24。在二维数组中,存放顺序是先存放行,在存放列,因为内存是一维的。那么接下来我们进行敲代码。那么,接下来我们打代码。数据类型 [常量表达式][常量表达式]第一个行数,第二个列数。元素个数=行数*列数。
2023-12-17 20:11:57
357
原创 冒泡排序代码练习
什么是冒泡排序,就是让数组按照从大到小,或者从小到大排列出来,我们在排列大小之前首先要先把数组的几个数先列出来,然后再根据数组的所有数进行前面学过的比大小的知识计算,这是我们整体的一个思路,接下来我们一步一步写。一共五个数,所以要比较四次,第一次比较出来一个16,第二次比较出来13,第三次8,第四次2,剩下个1就不用比较了, 我们把比较的次数设成i,第一个for循环是比较次数,第二个嵌套循环一次的比较数量,最后符合条件交换,最后得到第一次的值再进行下一次。我们在这个基础上进行修改。
2023-12-17 12:39:39
458
原创 一维数组的引用和初始化
我们现在理解代码的第七行,我先举个例子,假设有一堆苹果,总价和单价都知道,那么总价除以单价就是数量,在前面我们知道 内存字节数=数组维数*sizeof(元素数据类型),所以用内存字节数除以数据类型就是数组维数,其次代码第十五行,前面有解释过,我在解释一遍,4*6=24,因为a[]是一个数组,他不能表示全部,他只可以数一个个表示。(2)只能逐个引用数组元素,不能一次引用整个数组。(2)static数组没有赋值,系统自动赋值为0。(3)假如给部分数组赋初值,那么后面的自动为0。(1)数组必须先定义,再使用。
2023-12-16 23:46:58
374
原创 一维数组的定义
(1)数组是具有一定顺序关系的若干变量的集合,组成数组的各个变量统称为数组的元素(2)数组中的各元素的数据类型要求相同,用数组名和下标确定,数组可以是一维的,也可以是多维。
2023-12-16 22:18:43
405
原创 continue语句
我们观察这个代码,会发现代码并没有终止运行,仅仅是把符合n%3的结果忽略掉了,后面的照常进行,直到for整个循环循环完再结束。continue结束本次循环,接着判断下一次是否循环,我们上实例,用代码去理解continue。continue直结束本次循环,而break终止本层循环。continue和break的区别就是。
2023-12-16 17:46:34
386
原创 break用法
如果圆的面积大于100就会终止循环,那么如何体现出他只能终结一个循环呢,请看下面这个代码,我们都知道while(1)他是一直循环的,而内层for加入了break就成了终止的了,并没有阻止while循环break只终结了for的循环。如果需要终止while的话,需要在后面加入break才可以,例如这样。但是值得注意的点事break只能用在循环语句和switch当中。break他是用于从循环语句中跳出一层循环体的,提前结束循环。
2023-12-16 13:00:15
407
原创 C语言中的九九乘法表
我们仔细观察这个代码,在第6行代码,我们称之为外循环,第8行代码我们称之为内循环,我们先运行一次i,i=0了,然后再将内循环每个都循环一遍,循环完内循环了,在跳出内循环进入一次外循环,进行完第二次循环再把内循环的j再都循环一遍,直到最外层i循环结束。在这里的思路我就不做过多解释了,自己分析代码便可得知,\t的意思事空格,让输出的每个东西之间加一个空格,这样输出就会更加的整齐,puts(“”);我们在正式进行九九乘法表之前,我们先进行一个for循环的嵌套,那么我进行一个简单的for循环嵌套的代码解释。
2023-12-16 12:31:36
801
原创 三大循环语句
dowhile最重要的是,我们先运行do后面的程序然后再跟while后面的范围比较,但是while循环呢,他是先比较范围,再进行运行。
2023-12-14 22:56:03
762
原创 ifelse语句和switch语句结合
但是大家有没有发现一个问题,我上面的代码存在一定的问题,如果我输入100分的话,他最后输出的会是D,如果想要进行修改的话,那我们需要在case中,再次加入case 10:,就可以正常运行了,switch唯一的不好点就在switch后面必须跟整数,不可以是小数。我们先回忆以前大打过的一个代码,那个按成绩来评ABCD的,我们可以发现如果单独用ifelse的话,写的很长,所以说,我们该思考如何进行用switch语句,进行优化呢。
2023-12-14 15:34:13
634
原创 控制语句——switch
这节课我认为还是蛮简单的,switch我认为比较难的点就是背这个格式,任何但单词和标点符号都不能打错,一旦背会这个switch,我觉得switch语句用的应该还是比较多的吧。(5)break的作用是强行跳出switch体,每个case后面都要有一个break,default分支后面break可以省略。如果说我不加入break,那么就会把每一行的东西输出,break的作用就是跳出语句case。(2)当表达式的值和case后面的表达式值一样了,那么就会执行case后面的语句。基础知识总是枯燥乏味的,直接上图。
2023-12-13 23:40:24
414
原创 if-else语句
那么这两个代码最主要的思想就是,去介入一个新的数据t,就比方说,你有杯A奶茶杯B西瓜汁,你的目的是要把奶茶和西瓜汁调换地方,杯A西瓜汁杯B奶茶,那么你需要拿另一个空杯子,先把其中一杯的倒在空杯子里,然后再把另一杯奶茶倒在刚倒出来的空杯子里,再将最开始空杯子里的饮料倒在现在是空杯子的地方,就实现了交换位置,那么我进行可视化来解释。在这个语句中,最重要的思想就是逻辑思想,我们要带着逻辑思维去学习本篇章的if-else语句。(3)区分if(x=1)和if(x==1),这个地方还存在一点疑问,标记一下。
2023-12-13 12:05:46
1433
原创 字符输入(getchar)和格式输入函数(scanf)
假如说是这样的输入(%d%d%d),我输完一个数字后,我需要先敲一下回车键去输入下一行,直到输入好三行再敲回车才可以产生新的运行结果。1在asc码中表示49,空格表示10,2表示50,这就解释了如果让%c作为格式符,空格也算一位。scanf所支持的格式字符和前面的格式输出函数(printf)一样,记住前面的即可。那么这一类的东西叫做系统的信号 指令,咱们学习将会在linux上学,不着急。putchar:是让他输出的,跟printf有相似的样子。那么接下来讲一下如果用字符该怎么办,%c。
2023-12-12 17:19:39
656
原创 格式输出函数
在后面输出的时候printf(" %s \n",数据),%f就是小数(保留六位小数),%e指数形式的小数,%g跟%f差不多,%g只保留小数的有效数字。一共是12位,%15s就是要输出15位,则前面有三个空,%10.5s的意思就是先保留前五位(hello),然后在输出10位的,那么输出就是前面有五个空的hello,%2.5s就是先保留5位数,hello,但是他要求输出2位,但是2小于整体的数位,所以就直接正常输出,%.3s就是要保留三位,直接输出即可。(9)极为特殊的百分号本身——%%
2023-12-11 16:12:29
727
原创 字符输出函数putchar
这个知识点很浅显,未来会和具体的实例相结合,enjoy looking forward to。这里面putchar(‘\n’)的意思是换行,所以就运算为这个样子,而不是两个挨着的AB。在此我通俗的讲一下,就是把asc罗马数字2的值转化为所对应的字符。参数:c为字符常量,变量或者表达式。功能:把字符c输出到显示器中。返回值:正常,为显示的代码值。格式:putchar(c)
2023-12-09 20:07:09
477
1
原创 运算符的优先级
根据上面的优先级表,应该先运行后面的>的式子,也就是说是第二种情况,最后面的式子z=x+y+z=1>0,逗号运算符他运算的特点是先算最后面的式子,所以说z=1,那么再往回走,因为==的优先级是大于+=的,所以说,先定义y=z=1,所以x=2,再往后算,y就等于x+2=4,最后的答案是x=2,y=4,z=1了。,就说明是取反,按照正常的结果该是1,所以结果就是0了,那么&&是遇见零就截止,那y++就不需要运算,y依旧是0,这里是个易错点,很容易想成y=1,后面运算就比较简单了,请自行思考。
2023-12-09 19:44:32
528
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人