现状
不知道阅读本文的读者,在初学单片机时是否和我以前一样迷茫。看到各种新的术语,疑惑不解;不知道从何学起;照着书中的样例一步一步做都没有问题,可是自己试着做东西,遇到各种问题却不会解决,向别人提问,可能也没有几个人回答;感觉好像学完了单片机的各种模块,可是要自己设计东西却还是毫无思路,也不知道怎么去进一步深入学习;甚至在一開始就遇到太多困难,直接放弃了学习。
在我身边,看到不少学习单片机的人。当中非常多人学习的方法,就是通过看一些视频或书籍教程,然后照着别人的代码去写,写好了能用了,就感觉是学会了。而学的过程中,事实上有非常多东西不懂,可是也不知道怎么办,就那么过去了。
有些人尽管照着那些教程学会了单片机,可是对单片机的理解仍然非常浅显。不知道怎么去设计单片机系统,也不知道如何进一步深入学习,搞不清究竟什么才是重点,非常迷茫。
我也曾见过非常多单片机学习者,发了一些帖子提问,上面贴上自己的程序,然后问这个不能工作怎么办。问题没有描写叙述清楚,程序代码非常乱,也没有电路图,非常多时候也没有几个人回答。有些人非常可能就因此放弃了学习。甚至有不少人在一開始下载程序到单片机中就出现了问题而放弃了学习。
原因
为什么会出现这种情况呢?是由于这些人不愿意学习,或者学习能力太差吗?我认为不论什么人的毅力都有限,不可能一直坚持下去;而学习能力欠缺则是非常多人都有的问题,特别是从小缺乏适当的教育。所以这不是基本的原因。
我认为非常大的一个原因是,没有一个好的资料指导刚開始学习的人进行单片机的学习。市面上单片机的学习资料非常多,可是真正的好资料并不多。常见的单片机学习资料有两种,我来列举一下。
一种是理论型的,有点像大学不少教科书的感觉。一上来就開始讲寄存器、指令集、单片机内部结构,对于单片机刚開始学习的人而言,一篇文章读下来,差点儿全是晦涩难懂的专业词汇,更谈不上理解,这类书籍显然不适合新手学习。
还有一种则是重视实践型的。这类型的学习资料,我也看过非常多,可是当中非常多都有一个特点,就是过分偏重实践而差点儿不提思想、方法和原理。典型的就是市面上有非常多《十天学会XXX》这类资料。用这样的资料,确实能够高速学会单片机,而且充分迎合了非常多人急功近利的心态,能高速学会想要的东西。可是假设只靠这样的资料,只能是学会单片机,但非常难学好单片机。然后就出现了前面提到的诸多问题。
重点
单片机学习的重点,绝不是简单的会用C语言给51写几个驱动,毫无代码风格,拼凑一个勉强能用而bug非常多、根本无从维护的系统。也绝不是把51、430、AVR等各种单片机的基本操作搞的一清二楚这么简单。更重要的是从随意一款单片机学习的过程中,体会当中的project思想,提炼学习方法和技巧,掌握单片机系统设计的通用方法。
程序设计经验丰富的人都知道,编程语言仅仅是当中最主要的东西,仅仅是表达程序设计思想的载体,而绝不是编程的核心知识。很多其它的应该是程序设计的算法和project思想。
一个较好的掌握了编程思想的人,能非常快的从一种编程语言转换到还有一种编程语言;更进一步,一个掌握了优秀设计思想和学习技能的人,能更好的在不同的技术之间进行转换。
人为什么要学习语言?语言本身并不是最重要的东西,重要的在于语言是思想的载体。在语言学习过程中,我们慢慢学会了思考,慢慢有了自己的思想。假设没有思想,语言本身就失去了意义,简单的计算机程序也会处理文字,而且能比人做的更好,可是它却不能像人一样思考;而有了思想,用不论什么一门足够完好的语言去表达都是能够的。
语言本身有非常大的局限性,并不能表达全部的思想,而单片机也一样有各自的局限性;另外,自然语言和人类思想,远远比单片机和单片机设计思想的组合要复杂;还有语言本身也能影响人的思维方式,比如美国人说话比中国人更直白,类似的,不同的单片机学习,也会影响单片机系统设计的思维(尤其是面向过程和面向对象的编程语言之间的差异更能体现这一点)。
结论
通过类比我们发现,单片机学习的核心并非单片机编程本身,而应该是更上升一个层次的,单片机系统设计思想。而一旦掌握了单片机系统设计思想,离一个优秀的底层硬件project师也就更近了一步。而学习这样的思想,则是通过深入学习一种单片机,以及接触多种其它单片机的方式来实现的。
网上有非常多人争论入门应该学习什么单片机,我认为这不是最重要的问题。一旦掌握了优秀的设计思想,从一种单片机转到还有一种单片机、转到嵌入式平台,就轻松了非常多。
可是是不是说,这样的争论就没有意义呢?显然也不是。还是拿自然语言来类比,假设一个住在中国的人从小学习的是英语,尽管也能培养他的思维,可是却导致了诸多不便,由于周围的人都在说汉语。对于这个人来说,他能够花几年的时间再学习一下中文,可是比較费时间(自然语言太过复杂,一门新的语言可能要几年才干学会;可是人类思想更加复杂,一辈子都在不断积累)。
所以入门学习什么单片机的问题也是有一定的价值的,非常多人不支持入门用51正是觉得51已经要被淘汰了,工作时也非常少会用到。只是好在单片机这样的东西远不及自然语言那么困难,精通51单片机的人,非常快就能学会430单片机。
学习思路
1、注重实践
非常多中国学生,从初中甚至小学就開始学习英语了,直到大学毕业,英语水平也远不如美国小学生的水平,我自己也是当中之中的一个。原因非常easy,缺乏实践。单片机的学习也一样,没有实践恐怕永远都是学不好的。
2、提炼思想
每当提到学习,我们常说“理论与实践相结合”。然而现实中,真正做到这一点的人并不多,包含前面我也提到单片机学习遇到的各种问题。理论是从实践中抽象出来的,而又对实践起指导作用。理论和实践应该是同等重要的。我们应该在学习单片机的过程中,不断思考,提炼出单片机系统的各种理论思想,还有学习方法、技巧,为以后的进一步学习打下坚实的基础。
3、不可急功近利
这一点不用多说。有些人一看到《五天学会***》《一周精通***》这类标题的学习资料就激动不已,实际上大部分情况下用这样的资料学习,都没有达到标题所说的效果,即使学完了,也仅仅是了解了基本知识,并不能非常好的运用。而这样的东西反而easy让人更加急功近利。假设一个知识的学习真有这么简单,社会一定不是今天的样子了。
4、坚持
硬件相关的学习相对来说都是比較难的,须要大量的知识和经验积累。学习单片机也一样,须要长期坚持。
我要做的
鉴于以上各种原因,我决定依照我的想法,自己写一系列单片机学习的文章,帮助刚開始学习的人学习。在写这个系列教程的过程中,也有非常多困难。
一是我自己的水平有限,尤其是做技术的人可能都有的通病,就是语言表达能力不足。
二是时间上的问题,这个系列的文章内容非常多,整个知识结构的构思就花了我非常长时间,而详细每写一篇又都要进行构思,然后还得改动调整,整个系列我打算花一年时间来写,须要花费我大量的精力。
三是就眼下已经发表的十几篇文章来看,还没有达到我的期望,希望能有很多其它的人阅读,特别是希望能有很多其它的人给我提供反馈,比方哪些地方写的有问题、不好理解等等,这样我才干更有动力继续往下写,也才干更好的对写的不好的地方进行调整完好。
教程内容
本系列教程从最主要的入门知识開始,逐步深入介绍单片机系统设计,内容包含:
1、入门篇:单片机等基本概念、各种电子设计基本知识
2、思想篇:单片机/计算机系统设计的project思想
3、学习篇:单片机学习过程、方法和技巧,以51单片机为例介绍,并推广到其它单片机
4、应用篇:遵循规范的project方法,设计单片机系统实例(计划设计的系统有:计算器、电子表、password锁、简易手机,详细看有没有时间再确定)
5、原理篇:从模拟电路、数字电路開始,逐步深入介绍单片机/计算机系统原理,并自行设计简易的CPU(因为个人水平有限,这部分没有把握写好,详细内容视情况而定)
教程特点
1、技术知识点全面,从入门到精通
包括了各种基本知识,尤其是对单片机基本概念的介绍、为什么要用单片机等,在非常多同类书籍教程中都被忽略了。同一时候也包括了一些深入的知识,包括原理篇考虑对单片机的基本原理进行介绍,有助于深入理解单片机。
本系列教程以51单片机为例进行介绍,之所以选用51是由于:
首先是我对51和430比較了解,而430大多是贴片封装,不适合自己动手搭建电路,另外非常多驱动官方都已经给出来了,不利于自己学习;
51是最常见的入门经典单片机,能找到的资料也最多,还能直接用Proteus软件仿真,没有条件购买开发板也能够学习;
51比其它不少单片机简单,像430的时钟模块就相当的复杂,对于初学不好理解;
通过51介绍完单片机的基本知识,我会再把430进行简要介绍,尤其是对照两者之间的优缺点,让大家非常快感受到430的巨大优势,而学习51正好为高速了解430打下了坚实的基础。
2、除了单片机知识,还有思想、方法、技巧的介绍
本系列教程中,介绍单片机各种模块编程知识的主要是学习篇,而学习篇仅仅是整个教程的一部分。在学习篇中我会贯穿各种方法技巧,怎样理解一些模块功能,怎么看时序图,严格遵守project思想进行编程,程序发生了错误怎么调试等等。而在思想篇中会整体介绍非常多重要的思想,为后面的学习做好准备工作。
3、知识先后顺序的设计
单片机学习过程中,涉及大量的知识,并且非常多知识之间相互依赖,关联非常强。
本系列教程对知识的先后顺序进行比較明白的规划,尽最大可能符合人的认知过程。可是实际规划时发现,不管怎么调整知识的顺序,总有一些知识之间相互依赖,关系复杂。比如開始讲IO口的时候肯定会提到寄存器,而寄存器这个词的理解,须要深厚的背景知识。可是这些背景知识在没有进行实践的时候也非常难理解。
刚開始学习的人经常就会在这种地方感觉疑惑不解,不知所措。而每次遇到类似这种知识,我会向刚開始学习的人指出,应该怎样对待。这个知识是应该自己去学习补充,还是等到学完原理篇再做理解,而如今又应该怎么去看待这个名词。
另外,在整个教程的学习前,须要掌握一定的C语言等基础知识,详细可參考教程第〇篇《序》中的相关说明
4、语言通俗易懂
本系列教程力求语言通俗易懂,而不会用一堆新手不懂的词语去解释还有一个不懂的词语。可是受限于个人语言表达能力,可能有些地方表述的比較繁琐,或者不清楚,希望大家可以帮忙指出。
其它问题
假设认为我写的对你有帮助,欢迎多多反馈,包含写的不对、不合理、不太明确都能够指出来,这样方便我对其进行完好。
本系列教程首发于我的个人主页,欢迎訪问(因为是国外server,速度略微有点慢,另外有些网络条件下可能无法訪问):
www.hainter.com/category/hacker/mcu-primer
同一时候会将其转发到CSDN、电子发烧友等网站,欢迎关注。
CSDN专栏网址
http://blog.csdn.net/column/details/mcu-introduction.html
电子发烧友论坛