跳转至

微机原理与应用

课程学习内容

<课程学习内容>

任课教师

<授课方式(如是否双语、板书/PPT/其他)、授课水平、给分情况等>

<授课方式(如是否双语、板书/PPT/其他)、授课水平、给分情况等>

分数构成

<分数构成,可具体介绍各部分,如作业情况、实验内容及形式、考试范围及形式等>

<分数构成,可具体介绍各部分,如作业情况、实验内容及形式、考试范围及形式等>

课程笔记

  • 23级 Anakin
微机原理与应用

下载

课程经验分享

受电气学生会学术部邀请,我在这里向大家分享课程《微机原理与应用》的一些学习经验,希望学弟学妹们能够对这门课有一个初步的了解,掌握这门课的学习方法。

首先这门课是电气同学大三上的一门4学分的专业主干课程,它在学分绩点上的比重是非常大的。此课程分为理论和实验两个环节,我上的是徐习东老师的班级,徐老师在一整个课程周期中都非常强调实验的重要性,微机的实验也就是在CCS这个软件上编写代码,应用到单片机TMS320F2812上,实现种种外设的功能。代码的语言是基础的C语言,相信对于学习过C语言的你们来说是没有问题的,课程的重点就在于掌握单片机的原理以及使用方法,能够通过说明书等途径编写全新的单片机的代码。

值得注意的是,这门课有一部分关于单片机硬件的知识是需要记住的,比如CPU时钟结构、输入输出口具体结构等,这些知识的记忆会有助于了解整个单片机的运行机理。如果遇到新的单片机从硬件结构及其原理入手也会有助于代码的编写。这部分内容老师在理论课堂上也会着重介绍,在考试当中也会作为填空简答题来考大家,因此想要拿高分的同学这部分知识一定要记住。其次便是尤为重要的编程过程,几乎每周一次的实验课,需要大家在课后花比较多的时间进行代码编写,作为初学者来说难度是很大的,我个人在学习过程中也是花了很多的时间在每一周的实验课程上。老师在课堂上会讲一些代码块儿,但是要把这些代码块儿组装成一个可以运行烧录没有bug的程序还需要很长的过程,主要是要理解代码的逻辑以及曾今在学习C语言当中未接触过的中断的概念。

下面来着重谈一谈这门课的考试,这门课的成绩主要是由实验考试和理论考试组成,这两者的比重占到80%。其中实验考试的内容就是平时实验课布置下来大家需要掌握的代码,考试的时候老师会出一道题,然后现场编程现场验收,只要平时能够花时间在编程上,这个20分的实验考试是没有任何问题的。剩下60%的理论考试主要题型是填空、简答、汇编、编程。其中填空和简答题就是上述所讲的需要死记硬背的内容,有关硬件部分的知识,这部分可以在考试周的时候来记,考试就完全没有问题了。汇编语言考的是很基础的部分,老师在最后几节课才会开始介绍讲解汇编语言,上课也会告诉大家会考哪些语句,当然题目是全新的,但是就几句汇编,理解用法,理解意义就可以。最后就是编程大题,考的主要就是在实验课程中可能不太关注的那部分代码,CPU初始化、时钟的初始化等等。这些代码在单片机的正常运行中非常重要,务必要一条一条理解记忆。

以上就是我关于微机这门课的经验分享,希望读者在看完之后能够对这门课有个初步的了解,明确学习的方向。

一、 平时实验

爱班的微机理论课前半部分主要学的是51单片机和汇编指令,后半部分简单学了STM32的资源配置,但是关于具体编程的部分更多还是在实验课上通过具体的代码和硬件呈现来学习的。

爱班的微机理论课和实验课是同步进行的,理论课跟不上实验课的进度,刚开始上实验课的时候对于汇编指令完全不熟悉,要看懂老师给的现成的代码都很吃力,要自己编程更是毫无头绪。但是好在实验课上基本都是老师给出现成的代码,我们只需要将代码手敲一遍运行一下就大功告成,少部分时候需要我们自己编程来完善代码。所以最重要的其实是两个部分——理解和模仿,通常老师会先讲解整个代码的逻辑和对应的硬件原理,这个时候最好认真听,听懂整个代码逻辑,之后在抄代码的过程中再理一遍,这样思路就会清晰得多了,潜移默化地就能学会一些基本的编程方法。

