如何以学习单片机为契机,逐步成为优秀的工程师

现状

不知道阅读本文的读者,在初学单片机时是否和我曾经一样迷茫。看到各种新的术语,疑惑不解;不知道从何学起;照着书中的例子一步一步做都没有问题,但是自己试着做东西,遇到各种问题却不会解决,向别人提问,可能也没有几个人回答;感觉好像学完了单片机的各种模块,但是要自己设计东西却还是毫无思路,也不知道怎么去进一步深入学习;甚至在一开始就遇到太多困难,直接放弃了学习。

在我身边,看到不少学习单片机的人。其中很多人学习的方法,就是通过看一些视频或书籍教程,然后照着别人的代码去写,写好了能用了,就感觉是学会了。而学的过程中,其实有很多东西不懂,但是也不知道怎么办,就那么过去了。

有些人虽然照着那些教程学会了单片机,但是对单片机的理解仍然很浅显。不知道怎么去设计单片机系统,也不知道怎样进一步深入学习,搞不清到底什么才是重点,非常迷茫。

我也曾见过很多单片机学习者,发了一些帖子提问,上面贴上自己的程序,然后问这个不能工作怎么办。问题没有描述清楚,程序代码很乱,也没有电路图,很多时候也没有几个人回答。有些人很可能就因此放弃了学习。甚至有不少人在一开始下载程序到单片机中就出现了问题而放弃了学习。

原因

为什么会出现这样的情况呢?是因为这些人不愿意学习,或者学习能力太差吗?我觉得任何人的毅力都有限,不可能一直坚持下去;而学习能力欠缺则是很多人都有的问题,特别是从小缺乏适当的教育。所以这不是主要的原因。

我觉得很大的一个原因是,没有一个好的资料指导初学者进行单片机的学习。市面上单片机的学习资料非常多,但是真正的好资料并不多。常见的单片机学习资料有两种,我来列举一下。

一种是理论型的,有点像大学不少教科书的感觉。一上来就开始讲寄存器、指令集、单片机内部结构,对于单片机初学者而言,一篇文章读下来,几乎全是晦涩难懂的专业词汇,更谈不上理解,这类书籍显然不适合新手学习。

另一种则是重视实践型的。这类型的学习资料,我也看过很多,但是其中很多都有一个特点,就是过分偏重实践而几乎不提思想、方法和原理。典型的就是市面上有很多《十天学会XXX》这类资料。用这种资料,确实可以快速学会单片机,并且充分迎合了很多人急功近利的心态,能快速学会想要的东西。但是如果仅仅靠这种资料,只能是学会单片机,但很难学好单片机。然后就出现了前面提到的诸多问题。

重点

单片机学习的重点,绝不是简单的会用C语言给51写几个驱动,毫无代码风格,拼凑一个勉强能用而bug很多、根本无从维护的系统。也绝不是把51、430、AVR等各种单片机的基本操作搞的一清二楚这么简单。更重要的是从任意一款单片机学习的过程中,体会其中的工程思想,提炼学习方法和技巧,掌握单片机系统设计的通用方法。

程序设计经验丰富的人都知道,编程语言只是其中最基本的东西,只是表达程序设计思想的载体,而绝不是编程的核心知识。更多的应该是程序设计的算法和工程思想。

一个较好的掌握了编程思想的人,能很快的从一种编程语言转换到另一种编程语言;更进一步,一个掌握了优秀设计思想和学习技能的人,能更好的在不同的技术之间进行转换。

人为什么要学习语言?语言本身并非最重要的东西,重要的在于语言是思想的载体。在语言学习过程中,我们慢慢学会了思考,慢慢有了自己的思想。如果没有思想,语言本身就失去了意义,简单的计算机程序也会处理文字,并且能比人做的更好,但是它却不能像人一样思考;而有了思想,用任何一门足够完善的语言去表达都是可以的。

