- 博客(67)
- 收藏
- 关注
原创 day08DS1302时钟
本案例讲解如何使用DS1302时钟芯片将时间信息显示在LCD上。在Int目录下创建Int_DS1302N.h,写入以下内容。在Int目录下创建Int_DS1302N.c,写入以下内容。在main.c写入以下内容。
2024-04-22 21:06:19 606
原创 day07 51单片机-串口通信
在方式0,当串行接收到第8位结束时,由内部硬件自动置位RI=1,向主机请求中断,响应中断后必须用软件复位,即RI=0。在其他方式中串行接收到停止位的中间时刻由内部硬件置位,即RI=1,必须由软件复位即RI=0。在方式0,当串行发送数据第8位结束时,由内部硬件自动置位,即TI=1,向主机请求中断,响应中断后必须用软件复位,即TI=0。 SM2:在方式1时,如果SM2位为1,则只有在接收到有效的停止位时才置位中断请求标志位RI为1,如果SM2为0,则无论是否接收到有效的停止位都可以置位RI。
2024-04-22 21:02:58 1256
原创 day06 51单片机-点阵led
点阵LED的原理也非常简单,就是LED点灯。例如,我们想要让13列(阳极端)9行(阴极端)的LED点亮,需要13为高电平,9为低电平。注意对于我们的硬件原理图,阳极端通过74HC595芯片驱动,阴极端接P00-P07。如果想让点阵LED显示我们想要的图案,要采用“逐行扫描”的思路:通过74HC595芯片,依次激活每一行的阳极,再通过P0端口选择该行想点亮的LED即可。本案例讲解如何在LED点阵屏上从上到下循环滚动显示“尚硅谷”三个字。本案例介绍如何使用点阵LED显示一排由左上到右下的斜线。
2024-04-22 20:59:37 711
原创 day05 51单片机-外部中断、定时器
单片机中断是一种重要的计算机编程概念,用于处理在程序执行过程中突然发生的事件或条件。这些事件可以是外部硬件触发的,如按下按钮、传感器数据到达或定时器溢出等,也可以是软件内部条件满足时触发的,如某个特定的计算结果或状态变化,如图所示:中断的作用在于允许单片机暂时中止当前执行的程序,跳转到事先定义好的中断服务程序,以处理特定事件,然后再返回到原来的程序流程。这种机制使单片机能够实时响应外部事件,提高了系统的灵活性和响应能力。
2024-04-22 20:57:23 949
原创 day04 51单片机-矩阵按键
在项目的Int目录下创建Int_MatrixKeyboard.h,写入以下内容。在项目的Int目录下创建Int_MatrixKeyboard.c,写入以下内容。本案例实现以下功能:按下矩阵按键SW5到SW20,数码管会显示对应的按键编号。
2024-04-22 20:55:23 679
原创 04矩阵键盘实现计算器操作
ApplicationProgram.h 代码如下。ApplicationProgram.c 代码如下。Int_DigitalTube.h 代码如下。Int_DigitalTube.c 代码如下。
2024-04-09 09:24:38 829
原创 day03 51单片机
随着我们的代码越来越复杂,我们的main.c越来越长,阅读性也越来越差。如果将来开始做项目,我们可能要同时操作好几个模块,这种情况下我们无法再把代码写到同一个文件,而是要分模块管理代码。具体实现方法,就是将源码按照不同功能和模块,拆成若干部分源码,再用头文件相互引用。
2024-04-07 20:17:45 978
原创 day02 51单片机
打开STC-ISP,选择软件延时计算器标签,指定时长1ms,指令集选择STC-Y1(说明:STC89/STC90单片机都是Y1指令集),即可得到1ms的延时代码。DIG.2的编码是001,也就是1表示,依次类推,每个片选和对应的编码都是差1。所以后续想显示某个数码管时,需要对应的片选减1,才能和编码对应上。指令周期=1条指令完成所需要的时钟周期(一般12/24/48)。这个案例,我们要让P00引脚对应的LED按照1秒闪烁1次。这一案例,我们让右边数码管的左1位显示数字1。// 关掉当前数码管。
2024-04-07 20:15:43 960
原创 day02 VS Code开发单片机
VS Code 用于编辑 C 代码,我们还需要 C 编译器来运行 C 代码,所以安装 VS Code之前我们需要先安装 C 编译器。这里我们使用 MinGW-w64(Minimalist GNU for Windows 64-bit)。MinGW-w64 是一个用于Windows操作系统的开发工具集,其包含了C语言编译器 GCC(GNU Compiler Collection)。官网地址:https://www.mingw-w64.org。
2024-04-07 20:09:18 953
原创 day05 设计计算机硬件
总线,在前面的课程中我们有过介绍,但是没有相应的实物,看起来比较抽象,其实总线就是CPU和外部通讯的导线,如果我们将CPU结构稍作改造,例如下图:我们将A,str,ld,Dout和Din五根导线分别接上输入和输出,就可以实现CPU和外部数据的交换,而这五根线就是总线,其中:Ø A线为数据总线,用来传输CPU寻址地址。Ø ld和str线为控制总线,用来传输CPU控制信号,表明CPU是打算对地址进行读,还是写。Ø Din和Dout为数据总线,用来传输数据。
2024-03-26 18:18:25 1001
原创 day04 设计计算机硬件
指令的本质就是控制信号的开关。现在已经有11位的信号控制了,如果电路越来越复杂,控制信号会越来越多。每一个控制信号都需要一个2进制位来表示它,现代计算机的指令多达几百上千个,那我们指令占用的位就太多了,我们必须用一种方式简化指令占用的控制位。一个二进制位表示2个数字,目前我们的系统一共有如下9条指令,那么只需要24=16,也即4个二进制位就可以表示。为了后期进一步扩展完善系统,我们选择25,32条指令的空间留有扩展的余地。5个二进制位在这里我们称为操作码,英文缩写opcode。
2024-03-25 20:11:24 552
原创 day03 设计计算机硬件
当要执行将数据RAM的值直接输入到A寄存器时,需要将ALU的A输入设置为0即可,因为ALU的B输入是从数据RAM中直接读取数据,我们选择ALU的运算模式为加,那么ALU的输出S=A输入+B输入(数据RAM的值),我们只需要保证此时A输入为0,那么ALU的输出 = 0 + 数据RAM中的值。上面的电路中,当执行str存储操作的时候,数据RAM的输出其实并不重要,但是这个数据输出仍然会被输入给ALU进行计算,我们不希望这样的情况出现,因此,可以通过控制数据RAM的ld引脚,来控制数据RAM的输出。
2024-03-23 16:41:21 861
原创 day02 设计计算机硬件
通过分析发现,PC计数器累加后,可以从内存中读取数据到ALU进行运算,而ALU的控制引脚一直输入的是00(加),因此,执行的结果是将数据RAM中的数据进行了累加。那如果我们改变ALU的控制引脚,使其进行其他操作,那么,我们的程序就可以进行复杂的运算了。加入一块新的EEPROM,将数据设置为16bit,地址设置为2bit,并输入数据0、0、1、1,对应ALU的加法、加法、减法、减法。右键点击A、B、加法器,减法器,与门,或门,比较器、S,将它们的位数改为16bit,这个ALU的位数就被设置成了16bit。
2024-03-22 18:02:39 1595
原创 day02 计算机组成原理
由科学家冯诺依曼提出的模型理论。基于通用图灵机建造的计算机都是在存储器(内存/寄存器)上存储数据。鉴于程序和数据在逻辑上是相同的,因此程序也能存储在计算机的存储器中。(1)存储器:用来存储数据和程序的区域(2)算数逻辑单元(ALU):用来进行计算(算数运算、逻辑运算、位运算等)的地方。(3)控制单元:对存储器、算数逻辑单元、输入/输出等子系统进行控制操作。(4)输入/输出单元:输入子系统负责从计算机外部接收输入数据,输出子系统负责将计算机处理结果输出到计算机外部。
2024-03-22 17:56:34 633
原创 day01 数字电路基础
D锁存器尽管可以起到保存数据的作用,但是当en信号为1时,D输入和Q输出相当于是联通的,此时如果D信号有波动,Q会跟随波动。问题:当en为1时,D的输入直接影响Q*的输出,为了提高触发器的可靠性,增强抗干扰能力,希望触发器的次态仅仅取决于en的下降沿(或上升沿)到来时的输入信号状态。En=0,与非门特性,G3输出S1=1,G4输出R’=1,因为S’、R’低电平有效,此处都为1,处于高电平,既不置0也不置1,输出保持不变。我们就得到了一个带en输入的D锁存器,其特性为:当en为高电平,Q和D的输入保持一致;
2024-03-20 19:45:50 816
原创 day02 模拟电路基础
信号是反映信息的物理量,用电流作为载体的信号,方便的储存和传递。电信号分为模拟信号和数字信号,模拟信号是连续的,数字信号是离散的。模拟电路就是用来管理和传递模拟信号的电路,涉及对于模拟信号的滤波,放大和传递,除了用到我们上面讲过的一些器件,还要用到一些其他核心元件,例如二极管、晶体管、场效应管等。在嵌入式软件开发中,有关模拟电路的部分,主要是用晶体管和场效应管做开关电路(继电器其封装体积较大,不适合用在集成电路里),至于信号的放大,滤波等是嵌入式硬件工程师的事情。
2024-03-19 19:05:08 1020
原创 嵌入式学习-02_数据结构和算法 (快速排序)
快速排序(Quick Sort)由图灵奖获得者Tony Hoare发明,被列为20世纪十大算法之一,是迄今为止排序算法中速度最快的一种,快速排序的时间复杂度为O(nlog(n))。快速排序通常明显比同为O(nlogn)的其他算法更快,因此常被采用,而且快排采用了分治法的思想,所以在很多笔试面试中能经常看到快排的影子。排序思想:从数列中挑出一个元素,称为"基准"(pivot),重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。
2024-03-18 18:15:04 662
原创 嵌入式学习-02_数据结构和算法 (冒泡算法)
1.1.1冒泡排序原理如下:(1)比较相邻元素: 从数组的第一个元素开始,依次比较相邻的两个元素。(2)交换位置: 如果前面的元素比后面的元素大(或小,根据升序或降序排序的要求),则交换这两个元素的位置。(3)一趟遍历完成后,最大(或最小)元素已移至末尾: 经过一趟遍历,最大(或最小)的元素会被交换到数组的最后一个位置。(4)重复进行遍历和交换: 除了最后一个元素,对数组中的所有元素重复执行上述两步,每次遍历都会将当前未排序部分的最大(或最小)元素放置到合适的位置。
2024-03-18 18:13:50 414
原创 嵌入式学习-02_数据结构和算法 (二分查找)
其原理是通过将数据集划分为两半并与目标进行比较,以确定目标在哪一半中,从而逐步缩小搜索范围,直到找到目标元素或确定不存在。(4)缩小搜索范围: 对于一个升序的数据集,如果中间元素大于目标元素,说明目标可能在左半部分;(5)重复步骤: 重复上述步骤,不断将搜索范围缩小,直到找到目标元素或搜索范围为空。(3)查找成功: 如果中间元素等于目标元素,则查找成功,返回中间元素的索引。(1)选择中间元素: 在有序数据集中,选择数组的中间元素。(2)比较目标: 将中间元素与目标元素进行比较。
2024-03-18 18:13:11 408
原创 嵌入式学习-02_数据结构和算法 (顺序查找)
(4)查找失败:如果遍历完整个数据集仍未找到目标元素,则查找失败,返回一个特殊的标识来表示未找到。(3)查找成功:如果当前元素等于目标元素,则查找成功,返回当前元素的索引。(1)从头开始遍历:从数据集的起始位置开始,逐个检查每个元素。(2)比较目标:对于每个遍历到的元素,将其与目标元素进行比较。
2024-03-18 18:12:39 444
原创 嵌入式学习-02_数据结构和算法 (队列)
队列(Queue):也是操作受限的线性表,限制为仅允许在表的一端进行插入(入队或进队),在表的另一端进行删除(出队或离队)操作。方法1:使用数组实现,入队列时添加到队列的最后,出队列时移除第一个元素同时将右侧的元素左移。可用顺序表(数组)和链表来存储队列,队列可以依照存储结构分为两种:顺序队列和链式队列。可用顺序表(数组)和链表来存储队列,队列按存储结构可分为顺序队列和链式队列两种。方法2:为队列分配的向量空间看成是一个首尾相接的圆环,这种队列称为循环队列。队列中没有元素时,称为空队列。
2024-03-16 16:52:54 502
原创 嵌入式学习-02_数据结构和算法 (栈)
栈(stack),是限制在只能在表的一端进行插入和删除操作的线性表。应用范围非常广泛。生活中也有栈的场景,比如堆叠的盘子、报 ,电梯中的人们,邮局的邮筒等。
2024-03-16 16:51:49 409
原创 嵌入式学习-02_数据结构和算法 (链表)
由于链表中的结点不是连续存储的,无法像数组一样根据索引直接计算出每个结点的地址。必须从头结点开始遍历链表,直到找到目标结点,这导致了链表的随机访问效率较低。物理结构:与数组不同,链表中的结点需要自行组织,向系统申请很多分散在内存各处的结点,每个结点都保存了当前结点的数据和下一个结点的地址(指针),通过指针将结点串成一串。(2)额外的存储空间。链表的每个结点都需要存储指向下一个结点的指针,这会占用额外的存储空间。(2)动态扩展性能更好,链表不需要像数组那样预先指定固定的大小,而是可以随时动态的增长或缩小。
2024-03-15 16:56:24 540
原创 嵌入式学习-02_数据结构和算法 (数组)
可变长的动态数组是一种数据结构,它允许在运行时根据需要动态地调整数组的大小,而不需要提前指定固定的大小。这种动态数组通常被称为动态数组、动态分配数组、动态增长数组或动态内存数组。(2)重新分配内存(realloc): 如果需要改变动态数组的大小,可以使用realloc函数来重新分配内存。C语言中是通过使用指针和内存分配函数来实现动态数组,常见的内存分配函数是malloc、realloc和free。(3)释放内存(free): 当不再需要动态数组时,应使用free函数释放之前分配的内存,以避免内存泄露。
2024-03-15 16:54:25 494
原创 嵌入式学习-01C语言day11
宏定义,就是用一个标识符(宏名称)来表示一个替换文本,如果在后面的代码中出现了宏名称,预处理器会将它替换为对应的文本,称为宏替换或宏展开。
2024-03-14 10:23:57 854
原创 嵌入式学习-01C语言day08
定义一个函数,接收数组名或首元素指针 和 数组长度 作为参数,计算数组的平均数。定义函数,接收一个字符串和字符,统计字符在字符串中出现的次数。
2024-03-12 19:31:54 396
原创 嵌入式学习-01C语言day07
有一堆桃子,猴子第一天吃了其中的一半,并多吃一个。以后每天猴子都吃其中的一半,然后再多吃一个。当到第十天时,想再吃时(注意:此时还没吃),发现只有1个桃子了。
2024-03-12 19:27:59 468
原创 嵌入式学习-01C语言day04
4.输入星期几,如果是星期一到星期三,打印:AAA,星期四到星期五,打印: BBB,星期六到星期日,打印CCC,如果都不是,提示“输入错误”。编写程序,根据输入的月份和年份,求出该月的天数(1-12), 就是需要考虑闰年(2月份 29)和平年(2月份 28)。判断一个整数是否是水仙花数,所谓水仙花数是指一个3位数,其各个位上数字立方和等于其本身,例如:153 = 1。1、实现判断一个整数,属于哪个范围:大于0;(获取用户输入的整数)
2024-03-12 19:15:27 400
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人