单片机学习如何入门
单片机学习如何入门
尹延辉
很多搞电子类行业的朋友都梦想自己成为搞硬件的高手,然而搞硬件难就难在没有头绪,学习硬件技术找到一个合适的入手点是最重要的。比较流行的硬件技术有数字系统设计、模拟电路系统设计、射频电路系统设计以及以上三类的混合。模拟与射频的设计入门门槛比较高而且市场份额比较小,因此学习硬件技术从数字电路入手是最容易而且是最具基础性的,而数字电路的设计又以单片机的学习为基础,学习单片机不仅仅是学习一项技术,更重要的是建立起一种数字系统设计的概念,为以后学习其他高档数字器件以及模拟、射频电路打下基础。
现在单片机的主流仍然是8位单片机(例如MCS51、AVR、PIC、NEC、瑞萨系列)以及少数16位单片机(例如MSP430、凌阳系列)。在学校的单片机教学中,几乎都是以MCS51为主。但实际应用中却不是这样,在国外的DIY爱好者中,PIC单片机是最流行的;在国内,AVR单片机非常火。所以我要先谈谈单片机学习的两种路子。
其一是传统的稳扎稳打型:从MCS51的汇编语言设计以及硬件电路设计开始入手,汇编语言程序设计熟悉了之后(这大概需要半年至一年的时间),对MCS51的内部硬件构成也有了很深的理解,这时再学习51单片机C语言设计(因为实际的大工程不可能用汇编完成),51的资源很有可能不够用,就要换用其他型号的单片机(例如AVR、430)。这种路子的优点在于基础厚实,MCS51的汇编语言运用熟练之后,学习其他单片机会很容易上手。但从汇编向C语言的思维转变是一个比较痛苦的过程。
其二是自顶向下型:选定一种实际工程中比较实用的单片机,直接学习怎样使用C语言来开发它,在较短的时间内掌握对其IO口、定时器、中断的操作,然后再慢慢了解芯片内部的硬件构成细节。这种路子的优点有很多:初入门时不需要花比较长的时间去学习单片机内部硬件构成结构之类很枯燥的东西,只要明白C语言的变量与单片机的IO口等模块的寄存器、一个函数与单片机的一项功能、顺序语句与单片机的顺序输出、条件语句与单片机的输入输出间条件关系、循环语句与单片机的反复型输出是怎样映射的就可以完成很多范例项目的开发,可以保持住学习的兴趣;可以直接学习实际工程中用得到的东西,不必完成从MCS51向其他单片机的转变。
我推荐大多数的,尤其是已经参加工作的初学者朋友,走第二种路子,而且推荐大家采用AVR系列单片机中的ATmega16来入门。因为AVR相比51和其他单片机有诸多优点。
首先是最小系统设计容易,只需要连接电源、焊接晶振就可以工作,尤其是对时钟精度要求不太高的话晶振都可以省去,因为AVR带有内部RC振荡器,相比之下51单片机需要外接上电复位电路(AVR内部自带这个电路而且性能比51的RC复位要好)、EA/VPP引脚要上拉、P0口要上拉等等,光建立最小系统就是很麻烦的一件事。
其次很多概念初学者理解起来更容易,AVR的时钟源(晶振、内部RC等)不经过分频直接提供给CPU使用,例如AVR外接10MHz的晶振其CPU的时钟周期就是1/10MHz=0.1uS,而51的时钟源要12分频后提供给CPU,12MHz的晶振对应的CPU时钟频率是1MHz,这一点尤其是在计算定时器相关的设置时AVR非常方便。
第三,相比例如PIC、430等其他单片机,AVR既具有简单的、可以自制的ISP下载线和Jtag仿真器,又有DIP直插的封装形式,而且网络上AVR有关的中文资料非常多,尤其是有Atmel公司官方翻译的中文技术文档,大大方便初学者的入门。.
第四,AVR的C语言编程与教科书上学习的C语言语法是几乎一样的,不像51的C语言,一些bit、srf之类的变量定义在教科书中是找不到的,在更高层次的ARM、DSP的C语言中也是没有那样用的,仅仅是51独有的用法,尤其是bit变量的用法很“汇编化”,会给后续的嵌入式系统的程序设计形成不好的思维模式。而AVR的设计很入嵌入式系统设计的主流,有利于后续的发展。
说了这么多“空洞”的东西,我们说点比较实在的吧,我也是初学者过来的,比较了解初学者的心理,恨不得你给他制定出第一步、第二步、第三步该干什么,那我就按照这个模式讲一下:
Step1,准备万用板三块,查找Jtag、ISP的电路,焊接,用掉两块板;剩下的一块用来焊接AVR的最小系统。
Step2,在ATmega16的一个8位IO口上焊接8个LED(注意要串接220欧姆限流电阻哦)。
Step3,写一个流水灯的小程序。
最困难的可能是第一步,所以推荐大家还是先买块AVR学习板。能完成这三步,你就算是入门,后续的发展对你而言就没什么难度了,在精彩的单片机世界里尽情遨游吧。当然这三步讲得还是很粗略,我计划录制一个AVR软硬件设计入门的教程、开发一款适合初学者用的AVR学习板,感兴趣的朋友请关注力天电子:www.lt430.com,或者加入我的AVR与430单片机技术交流群:31646346,或者加我本人QQ:329314196。 |
|