找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2837|回复: 1
打印 上一主题 下一主题
收起左侧

学习单片机怎么入门

[复制链接]
跳转到指定楼层
楼主
ID:115111 发表于 2016-4-28 03:21 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
      这篇文章针对的是那些刚刚知道单片机这个东西,而且对他很感兴趣,想学习但是又无从下手的小白。这里面可能大多数大学生,也可能有少数是电子爱好者,不管是什么身份,只要对单片机感兴趣,就一定能学会它,而掌握了正确的学习方法则会快速的学会它。其实不管是单片机还是其他的任何东西,只要你拥有极大的兴趣,投入全部精力,就会很快学到它。笔者之前是做管理的,由于对软件开发感兴趣,所以就辞职专门学习IOS开发,由于有C的基础(大学毕业到现在一直在玩单片机),所以仅仅只用一个月,就写出了一个约一万行代码的记账软件,现在刚上架在审核中。
        话说回来,既然这篇文章面对的是新手,那肯定会有好多大神提出不同的观点,当然,对于新人来说,最好是权衡自己的条件,去选择最佳的学习路线。只要能快速学到知识,不同的方法都可以试试嘛。

        接下来我就讲讲我和单片机的故事。

        现在想起来我接触单片机也是被动接受的,并不是主动的想去学习它。大一的时候有C语言这门课程,到学期末两周,C语言课程有一个集训,就是在实验室使用一套巡线智能车完成教程中的内容,现在想来很简单,那个套件根本算不上智能车。但是当时我对单片机并没有什么概念,开始集训后老师就讲了这个套件可以怎么用,能实现什么功能,并带领我们在电脑上完成了keil的安装和烧写器驱动的安装。当时大一,没怎么玩过电脑,而且根本不知道单片机这个东西(因为当时那个套件中单片机是在一块开发板上的,在我眼里就是一块电路板而已)。老师讲完就走了,我们就在实验室自己看着书捣鼓书上那些代码,有问题的时候就跑去找老师解决。通过这样的一周学习,我们能让智能车跑起来了。接下来要实现的功能是用完成智能车巡线,地上有一条2CM宽的黑线,机器人要跟着这个线走,实现的原理就是使用传感器检测地面上的黑线,如果是黑线,传感器返回0,如果不是黑线,传感器返回1,然后根据返回值的情况去设置车左右两个轮子的驱动,进而让车巡线。我记得我当时对这套东西特别感兴趣,正好大一期中买了笔记本电脑,就跟老师沟通好晚上把白天在实验室用的这一套智能车套件带回宿舍,用自己的电脑继续玩,后来我和自己的搭档不但完成了集训要求的内容,而且做出了很多新的花样,给老师留下了不错的印象。也正是因为这个,对我以后产生了深远的影响。

        大二开学刚来到学校,就接到老师的通知,从全年级选了五个人出来继续做之前的智能车套件,目的是在两个月后参加深圳的智能车比赛(笔者大学是在北京上的),这对我来说是个不小的诱惑,在做自己喜欢的事情的同时还可以去这么远的地方走一遭,此乐何极。所以我就接下了这个任务,并且每天废寝忘食的开始研究,在这段时间里,我总算对单片机有了较深的了解。在准备比赛的过程中我经常遇到难以解决的问题,这个时候我就会去图书馆查阅相关资料(大学的图书馆是个好地方,学弟学妹们有时间一定要多去走走),也正是这段时间,我知道了汇编,知道了电路板是怎么设计的,知道了传感器的基本原理,知道了元器件的线性工作特性与死区。。。每当遇到问题的时候,我就停不下来了,不断调整自己的算法,通过不同的参数对比找出问题的原因,或者是去查阅相关知识,因此也逃了不少其他的课程。又几次甚至嫌回宿舍睡觉浪费时间,直接带了被子到实验室打地铺,最后感觉睡地上不舒服,索性起来熬夜做。最终我们团队在深圳的比赛中获得了二等奖。我原以为我们的成绩应该是不错的,但是当真的去了赛场,我才发现我们和别人的差距有多大:我们是大学组,有好多高中组的做出来的效果已经让我们瞠目结舌了。更何况其他大学组。有一些我们以前遇到的难以解决的问题,比如如何提高巡线精度等问题,我们的解决方案都是通过调整软件中算法的参数去解决的,但是发现更高效而且稳定的办法是通过硬件去解决,在不违反比赛规定的前提下增加传感器数量,这样就提高了测量精度,进而降低了算法的难度,也就提高了系统的稳定性。

        所以参见完比赛我就开始了解电路设计的一些东西,并在网上免费报名参加Altium Designer公司举办的社会培训,通过自己的学习,最终掌握了电路板的设计,当时记忆最深刻的是为了学会每个电路元器件的用途、性能、封装,我去图书馆找到了一本元器件大全,就像字典一样的书,当时把那本书翻了好多编,也逛了不少论坛,尝试画了不少电路PCB板,但那个时候只是纸上谈兵,并没有实际的制板经验,而且画的都是双面板。
        大三我们开始学习单片机,学的是51,(大学一般单片机课程都是51),用的编程语言是汇编。也学习了计算机基本原理,还有数字电路、模拟电路等课程,下学期开始学习自动控制原理。在这一年中我跟老师做了不少项目,其中有MSP430单片机、也有51,也尝试过ARM7和STM32,在北京市电子设计大赛中获得过一等奖。这个时候因为一些外界因素,我对单片机的爱好没有那么强烈了,后来又一段时间没有做什么项目,直到大四,开始觉醒,并跟着老师做了几个项目,这其中有物理实验的试验箱的制作(我负责硬件设计和下位机与上位机的通讯,下位机程序设计)并参加北京市物理实验竞赛获二等奖。也跟着老师做了企业的太阳能板的项目,毕业设计做了S3C2410上的LINUX移植和驱动编写的课题(当时这样的课题对本科生来说难度是有点大的)。

        很不幸的是笔者大四签订工作的公司是重工企业,也做海洋平台 的制造,我当时应聘去是做电仪设计的,在这里设计的东西都是有行业规定的,没有什么可以创新的东西,每天工作死气沉沉,在这样的环境下呆了大概两年,终于不能忍受乏味的工作生活,于是辞职(当时我辞职的时候并未确定下家公司,因为我想的是重新学习电子相关的东西,而因为自己两年没有接触这方面的东西,已经远远跟不上了,所以需要专心学习一段时间).

        在这里我开始回答这篇文章题目中提出的问题,这也是我在一些论坛和QQ群中每天都会看到有人在问的问题,接下来我将把我的一些观点和经验介绍给各位同仁,由于我也是菜鸟,所以个别观点难免偏颇,希望大神不要笑话,能给我和其他新手一点指导意见,大家共同提高。

        1、我是新手,我想学单片机,应该学51还是直接上手ARM?

        答:学习任何东西,学的都是思维。而单片机本身只是一个工具,这个工具是用来实现我们的思维的。比如我通过学习,知道了可以使用单片机控制LED灯闪烁(原谅我使用这个太常见的例子)那么你想让单片机怎么闪烁,或许你的想法和别人都不一样,有可能你做出来的闪烁效果是最好看的,这就是你的思维通过学习,加上自己的天赋比别人厉害的地方。那么你所想的这个闪烁效果如何实现?至少得借助一个工具吧,这个工具就是单片机,那么这个单片机如何实现你的想法,也就是控制流程?那你就需要了解这个单片机。当你了解了之后,你发现其实原理很简单,而且不只是你所了解的这款单片机原理简单,而是所有的都这般简单。所以你高兴的上手写程序了,你要用程序把你的控制流程写出来,这时候你突然发现没那么简单了,当你把你的控制流程转换为单片机的控制流程时,你发现你遇到困难了,就好比你想喝水你会去用手拿杯子送到嘴边,因为你的手会听从大脑的智慧。可是你不知道单片机的手在哪里,你不知道单片机的大脑运行有多快等等。所以这个时候你要停下来研究你要用的这个单片机了。你会去了解它的手和脚(IO、Uart、I2C等)还要去了解它的大脑(频率、架构、寄存器)等,然后你就像翻译语言那样很顺利的就把你的控制流程教给单片机了,它按照你的想法完成了让LED闪烁的任务。突然有一天你的想法变得更复杂了,之前的单片机满足不了你了,然后你就要使用更强大的单片机了,你去了解另一个单片机,你惊喜的发现它竟然是那么像之前你用的那个,唯一的区别就是资源更多了,性能更强了,速度更快了。于是你在很短的时间就完成了学习并把你的想法移植在它上面。说这么多,无非就是想说,单片机,原理大同小异,选择一个学就是了,不用把太多的时间花费在纠结学那个上面,有你纠结的时间,或许你已经学会怎么点亮LED了。所以我的建议是,花尽量少的钱,在网上买个51开发板,然后按照板上带的一些资料开始学就行了,等到你把店家给你的资料中的代码完整的写一遍,你就基本上掌握了51,然后你会发现,拿到ARM的板,你稍微熟悉一两天就可以上手了。当然,你想使用STM8、STM32、AVR都行,最重要的是,选择一个,就把它彻底掌握。
        2、我初学单片机是使用C语言呢还是汇编语言?

        对于语言的选择,个人认为学习C比较简单,毕竟C语言是其他大多数语言的基础,而且和汇编想比较容易理解多了,在初学单片机的过程中,我们要掌握单片机的工作原理和操作,而C语言相当于我们操作单片机的工具,这时候我们应该把重点精力放在单片机上,那有人就问了,如果我不把C语言学精,怎么去使用它操作单片机?对此我建议,想学单片机的人,先集中精力花费一个月的时间去学习C语言。学会变量的定义、使用、函数的声明、调用、宏定义、条件编译、数组、分支、循环、等,基本就差不多可以操作单片机了,等到单片机学到一定程度,你会发现自己的C语言那一块欠缺,然后再去针对性学习,这样互相补充,很快你就是大牛了。在学习的过程中你会享受到那种让机器按照你的思维动作的乐趣。而汇编语言由于直接操作寄存器的,比较枯燥而且麻烦,如果一开始学这个,很容易对单片机失去兴趣。关于C语言的学习,我后续会发布一个学习路线供大家参考。