总的来说,平时的实验课还是很轻松的,老师非常反内卷,所以平时的实验报告要求也很简单,重要的是在这个过程中熟悉实验平台上包括数码显示、按键等各个硬件电路部分的原理,以及怎么用单片机编程的方式去控制每一个硬件电路部分。

二、 期中大作业

我们这一届期中的大作业是51单片机编程实现定时器的功能。期中大作业要求将先前分散开的每个硬件部分的控制整合起来,去实现一个更复杂的功能,所以先前每个简单的小实验都是在为期中大作业打基础。不过也是在做大作业的过程中,会更熟练汇编语言的指令并掌握一些整体的编程技巧。

首先,微机控制不是单纯的编程,更重要的是实际的硬件控制效果。编程的时候,我们可能会觉得代码能实现设定的功能,但是在真正的硬件控制上的表现却不尽人意,这是很正常的,因为我们编程的时候总是将硬件电路理想化的,比如给引脚赋值为“1”,我们不会怀疑它输出的高电平,但实际上它的驱动能力可能不足以带动点亮某个LED灯。所以基本完成代码的编写之后,其实还要做好心理准备,在硬件测试的过程中可能遇到各种各样的问题,并足够耐心地去辨别出问题究竟源于软件还是硬件。

另外,编写简单程序的时候可能无所谓,但是一旦要编写一个几百行的程序的时候,一定要采用模块化思维。将目标功能尽可能多地拆解成多个子模块的组合,体现在代码上就是尽量将主程序精简为调用子程序的语句,将主要的功能拆分放在子程序中来实现。这样做的好处是将各个功能分块,使得整体结构更加清晰,并且调试过程中,某个功能出现问题也便于更快定位问题并针对性地解决问题。当后期需要增加额外功能的时候,也不需要对原有程序做太大改动,只需要将新功能写成子程序进行调用即可,会大大提高调试和修改的效率。

最后一个小提示是注意汇编指令的规范使用,比如进行位操作的时候需要使用 CLR 来清零,SETB 来置 1 才能正确实现功能,如果使用MOV 指令来赋值的话程序编译的时候不会报错,但是实际上却不能正确实现位操作的功能。虽然是个很简单的小问题,但是由于编译不报错,所以这样的错误其实非常具有隐蔽性。当程序功能异常,但代码逻辑又没有明显错误的时候,要关注一下是否犯了这类小错误。

三、 期末大作业

期末大作业要用STM32编程来实现旋转钟的功能。期末的大作业难度其实比期中高得多,因为这一次面对的是一块完全不知道原理的板子,而且STM32的编程方法也几乎是要自己从零开始摸索的。

刚开始编程是毫无头绪的,切入点其实是硬件原理图,从理解硬件原理开始,到利用特定硬件部分实现简单的功能,最后才是将各种简单功能组合起来实现目标功能。比如说旋转钟,我可以先不管怎么在旋转的时候实现表盘的稳定显示,而是要先学会怎么去控制任何一个LED灯的亮暗。单片机芯片的GPIO口数量有限,而实验中用于显示的LED数量较多,只有一部分LED是直接用单片机的GPIO口控制的,那么其他的LED该怎么控制呢?从硬件原理图中就可以找到答案!从硬件原理图中会发现其余的LED灯是和74HC595 移位寄存器的并行输出端口相连的,那么接下来的问题就是搞明白74HC595 移位寄存器能实现什么功能?又该怎么控制?这些问题的答案可以从相应的芯片手册中获取,基本上也可以在CSDN中找到相应的文章。这样一步步从某个具体功能的末端往前推,就能找到使用核心的STM32芯片进行控制的方法。

