经常看到有人在群里、论坛里问:如何学习单片机? 我经常看到有人说自己学习了几个月却没有任何进展。 当然,由于每个人的文化水平和个人理解能力不同,学习会快一些或慢一些,但我觉得最重要的是学习方法。 一个好的学习方法可以帮助你事半功倍。 这里我就谈谈我学习单片机的经验和方法。
2005年,因为用BH1415芯片做FM发射电路,需要单片机控制,所以我开始使用单片机。 虽然我读书时曾把它作为作业学过,但它已经丢失了快10年了。 基本上都忘记了,还不如从头学起呢。 当时买了一个实验板,功能很简单,功能比论坛实验板少。 还有一个针对SST芯片的模拟器,也比较简单。 然后我就开始写大家都知道的流水灯。 万事开头难。 第一个程序基本上是从别人那里抄来的。 我查了一份快速入门学习材料并编写了第一个程序。 然后,我在模拟器上一步步观看运行结果。 每一步的执行,效果都会体现在硬件上。 很快,我对单片机的运行有了非常感性的认识。 这和只看书然后想象操作是什么样的不同。 完全不同的事情。 然后,又对其他方案进行了进一步的研究。 一个月的时间,我基本熟悉了51的各种硬件资源,了解了流水灯、数码管动态扫描、中断等之后,我就写了一个综合的程序,就是我在论坛上发布的时钟。 通过这个程序的编写,我的编程水平有了很大的飞跃。 之后你会逐渐学会编写更多的程序,控制各种外围设备等,通过编写程序不断提升自己。 学完汇编之后,我转而学习C语言。 因为之前没学过C语言,一切都很陌生,所以我就按照学习汇编的方法。 花了3天左右的时间,基本上对C语言有了初步的了解。 了解了,然后尝试写上面提到的时钟,以汇编程序为参考,用C语言来写。 花了几天时间完成了程序,也实现了从汇编编程到C编程的转变。 转型。 然后,我用C语言编写了外围设备的控制程序,以熟悉C编程风格。 到现在为止,基本上都是C语言编程,汇编也一直作为调试程序的辅助工具。
下面我总结一下我的一些学习经历和感悟:
1、万事开头难,勇敢迈出第一步。 一开始,不要总是给自己找借口,说KEIL建不了项目,没有实验板等等,遇到困难的时候,要一一克服。 如果您不知道如何构建项目,请先学习它。 这方面有很多在线教程。 找找看,多做几次就明白了。 然后就可以参考别人的程序了。 即使你复制它们也没关系。 写一个最简单的就可以运行了。 首先,培养自己的感觉,了解编写程序是什么样的。 无论你写一个大程序还是一个小程序,你要做的过程都没有太大的不同。 您必须构建一个项目,配置项目,然后构建一个程序,将其添加到项目中,然后编写代码,编译,生成十六进制,将其闪存到微控制器中,然后运行它。 您必须熟悉这套程序。 个人认为学习板还是有必要的。 编写一个程序并运行它以查看结果。 学习效果会好很多。 模拟器取决于您的个人需求。 微控制器注重理论和实践。 光看书而不实践是学不到的。
2. 用到的知识点才学,暂时不用的放一边。 这是一本厚厚的书,读完让人头晕目眩。 学完后一部分,前面的部分我都快忘记了。 因此,最好与实际程序结合起来,使用时才阅读。 不用说,你必须读这本书。 从第一页开始阅读,读完之后开始编写程序。 比如你写《流水灯》,就不需要读中断的知识。 专心学习《流水灯》就可以了。 这是把整本书拆成几部分,一点一点地咀嚼。
3、不要只读、写程序,一定要自己写。 一开始,如果你什么都不懂,你可以照搬别人的程序,看看每句话是用来做什么的,达到什么目的,运行后的后果是什么。 明白了之后,你还要自己去写,你会发现,原来别人的程序很容易看懂,而我自己写的时候却一句话也写不出来。 这就是差距。 。 。 当你能自己写出来的时候,就说明你真正理解了。 。 。
4.你必须学会如何调试程序。 很多人写程序,写代码,然后运行起来,结果不是自己想要的,就头晕了。 然后他们去论坛发帖子,把程序贴出来,问:为什么我的程序不能正常运行? ? 然后就等着别人给你分析吧。 这是一种非常不好的行为,你应该学会发现问题并学会如何自己解决问题。 这需要学习如何调试程序。 例如,在KEIL中,可以设置断点、查看寄存器内容等,这些都是调试程序的方法。 当你发现自己编写的程序运行结果与想象的不一样时。 ,可以单步执行,或者设置断点,然后跟踪查看相关寄存器的内容,看看程序运行过程中是否有偏差,找出影响结果的因素,并进行修正。 这个过程非常重要。 通过程序调试,可以学到书本上无法获得的知识。
5. 寻找解决问题的思路比寻找代码更重要。 我们使用微控制器来控制外围设备以达到我们心中的目的。 这是一个问题。 如何编写程序来控制设备按照你想要的结果进行操作,这就是解决问题的思路。 要编写程序,首先必须找到解决问题的思路。 对你来说,学会找到这个解决问题的思路比你找到代码更重要。 许多人喜欢寻找别人的代码。 有些人甚至直接将代码复制到自己的程序中。 可以说,这不是一种学习态度,无助于你编程水平的提高。 我很少读别人的代码。 大多数时候我都会看别人的想法。 最好有框图。 如果没有的话,文字解释也可以。 从代码中看出别人解决问题的思路是相当困难的,尤其是大型项目。 编程好像很累,所以现在我明白了我学习时提到的程序流程图非常重要,现在我明白了。 当你知道如何解决一个问题时,剩下的就是安排代码来完成它,这不再是问题。 例如:数码管的动态扫描。 从来没有写过文章的初学者可能无法弄清楚这是怎么回事。 其实就是分时,每个时间段只控制一个数码管显示数字,几个数码管轮流显示。 ,由于速度高,所有数码管在人眼看来都是明亮的。 明白了这一点,事情就容易处理了。 剩下的就是你安排每个数码管依次显示相应的值即可。 显示数字,然后延迟一段时间,然后显示下一个数字并延迟。 你知道情况就是这样。 实际程序中,我们只需要这样做:发送段码到段口,然后打开位选显示一个,延时一次,然后关闭位选,然后发送段码,然后打开另一个位选…就是这样。 有了解决问题的思路,我们就可以把问题分开,一一解决。 如果我们不了解动态扫描的原理,不知道怎么做,那么这个程序永远写不出来。
6、开动脑筋,利用多种方法不断优化自己的程序。 考虑实现相同功能的所有不同方法。 这是一个实践和提高的过程。 一旦解决了一个问题,那么再想一想,是否可以用不同的方式来写,实现同样的功能,或者说,你写的代码是否可以更加精简,更加方便。 程序执行效率更高,这个过程是一个进步的过程。 很多知识和经验的获得,不是直接写在书里让你读就能获得的。 需要你自己去实践,开动脑筋,积累经验,提高自己的编程水平。
7.看看别人的代码,学习别人的想法。 这在学习的早期阶段非常有用。 通过看别人的代码,尤其是有多年编程经验的人写的具有一定水平的代码,可以快速提高自己的编程能力。 同时,你还可以结合别人的编程技术。 ,结合自己的想法,写出更高层次的代码,并从中取得进步。 但要注意不要把学习变成抄袭,更不要以为抄袭后就学会了。 这样做只会让你退步。
8.尝试编写一个综合性的应用程序。 从流水灯开始,到动态扫描,再到中断,可以尝试写一个时钟等综合应用的程序。 不要低估时钟。 写好它并不容易。 它包含了大部分单片机的知识,比如按钮(IO读取)、动态扫描(IO输出)、中断等,如何协调各个功能模块的正常运行是程序员需要学习的。 当你单独编写一个函数时,例如,读取击键,你可能会发现这很容易,因为你的程序除了读取击键之外什么也不做。 但当你把它与其他功能混合在一起时,如何让整个程序运行过程中每个部分都能正常工作,就不是像写个按键来读那么简单了。 功能模块可能会相互影响。 例如,你需要让数码管不仅可以显示,还可以处理按键读取。 如何让两部分正常工作,是一个协调的过程。 当你具备这种处理和协调能力时,你才刚刚开始。
9. 专注于培养解决问题的能力,而不是专门关注你写了多少代码或做了什么。 “学习微控制器的重点是学习解决问题的思路,而不是局限于特定的芯片类型和语言。” 这一直是我的座右铭,这是我在研究微控制器的多年中学到的。 我经常看到有人说“你会驱动XX芯片,你太棒了”、“你做过XX项目,你太棒了”等等,其实这是非常片面的。 做过XX芯片、XX项目只能说明你做了这个项目,只是你的表现,并不代表你的能力一定高。 真正的能力应该是:“当遇到以前没有解决过的问题或设备时,能够利用所学的知识快速找到问题的解决方案”。 这就是能力。 编写程序的过程就是一个创造性的过程。 几乎没有完全相同的项目。 每次你遇到他们,他们几乎都是不同的。 所以你拥有的一定是面对新项目时的创造能力,而不是炫耀你过去的技能。 你做了多少个项目? 当然,表现也可以从另一个方面体现你的经验和水平。