从单片机初学者迈向单片机工程师第二版第一章 究竟该如何学习

power_mcu 2013-01-02 04:41:25
走进图书城,面对整排的单片机类技术书籍,看着一个个陌生的单片机型号,你是否茫然不知如何选择?就单片机内核体系结构而言,有51单片机,AVR单片机,PIC单片机,MSP430单片机, ARM系列内核等等。除了这些广为人知的之外,还有很多兼容上述某些内核体系的单片机。选择何种单片机作为入门学习的对象,往往成为困扰初学者最大的问题。我们可能道听途说,某某型号的单片机功能很丰富,某某型号的单片机市场使用量大,某某型号单片机抗干扰强。这些信息都可能导致先入为主的观念,对初学者选择单片机型号进行学习产生影响。是否有必要把这些单片机都学习一遍,才能信心满满的去面对工作中的挑战?答案是否定的。

单片机的学习并不能拘泥于某一体系的具体某种型号的单片机。而是通过某一种单片机的学习,掌握单片机程序设计的思想。从而在后续的开发工作中,以不变应万变。如果掌握了具体的程序设计思想,学习一种新的单片机只是需要了解其相应的寄存器设置即可。对于底层硬件驱动程序以及上层应用程序的编写均可以套用以前学习过的思想。这样无论未来工作中接触到何种单片机,均可以在很快的时间内上手掌握。只有达到了这样的地步,方能真正称之为掌握了单片机。

对于编程语言的选择,也是困扰初学者的一个大问题。君不见,电子专业论坛上面,每每时隔不久就会冒出“单片机编程到底是选择汇编语言还是C语言?”之类的帖子。而且这些帖子一旦出现就会成为众生争论之地,但除了一番口水战,最终无法给出一个确切的定论。汇编语言由于是直接操作硬件,在对时序要求精确以及代码精简和讲究极端效率的地方可以派上大大的用场。但是这也并不是表明用汇编语言编写出来的程序就一定是最优的程序。程序的优与否取决于程序编写者的实际能力,优秀的程序员才能编写出高质量的代码。就好像一把宝剑在手,但是还是需要功夫厉害的人才能发挥它的作用。虽然汇编语言可以完全控制底层的操作,知晓单片机每一步指令的执行流程,但由于它艰涩难懂,对于复杂数据结构操作以及算法实现非常繁琐,因此在需要定义复杂数据类型以及实现各种算法时候往往会选择另外一种高级语言:C语言。C语言恰好弥补了上面汇编语言所表现出来的缺陷,在对复杂数据结构定义和操作运算以及编写各种算法的时候,编写的代码可读性非常好。此外,C语言更大的好处在于其良好的可移植性。不管是何种体系结构的单片机,只要它的开发环境支持C语言开发,那么我们编写的程序模块就可以在不同的单片机之间进行移植。(虽然不同体系结构的单片机C语言编译器或多或少的对标准C语言进行了扩展,但一般都是兼容标准C,只要在设计软件模块的时候尽量避免使用这些语言扩展功能,那么编写出来的代码的就是可移植的)。然而汇编语言却没有这个优点,这是因为每一种体系结构的单片机汇编语言都是不同的,这就注定了它只能专用于某一特定体系结构的单片机。因此对于初学者的建议就是选择C语言进行单片机的开发。在对C语言熟练掌握后再去了解学习汇编语言,以便在需要C语言和汇编语言混合编程的场合使用。

对在校生而言,掌握单片机应用技术对于未来的工作来说可谓至关重要。而对于已经工作的工程师如果因为工作需要使用到单片机,如何才能最快的拿下它,却也是颇为头疼的事情。几乎绝大多数的人都会选择一款市面上出售的单片机学习板(我颇不习惯称它们为开发板,因为它们中的大多数教授给你们的实战开发技术实在太少)。对于经验丰富的工程师来说,这是最快的上手方法。因为他已经具备丰富的单片机应用经验,面对一款新的单片机,唯一的区别在于外设资源的多少,寄存器如何配置,开发环境如何搭建等等,通过学习板可以很快的了解到这些,从而应用到新的项目中去。而对于在在校生和初次需要使用单片机的工程师来说,这并非是最好的办法。君不见众多买了学习板的人,仅仅只是跑了几个demo例程之后就扔在一边吃灰去了,抑或是发现做完了所有的外设实验依然发现自己头脑里面没有一点概念,面对实际的工作需求,无法将其转换到具体开发设计思路上面。一方面是由于单片机应用与具体的应用联系非常紧密,并非独立存在,需要众多的基础知识作为支撑,如模拟电子,数字电子,PCB LAYOUT等知识在设计电路板的时候均需要有一定程度的掌握,方能设计实际可工作的电路系统出来。此外,因为单片机系统需要编写程序去控制整个系统的运转,因此,又需要扎实的的C语言,数据结构与算法,操作系统原理等等基础知识,方能设计出优秀的控制程序出来。综上总总,学习单片机应用技术并非是一蹴而就,而是一个反复实战应用,总结,反思归纳的过程。掌握的东西越多,看待同样一个东西眼光就会不一样。正如修禅一样,初始时候看山是山,看水是水,一段时间后,看山不是山,看水不是水,而最终有所悟的时候看山还是山,看水还是水。因此对于基础了解不是那么全面的在校生以及工程师来说,难度不可谓不大。另外一方面,市面上面为了推销自己的单片机学习板从而喊出的十天学会单片机,十天学会XXX的口号,让整个氛围都变得异常浮躁。学习者以为真的就是如此简单,在发现并非如此之后,往往会学习劲头锐减。因此,若是真的想从事电子相关的行业,一定要摒弃此浮躁心态,不积跬步,无以至千里,不积小流,无以成江河。