基本编程完成之后,要结合硬件测试的效果来不断查找和纠正代码逻辑的问题。记得最困难的还是在代码逻辑和语法没有明显错误的前提下,硬件测试的效果就是不稳定,其中有一个红外过零检测转速的功能总是时好时坏,红外遥控的响应也是不太灵敏,这个时候很自然怀疑是硬件出了问题。但因为板子是自己焊的,就顺理成章地将问题归结于虚焊,一度我都想去重新焊一块板子。最后我偶然才发现问题的解决办法其实非常简单,将能发射红外光的发光二极管和接受红外光的光敏二极管对准就能实现稳定的转速检测,同理,将接受红外遥控信号的光电二极管对准红外遥控的方向就能实现灵敏的遥控响应了。我差点就大动干戈去焊板子,很有可能我重新焊好的板子依然不能实现理想的效果,因为问题的根源根本不在虚焊,而是在光沿直线传播这样一个中学生都懂的道理。所以调试实际上还是一个很难的过程,需要有丰富的经验才能快速定位问题并从源头解决问题,当软件问题能被排除时,可以尝试从硬件基本的原理入手去寻找问题。

最后简单说一下实验报告的撰写,实验报告需要包含最基本的两个部分——实验原理和程序设计说明。实验原理部分可以结合原理图进行图文并茂的说明,对硬件原理的理解是编程的基础,所以这一部分是非常重要的,也能体现出编程的部分是不是自己独立完成的。程序设计说明部分,可以通过绘制一些程序框图进行辅助说明,这样有助于清晰地呈现自己的编程逻辑。

总的来说,微机实验这门课还是非常考验自学的能力和查找资料的能力,老师教的部分和最后要独立完成的大作业之间还是存在比较大的难度跨越的,不过只要找对切入点,你会感受到从毫无头绪开始一点点解决一个复杂问题的成就感。并且这门课是少有的能让你有实际的工程应用体会的课程,你将能把理论的知识实际转化成可视化的成果,并收获到宝贵的动手实践经验。相信大家都能在这门课中有自己的收获!

爱班的微机实验主要学习51单片机和STM32。

一、51单片机

51单片机已经是一种非常古老的单片机了,但它仍适合作为学习单片机的基础,让我们认识单片机“最底层”的代码逻辑,了解单片机硬件部分与软件部分之间的联动。

1.1 汇编语言

51单片机通过汇编语言编写。不同于C语言和python,汇编语言没有大量的库函数,而是通过汇编指令来实现各种功能。在第一次接触汇编语言时,我们对它的指令一定是非常陌生的。老师通常会提供指令合集,或者自行在CSDN上搜索“51单片机——汇编指令合集”。一开始编写代码时,可以通过这份指令合集来找到需要使用的指令,直到慢慢地熟悉。

汇编语言的一大特点是对寄存器的操作。其他语言都可以随意地定义与操控变量,但51单片机的变量是保存在其有限的寄存器中的,只能通过特定的指令来操作,就好像变量有了其实体一般。

前几次的实验通常是比较简单的,但由于我们对汇编语言的不熟悉,因此顺溜地写完整个程序通常是非常困难的。如果对C语言或python比较熟悉,可以先尝试使用这些语言来编写代码,厘清整个代码思路,再“翻译”成汇编语言执行。此外,要熟悉51单片机指令的内在实现逻辑以及指令的限制条件,从而减少在代码层面发生的错误。

汇编语言中的一些指令可以与我们熟悉的编程语言相对应,比如通过MOV指令来进行变量赋值,通过JB/CJNE等指令达成IF语句的效果,通过DJNZ等指令实现FOR循环语句的效果。此外还需活用指令的标号,可以实现函数定义、IF选择跳转等功能。

1.2 51单片机外设

51单片机学习的另一个重点便是硬件外设的学习,如LED灯、按键、蜂鸣器、数码管、点阵显示屏等。这部分内容要根据例程来看,搞清楚例程中每一句代码的作用,将软件与硬件结合起来。可以对每一种外设的使用方法进行整理,方便最后大作业时使用。

1.3 51单片机大作业(期中)

我们这一届的期中大作业是做一个定时器,包括一些要求的功能。这个作业难度不是很大,因为许多功能都是之前已经实现过的。但由于要把所有功能都放到一个程序中,因此率先设计好整个程序的框架图很重要,后面实验报告可能也需要给出程序的框架图(老师可能不会一点点地看代码,但会看框架图)。此外,定时器分为许多工作模式,这需要通过状态机的方式来实现。

二、STM32