上面写到我的个人经历,回答了新手学习单片机选择什么单片机入门好,还有选择什么编程语言适合新手这两个问题,接下来我们讨论选择什么平台,以及学习的路线。


        3、新手学习单片机选择用什么开发平台?

        在这个问题的回答里,我把软硬件平台统一囊括在一起。

        1)、软件平台,在第一个问题中我建议大多数新手使用51起步,具体就是AT89S51\AT89S52这两个芯片,如果你确实选择用它了,那编程软件就是keil forC51,这时候很多新手都会存在一个问题,究竟是买一块开发板实际操作呢,还是使用Proteus这样的仿真软件进行仿真呢?我这里的回答是,刚开始学习单片机,千万不要使用Proteus仿真,现在一个开发板也不贵。花不到100大洋就可以买一个开发板,买的时候不要买功能太强大的,因为一开始你入门,需要的板上资源其实不多,有led,有按键,差不多就可以了。而学习IO口、定时器、计数器、中断、看门狗、串口通讯,这些都可以用led去模拟实验效果。后期学习其他的东西,如果板子上没有,没关系,一般的板子IO口都可以扩展出来,所以我们直接使用面包板或者焊接来搭建其他电路。通过使用真实的板子进行学习,你不但可以对单片机、各种资源、各种元器件有一个直观的认识、而且你可能会遇到一些只有在现实的元器件上才会发生的各种问题,如led烧毁不能点亮,电容被击穿、这些问题你遇到了,然后通过各种方式去排除这些问题,然后把问题解决方案记录下来,就是你成长的过程。而这些问题,在使用软件仿真中是遇不到的,而且软件仿真中有些可行的方案,在实际中并不可行。所以新手一定要使用真实的开发板去学习单片机,等到自己掌握了单片机的基本知识,那时候再去用软件仿真运行你的软件,也是可行的,而且这个时候由于你掌握的一些实际的经验,所以在仿真中遇到的问题你也能很快解决,而不是像无头苍蝇一样没有解决办法。
        如果你选择了STM32,那么开发环境可以选择AIR或者keil forARM,再次重申一遍,软件没有什么绝对的好不好,你可以两个都试用一下,觉得那个适合你你就去使用那个。我个人比较倾向于keil ,keil5之后加入了很多功能,包括4之后增加的代码自动补全(建议新手不要使用这个功能)、库文件的集成、仿真(这个里面的仿真功能还是很强大的)。具体的使用和可能会遇到的问题,我会开出一个专题来讲。硬件的话,就是jlink,这个比51的ISP烧写器强很多。
        如果你选择了使用STM8,需要安装两个软件1、STVD IDE开发环境,2、COSMIC for STM8 C编译器。对于这个的详细解读,后面会有专题。


        4、如果我按照你说的,去先学习C语言,那么最高效的学习方法是什么?

        我认为学习C语言的最高效的学习方法是:在图书馆借一本入门级的书,然后在电脑上装一个开发环境(具体什么开发环境无所谓,VC6.0,VS2010什么的都可以,根据你电脑的配置选择),然后开始边看书边敲代码。下面是我做的一个C语言学习路线,如果你学C语言就是为了做单片机,那你可以有侧重点的学习:

        以上是一个提纲,你可以按照上面的知识点一个个去学习,学习完成之后通过打个勾,继续下一个,学完全部大概两周就可以搞定。这时候你就可以阅读单片机项目代码。后续我会放出一些简单的项目。当然,上面的知识点或许过于冗余,你可以通过公众号发消息给我,告诉我你自己设定的学习路线,我帮你规划C的具体路线,告诉你哪些知识点可以浅尝辄止,哪些知识点必须要彻底掌握。这样就会在最短时间内学到最多。

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:82285 发表于 2016-4-28 11:03 | 只看该作者
楼主最后一张图说的很好
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表