姓名:李浩然
学号:16030410020
转自:http://www.51hei.com/bbs/dpj-39925-1.html(有删改)
【嵌牛导读 】:在大学的很多课程中,老师都经常提到关于单片机的内容,但由于许多大学生都是初次接触这方面的内容面对这种问题,我都是不做回答,因为确实没法回答,但是问得人多了,不免引发了自己的思考,下面,我把我的学习经历分享出来,以供初学者参考。
【嵌牛鼻子】:微机原理、51单片机、汇编语言学习、流程图
【嵌牛提问】:怎么才能学好单片机?应该从哪些方面入手学习,流程应该是怎么样的?
【嵌牛正文】:
一、启蒙阶段
大一的时候,学习的是电路基础和模电数电,电路基础上,做一些诸如电机正反转的电路,模电数电课上,就自己做功放、电源等小制作,当时也是凭着自己的兴趣,做起来很认真,但实事求是的说,理论知识没记住多少,只能说,了解个大概。
二、学习微机原理
当时我们讲的是8086,这对了解计算机结构是不可或缺的,我也是在那时候起,接触到了汇编编程
三、汇编语言学习单片机
大二的时候,开始学习51单片机,当时我那届学生,开设的都是汇编语言教学,课程上,做得也都是可以用软件仿真的小设计,差不多学了三个月后,掌握了基本语法和单片机寄存器(如果有学习8086的基础,三个月的时间足够了)功能,就做一些实物,那时候,认识到,做实物和仿真的区别如此之大。
四、进阶
认识到仿真和实物的巨大差别后,我就放弃了仿真学习单片机的方式,转而通过实物。我的第一个作品是篮球计时计分器(不是课程设计,是真实的作品),当时很多东西都不懂,只能自己去查资料,比如说,74HC245,我那时候第一次接触,就查百度了,还有三极管电路等等,都是百度查到的,因为有大一打下的基础,电路图一看就懂,剩下的就是焊接实物测试了。拜良师所赐,我的焊接技术在速度和质量上,都还可以,所以,可以在很短的时间内,可以完成硬件测试。
自主学习的主要过程就是查资料了,对于一些基础的资料(IC参数等),网络上都是现成的,如果看不懂,那谁也没办法。问题是,为什么我就可以看得懂呢,这就又要回到我大一的时候所学的课程,那时候读书还算用功,培养了这种学习能力。换句话说,哪怕以前你是搞文科的,只要有学习、理解的能力,那么到另一个领域,也不会觉得无从下手。
然后就是编程了,很多网友问我数学是不是很好,我只能表示惭愧了,高中的时候,我的数学分数都在40分左右(满分150),大学后,在30分左右。但数学不好,不代表不能编程,哪怕是用汇编语言。
那么,如何编程呢?有人说,先画流程图,然后再写程序、调试。我想,这是数学比我好的人说的,我的方法如下:
1、用文字描述自己需要的功能(假设功能大于2)
2、拆分出各个功能,用文字描述每个功能是如何实现的
3、完成各个功能的程序,并做好测试,对于我来说,如果了解单片机的工作方式,那么编写程序其实就是把汉语翻译成汇编语言。
4、修改每个功能模块的程序,尽量让程序简短,并且预留好和其他功能衔接的功能(接口、变量等)
5、合并简单功能模块,复杂功能逐一合并,每次合并做好程序备份,以便纠错
6、如果上述工作做的足够好,那么可以直接得到想要的结果,我的程序往往都是写完了就可以用,这是建立在部分模块程序的完美基础之上的。
如果是设计了独一无二的作品,比如说我的立方光(我是独立设计的原理和程序,不管是新版还是旧版),那就在第一条补充一条:构思,这需要你对单片机很了解,预想如何实现,会遇到什么样的问题,以及解决的方案。立方光我构思了2个月,真正做实物的时间,只有一周。等到了新版立方光问世,我也是用了三周构思,一周做实物。
五、学习c语言
通过一段时间的学习,我认识到了汇编语言的优越性,也认识到它的缺点,这点我们稍后再说,先说一下我现在学习c语言的情况。
因为之前有了做实物和编程的基础,我就通过项目来学习C,比如,做一个温度显示,用到了18B20,就自己百度资料,至于程序,我就找了开发板上现成的(说到这,买个开发板还是很必要的,要的是程序)。第一次接触C编程,VOID是啥都不懂,那就百度吧,可以说,一个程序,我要百度很久来理解里面的内容,不懂就是问师弟(他们现在是学C的),差不多一天的时间(包括查资料),程序也就完成了,当然,我还优化了原程序,自己改写后的程序比以前更简短,占用RAM更少,因为之前是学汇编的,一眼就看得出,程序改如何优化。
以上就是我的学习经验了,在这里我还是建议大家,要先学汇编语言,这没坏处,比如我,因为有汇编的基础,学起c来就觉得很上手,特别是自己可以写出更优化的程序。但有人说,汇编难学,就算学了,以后编程也用不到。那么我要说,我的立方光程序就是汇编的,怎么用不到了?很多单片机的参考资料,也都是以汇编作为原始资料的,你不懂汇编,怎么学习新的功能?学了汇编后,你会知道,单片机可以做哪些事情,哪些事情不能做,以及如何做好一件事情,这是单纯学C的人体会不到的。
那么汇编语言和C语言比起来,优劣势在哪里呢?我根据我的学习经验,写一点个人心得,仁者见仁智者见智,各位也可以发表自己的看法。
汇编做为测试程序最合适不过了,比如你想测试最小系统的好坏,那么随便更改一组IO的输出就可以了,用汇编的话,写三行足矣。如果测试某些IC的好坏,特别是需要脉冲的模块,那么汇编就更有优势,可以精确的控制时间,而且代码量极短。最后就是在RAM占用上,汇编语言,总是把RAM的占用在最低,而纯学C的人往往忽略这一点,都是想用多少变量就定义多少变量,对于RAM小的可怜的单片机来说,是一种灾难,在实际生产中,往往选用的都是廉价单片机,IO和RAM、ROM资源都很小,没有多少你发挥的余地,如果你的程序可以让公司把40P单片机换成28P的单片机,那么PCB板就节约了,如果你的程序能从2K简化到1K,那么单片机的购买成本也会降低,对于企业来说,一个板子省一毛钱都是巨大的利润,所以说,你程序的好坏,是影响的企业利益的,何况很多人也想自己创业呢!至于说,如何才能优化程序、写出最短的程序,那必须先要对单片机有足够的了解,而学习单片机的内部原理,是非汇编不可的。加上有人学单片机是为了向嵌入式进阶,那么学习汇编就是更是必不可少的了。C语言的优势我就不多少了,现在几乎都是在用C编程,我最近在学习C编程,也体会到了C强大,但这不代表我以前学的汇编就浪费了,比如stc的eeprom程序,官方给的就是汇编,可实际来说,写成C更好,如果你不懂汇编,自然也无法翻译这些程序,谈何C的应用?关于这两种语言的话题,我就不再往下说了,免得又引起口水战,如果想学单片机,我建议学C,如果你想学好单片机,那就先学汇编再学C,这就我给初学者的建议。最后要说的是,汇编编程,非常锻炼人的思维,这也就是为什么都说汇编难学了,如果你在汇编上有一定的编程能力,那么再掌握其他编程语言的时候,学习过程就会变得很容易。
我想写到这里就差不多了,学单片机没什么窍门,作为一门知识,学它和学其他科目都用共性,谦虚、严谨、勤劳是必须的,不同的是,仅仅靠兴趣维持是不行的,它带给你的困难会很快让你失去兴趣,单片机,要的更多的是毅力,面对困难,只有勤劳,而不是所谓的灵感。大多数人,都是经历几十次失败就停手了,我不是很聪明的人,我经历最多的失败足有300多次,我的成功,都是源于我的坚持,坚持正确的思路并持之以恒!
希望这些文字或多或少的给初学者一些帮助, 早日入门!