我时常在论坛看到有如此初学者发的帖子,大意如下:照着学习板例程手册学完了整个单片机学习板上面的例程,还是感觉没有底,还是觉得自己啥都没有学会,到底该如何学习单片机。归根到底,就是实际应用的太少,总结反思的太少,想急于求快求成,而忽略了太多基础的东西。偶尔闲暇的时候,我也会回想起我的学习过程中的那些点点滴滴。那个时候大一,在图书馆了解到有如此一个东西之后,立即被吸引,兴趣大增。立即自己动手买齐了搭建最小系统的元器件,搭建了第一个单片机的最小系统。当第一行汇编代码被烧写进单片机,洞洞板上面的LED按照程序逻辑被点亮时候,那个欣喜的心情至今仍然记得。也许现在的初学者永远也体会不到我们当年的那个兴奋劲。不管怎么说,兴趣始终应该是第一个老师,尤其是在知识更新非常快的电子技术领域,如果没有足够的兴趣,很难够静下心来去学习繁杂纷呈的电子技术知识点。所谓初生牛犊不怕虎,随后校里面组织的电子设计大赛,我自己选题,搭建电路,第一次学习用C语言来编写控制程序(之前都是汇编),在短短十来天的时间里面,掌握了基本的C语言用法,以及一些程序上面的设计思想(当然是后来总结时候才意识到的,当时就想着如何能够实现系统所需要的功能),至此便走上了C语言的康庄大道。不得不说,有时候有压力才能够更有冲劲。也许没有给自己设定参加电子设计大赛的目标,我还仅仅只是一个爱好者,后来的进步也许就没有那么快。

今天的学习者是幸福的。因为你们踩在前人的肩上。网络上有足够多的入门学习所需要的资源。而你只需要投入一腔的热情以及持之以恒的努力,定当会有所收获。对于在校的学生来说,因为时间比较充裕,建议最好自己动手搭建整个学习中所涉及到的电路模块,这样既可以加深认识,又可以提高动手能力和解决分析问题的能力。而对于工程师来说,也是尽可能的多动手,纸上得来终觉浅,践行相较之下会提高整体认知能力。

至于选择何种单片机的问题,我觉得这个问题并不是太大,毕竟单片机应用的精髓在于软硬件配合,电路的设计,软件设计的技巧与思想方法才是至关重要的。而单片机只是一个载体罢了。只要精通熟悉了一种,掌握了这些思想与方法,任何单片机的应用都不是问题。因此,51,AVR, PIC或者MSP430都是不错的入门选择对象,在熟悉了这些之后,可以考虑学习CORTEX-M3内核的32位单片机,扩宽知识面,在工作中应用更加得心应手。至于是否学习ARM9及以上的内核的微控制器,则因人而异了。如果你以后想从事嵌入式linux开发,则可以自行选择某公司芯片进行学习,涉及ARM9以上的微控制器时候一般都会跑操作系统,如linux系统或及其变种系列或者CE系统等等,注意这里一般会分两个方向,一是底层驱动开发,二是上层应用开发。按自己喜好选择,底层驱动开发则会涉及到系统内核驱动层,以及具体的硬件知识,而上层应用开发则与PC程序设计无太大区别,当然会有很多资源上面的区别,如在设计上层开发时候,系统的效率,内存的占用都是需要考虑的。不建议初学者一上来就学习ARM9 以及操作系统,万丈高楼平地起,先把基础打扎实,再去学习则会事半功倍,否则学习过程中很多坎坷会大大打击你的积极性。

这一系列的文章不会是简单的带你入门认识单片机,已经有很的资料可以帮助你完成这个入门过程。而我要做的是,让你更快的转变思想,从工程师的角度,实际工作开发应用的目的来带你进阶。因此如果有很多概念你不清楚,则你需要自行寻求资料弄明白,这个过程也是学习的过程,只有通过这个过程才会将基础打扎实。所以我假定你至少对单片机有所了解,对C语言有所了解,基本的电子电路知识。剩下的,只需要紧跟我的教程,一步一步的学习。