语言本身有很大的局限性,并不能表达所有的思想,而单片机也一样有各自的局限性;另外,自然语言和人类思想,远远比单片机和单片机设计思想的组合要复杂;还有语言本身也能影响人的思维方式,例如美国人说话比中国人更直白,类似的,不同的单片机学习,也会影响单片机系统设计的思维(尤其是面向过程和面向对象的编程语言之间的差异更能体现这一点)。

结论

通过类比我们发现,单片机学习的核心并不是单片机编程本身,而应该是更上升一个层次的,单片机系统设计思想。而一旦掌握了单片机系统设计思想,离一个优秀的底层硬件工程师也就更近了一步。而学习这种思想,则是通过深入学习一种单片机,以及接触多种其他单片机的方式来实现的。

网上有很多人争论入门应该学习什么单片机,我觉得这不是最重要的问题。一旦掌握了优秀的设计思想,从一种单片机转到另一种单片机、转到嵌入式平台,就轻松了很多。

但是是不是说,这种争论就没有意义呢?显然也不是。还是拿自然语言来类比,如果一个住在中国的人从小学习的是英语,虽然也能培养他的思维,但是却导致了诸多不便,因为周围的人都在说汉语。对于这个人来说,他可以花几年的时间再学习一下中文,但是比较费时间(自然语言太过复杂,一门新的语言可能要几年才能学会;但是人类思想更加复杂,一辈子都在不断积累)。

所以入门学习什么单片机的问题也是有一定的价值的,很多人不支持入门用51正是认为51已经要被淘汰了,工作时也很少会用到。不过好在单片机这种东西远不及自然语言那么困难,精通51单片机的人,很快就能学会430单片机。

学习思路

1、注重实践

很多中国学生,从初中甚至小学就开始学习英语了,直到大学毕业,英语水平也远不如美国小学生的水平,我自己也是其中之一。原因很简单,缺乏实践。单片机的学习也一样,没有实践恐怕永远都是学不好的。

2、提炼思想

每当提到学习,我们常说“理论与实践相结合”。然而现实中,真正做到这一点的人并不多,包括前面我也提到单片机学习遇到的各种问题。理论是从实践中抽象出来的,而又对实践起指导作用。理论和实践应该是同等重要的。我们应该在学习单片机的过程中,不断思考,提炼出单片机系统的各种理论思想,还有学习方法、技巧,为以后的进一步学习打下坚实的基础。

3、不可急功近利

这一点不用多说。有些人一看到《五天学会***》《一周精通***》这类标题的学习资料就激动不已,实际上大部分情况下用这种资料学习,都没有达到标题所说的效果,即使学完了,也只是了解了基本知识,并不能很好的运用。而这种东西反而容易让人更加急功近利。如果一个知识的学习真有这么简单,社会一定不是今天的样子了。

4、坚持

硬件相关的学习相对来说都是比较难的,需要大量的知识和经验积累。学习单片机也一样,需要长期坚持。

我要做的

鉴于以上各种原因,我决定按照我的想法,自己写一系列单片机学习的文章,帮助初学者学习。在写这个系列教程的过程中,也有很多困难。

一是我自己的水平有限,尤其是做技术的人可能都有的通病,就是语言表达能力不足。

二是时间上的问题,这个系列的文章内容很多,整个知识结构的构思就花了我很长时间,而具体每写一篇又都要进行构思,然后还得修改调整,整个系列我打算花一年时间来写,需要花费我大量的精力。

三是就目前已经发表的十几篇文章来看,还没有达到我的期望,希望能有更多的人阅读,特别是希望能有更多的人给我提供反馈,比如哪些地方写的有问题、不好理解等等,这样我才能更有动力继续往下写,也才能更好的对写的不好的地方进行调整完善。

教程内容

本系列教程从最基本的入门知识开始,逐步深入介绍单片机系统设计,内容包括:

1、入门篇:单片机等基本概念、各种电子设计基本知识

2、思想篇:单片机/计算机系统设计的工程思想

3、学习篇:单片机学习过程、方法和技巧,以51单片机为例介绍,并推广到其他单片机

4、应用篇:遵循规范的工程方法,设计单片机系统实例(计划设计的系统有:计算器、电子表、密码锁、简易手机,具体看有没有时间再确定)

5、原理篇:从模拟电路、数字电路开始,逐步深入介绍单片机/计算机系统原理,并自行设计简易的CPU(由于个人水平有限,这部分没有把握写好,具体内容视情况而定)

教程特点

1、技术知识点全面,从入门到精通

包含了各种基本知识,尤其是对单片机基本概念的介绍、为什么要用单片机等,在很多同类书籍教程中都被忽略了。同时也包含了一些深入的知识,包括原理篇考虑对单片机的基本原理进行介绍,有助于深入理解单片机。

本系列教程以51单片机为例进行介绍,之所以选用51是因为:

首先是我对51和430比较了解,而430大多是贴片封装,不适合自己动手搭建电路,另外很多驱动官方都已经给出来了,不利于自己学习;

51是最常见的入门经典单片机,能找到的资料也最多,还能直接用Proteus软件仿真,没有条件购买开发板也可以学习;

51比其他不少单片机简单,像430的时钟模块就相当的复杂,对于初学不好理解;

通过51介绍完单片机的基本知识,我会再把430进行简要介绍,尤其是对比两者之间的优缺点,让大家很快感受到430的巨大优势,而学习51正好为快速了解430打下了坚实的基础。

2、除了单片机知识,还有思想、方法、技巧的介绍

本系列教程中,介绍单片机各种模块编程知识的主要是学习篇,而学习篇只是整个教程的一部分。在学习篇中我会贯穿各种方法技巧,如何理解一些模块功能,怎么看时序图,严格遵守工程思想进行编程,程序发生了错误怎么调试等等。而在思想篇中会总体介绍很多重要的思想,为后面的学习做好准备工作。

3、知识先后顺序的设计

单片机学习过程中,涉及大量的知识,而且很多知识之间相互依赖,关联很强。

本系列教程对知识的先后顺序进行比较明确的规划,尽最大可能符合人的认知过程。但是实际规划时发现,无论怎么调整知识的顺序,总有一些知识之间相互依赖,关系复杂。例如开始讲IO口的时候肯定会提到寄存器,而寄存器这个词的理解,需要深厚的背景知识。但是这些背景知识在没有进行实践的时候也很难理解。

初学者常常就会在这样的地方感觉疑惑不解,不知所措。而每次遇到类似这样的知识,我会向初学者指出,应该如何对待。这个知识是应该自己去学习补充,还是等到学完原理篇再做理解,而现在又应该怎么去看待这个名词。

另外,在整个教程的学习前,需要掌握一定的C语言等基础知识,具体可参考教程第〇篇《序》中的相关说明

www.paincker.com/mcu-primer-0

4、语言通俗易懂

本系列教程力求语言通俗易懂,而不会用一堆新手不懂的词语去解释另一个不懂的词语。但是受限于个人语言表达能力,可能有些地方表述的比较繁琐,或者不清楚,希望大家能够帮忙指出。

其他问题

如果觉得我写的对你有帮助,欢迎多多反馈,包括写的不正确、不合理、不太明白都可以指出来,这样方便我对其进行完善。

本系列教程首发于我的个人主页,欢迎访问(由于是国外服务器,速度稍微有点慢,另外有些网络条件下可能无法访问):

www.paincker.com/category/hacker/mcu-primer

同时会将其转发到CSDN、电子发烧友等站点,欢迎关注。

CSDN专栏网址

http://blog.csdn.net/column/details/mcu-introduction.html

电子发烧友论坛

http://bbs.elecfans.com/zhuti_mcu_1.html