STM32是一种非常常用的单片机,通过C语言来编写程序,通常使用CubeMX+Keil来进行工程配置。与51单片机不同,STM32的代码编写通常会使用到许多的库函数,网上也能查到很多的资料。老师在课上可能没有时间来一句句地讲解代码,所以我们需要自己上网查找对应的资料,建议为每一句代码都加上注释,搞清楚每一句代码的含义与作用。

2.1 STM32大作业(期末)

我们这一届的期末大作业是制作一个旋转灯。这个期末大作业难度较高,因为老师一般不会提供太多的资料,只会把大致的原理讲一下,而这时候其实大家对STM32的了解还不够深入,所以在刚开始做的时候会遇到很多困难。从0到1制作一个旋转灯可能看起来非常困难,但可以将整个项目拆解成一个个小任务,从基础功能出发一步步完善功能,最后可以发现每一步之间的跨度都是可以接受的。

旋转灯的电路板需要我们自己对照原理图焊接。这一步需要非常小心,因为焊接不好可能会导致后续的功能实现出现问题(尤其是红外过零检测用的小灯),最后写代码的时候如果发现硬件有问题,就得再重新焊接。

旋转灯有一个功能是通过红外遥控器控制显示变化。可以在网上(如CSDN上)查到相关的代码,调整一下就可以用在我们的STM32程序中。但在实际使用的时候可能会发现红外控制不够灵敏,这需要对代码进行一定优化。

三、其他

其实无论是51单片机还是STM32,它们的重点都包括定时器、中断以及调试。其中定时器的内容同时是理论课考试的重点。STM32的定时器频率可以在CubeMX中设置,需要理解其定时器的工作原理以及使用方法。中断的作用是让程序在某些事件发生时,自动执行一些代码。如定时器每个周期都可以产生中断,执行需要的代码。而在最后的大作业旋转灯中,红外过零检测、红外遥控等重要功能都是通过中断实现的。主程序中通常只有初始化的代码,而绝大部分的功能都是在中断中实现的。

而调试则是在这门实验课中非常重要的一项技能。当你的程序未达到想要的结果时,迅速地找到问题所在是十分关键的。比如当你需要确定程序有没有进入某个循环时,可以在循环中打一个断点,再运行程序,你就能看到程序是否会运行到断点位置。熟练地掌握调试技巧可以大幅提高我们完成实验的效率。

总结

微机原理与应用综合实验是一门具有挑战性的爱班课程,51和STM32的知识点有许多,老师很难详细地讲解到每一个地方,因此我们常常需要自行去查找资料。这其实有一点项目式学习的感觉,通过一个个小项目以及综合性的大项目锻炼我们查找资料并学习的能力,这与后续参与科研项目很像,导师们不会手把手地带领我们,很多时候需要我们自己去探索。在这门课程中,我们可以不依赖"祖传代码",而是一步步地学习,一步步地撰写属于自己的代码,相信大家都能够在这门课程中收获颇丰。

​微机原理成绩构成大概是理论考试和平时分各占50%,平时分主要包含了实验考、每次实验提交的报告内容和实验心得、大作业等,学习内容主要分为理论部分和实验部分,学好微机的关键是实验理论两部分齐头并进,实验能够检验理论内容并加深对理论学习的理解,理论学习有利于能好的完成实验。

​理论方面的学习,两个老师的授课内容会各有侧重,主要是以上课听老师讲为主,一开始上课大概都是不懂的状态,这时候别管懂不懂勤做笔记就对了,随着课程的推进和实验做多了之后(大概也就差不多到期末考试的时候…),对于知识的理解会有一个井喷式的增长,学到的知识全部融会贯通,有种豁然开朗的感觉,这个时候就会发现前期记的笔记是真的重要!

​实验方面关键在于平时的认真态度和思考总结,实验室一般挺吵,沉得下心去做好每一次实验是很重要的,另外老师一般会给一些提高部分和选做部分,最好是都做,最好是自己多动手写程序,因为实验是两个人一组的,别总想着报队友大腿,自己成为大腿岂不是更妙?实验考试基本是对平时实验内容的杂糅和修修改改,考试时间当时是一小时,能够带U盘拷贝自己准备的程序。只要平时实验都自己做,程序提前准备的充分,一般实验考试是可以特别快做出来的。

CC98汇总