学习是一个苦并快乐的过程,贵在持之以恒,那么,收拾好心情,准备好兴趣,让我们抛掉畏难的心理,一起叩开单片机程序设计的大门,走向工程师之路。

从单片机初学者迈向单片机工程师之路正式启程……

我在等你。

PDF版本:http://download.csdn.net/detail/power_mcu/4951780
...全文
631 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
weilaiqing 2013-01-04
  • 打赏
  • 举报
回复
我第一个LED是在面包板上实现的,除了不用焊接,其他的都一样。现在也只是能点亮Led而已:(
weilaiqing 2013-01-04
  • 打赏
  • 举报
回复
引用 1 楼 lr2131 的回复:
看了觉得很有感触,有很多观点很认同。只是关于网络资料这一点,对于初学者说好也好、说不好也不好。因为资料太多,反而让一些初学者无所适从。初学者需要从中选出合适的资料,也就是说选准了需要看的资料下功夫精看,其他的不要看或者作为参考,等把手头上的资料搞透了再去看其他同类的资料,就很清楚了也不会花很多时间。也就是说阅读资料也是需要分主次的。
这个选择对初学者来说,真不好选择。有些东西经历过了,才知道。现在基本两眼一抹黑,很难选择:(
lr2131 2013-01-03
  • 打赏
  • 举报
回复
来学习一下。 看了觉得很有感触,有很多观点很认同。只是关于网络资料这一点,对于初学者说好也好、说不好也不好。因为资料太多,反而让一些初学者无所适从。初学者需要从中选出合适的资料,也就是说选准了需要看的资料下功夫精看,其他的不要看或者作为参考,等把手头上的资料搞透了再去看其他同类的资料,就很清楚了也不会花很多时间。也就是说阅读资料也是需要分主次的。 另外学习的过程中确实应该多结合实际,毕竟学了这么多最终是要用于实际的,就算你是老师,教给学生也一样是要用于实际的(别给我玩循环哈,最终是要返回的,再说也不会全部的学生都去做老师吧)。如果只是把全部的demo跑了一遍,没有用于实际工程,那么这里面其实还是有一个理论到工程实际的跨度,最后多半觉得学了感觉没用,问题就在这里。应该是为了做什么而去学,而不是为了学而学,不要还像在大学那样一定要把书搞透了才敢动手,到了真正要动手时你会发现其实有很多问题要么还是需要后头再看书,有些问题是工程实际的问题,书上的方法也不能解决或者根本不讲这些东西,而另外还有东西学了在实际中几乎用不到,花时间在这些用不到的东西上面简直就是浪费生命。总之早点动手,才能更清楚以后要怎么做。不断的修正你的路线,不要打一开始就走歪了,不然注定是要失败的,这真是可悲呀。 我一般学新东西的方法是,先自己定一个大的目标,然后层层细化目标和阶段,大致了解了要用到的新东西之后,开始动手,然后感觉什么地方不会或卡住了,就边看资料边动手做。这样学到的东西才是很有用的,而且印象深刻,还要多注意总结和小结。学汇编就是用的这个方法,之前把王爽的汇编看了多边,做了笔记,最后到了要动手时发现依然很难,不是难在汇编本身的问题上,是环境上还有其他你没想到的地方。时隔半年后决定要真正学一下汇编,就立下用写个简单操作系统的目标(管他写得有多烂呢)。第一个细化的目标写调度器,这块一定得用汇编写,然后就把汇编当工具一样,需要用什么功能的语句就去查书,反反复复像这样查字典一样,同时不停的调试,遇到了很多怪问题,最后都一一解决了。 别人给的demo只是给新手一个用起来的感觉,只是个感觉,用来减少初学者的那种陌生感的,它只是个最基本的,初学者应该自己定义自己的目标,然后把这些东西、功能组合起来,能自如的用还只是第一个阶段。接下来可以的话需要下到底层来研究,不要浮在表面。
power_mcu 2013-01-03
  • 打赏
  • 举报
回复
引用 1 楼 lr2131 的回复:
来学习一下。 看了觉得很有感触,有很多观点很认同。只是关于网络资料这一点,对于初学者说好也好、说不好也不好。因为资料太多,反而让一些初学者无所适从。初学者需要从中选出合适的资料,也就是说选准了需要看的资料下功夫精看,其他的不要看或者作为参考,等把手头上的资料搞透了再去看其他同类的资料,就很清楚了也不会花很多时间。也就是说阅读资料也是需要分主次的。 另外学习的过程中确实应该多结合实际,毕竟学……
说的非常好,建议初学者多看看你的这段话,赞。
GZZXBCXM2005 2013-01-03
  • 打赏
  • 举报
回复
看过楼主写的几篇文章,建议楼主出书!
wzb56 2013-01-03
  • 打赏
  • 举报
回复

1,075

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 非技术区
社区管理员
  • 非技术区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