热度 13
2014-1-25 14:26
997 次阅读|
0 个评论
本文转载自: http://www.51hei.com/mcu/2675.html 大家好,我是陈滨,本人是去年9月份开始学单片机,到现在一年多了,现在本人基本掌握了单片机编程,开始深入学习汇编语言了。很多初学者有很多的 疑惑,我究竟是先学C语言,还是汇编语言?其实我告诉你,本人认为,先学C语言!为什么呢?C语言是目前使用最广泛的中级语言,就连现在的 windows7也是C语言编写的,C语言易读性好,无需对单片机内部结构十分熟悉即会编程,可移植性高,便于维护。C语言只有32个关键字,9种控制语 句,而且编译器提供了很多函数库,使用十分方便。而汇编语言达100多条指令,每条指令对应一个机器码,跟单片机内部结构息息相关,而且不提供库函数,每 种东西都要自己写。汇编语言最致命的地方是它不同硬件几乎不可移植,维护麻烦。但是读者又有疑问了,既然C语言这么多优点,干嘛还要学汇编语言?虽然C语 言易诸多优点,但是它也是有缺点的,就是代码执行效率不高,占用CPU资源高,这个就是中高级语言的缺点,目前最流行的安卓系统就是用高级语言编写的,据 说是Java,具体本人没去研究,大家都知道安卓CPU主频没有800M以上想流畅运行是不太可能的就好,哈哈...汇编语言是在机器语言的基础上发展起 来的,每一条代码对应一个机器码,所以执行效率很高,就连windows底层的东西都是汇编写的,C语言难以达到要求。当然随着编译器的改进,C语言执行 效率已经接近汇编,但是想真正成为单片机高手的话,那么我告诉你,精通汇编是必须的!因为汇编语言是直接操作单片机内部硬件的,如果你精通汇编,那么意味 着你对单片机十分熟悉,就能编出十分高效的程序。所以先学C语言能快速入门,再学汇编就能精通单片机。 OK!说了这么多,你会问:学习单片机能有什么钱途?嗯!学东西无非就是想赚钱,现在说学东西是业余爱好的话只有有钱人在说,谁敢说学手艺不是为了 吃饭?你?你?还是你?呵呵...目前这个世界上单片机无所不在,洗衣机,电视机,电冰箱等等...都有单片机的身影,单片机就是单片微型计算机的简称, 最早由英特尔公司发明,没错!就是大名鼎鼎的英特尔!哎!又一中国人的遗憾!电子技术什么东西才是我们中国的专利啊!说到计算机,咦?名字很熟悉?这个计 算机可不是我们用的计算器啊,而是指电脑!什么?你说单片机是一个电脑?对!没错,单片机就是一个微型电脑。一个电脑的基本组成是这样的:输入系统(键 盘)、输出系统(显示器)、计算系统(主机),你看你家的电脑是不是这样?其实主机还包含了运算系统(CPU)、程序存储器(硬盘)、数据存储器(内 存),拆开你的电脑主机,是不是也是这样?我们用的单片机其实除了输入输出系统,已经包含了其它东西,所以就微型计算机,英文叫MCU,又叫微处理器。早 期的单片机是英特尔的4004单片机,是4位的,由于功能太弱了,早已经淘汰,本人就不罗嗦了。现在我们用的单片机就51系列单片机,是英特尔最经典最成 功的发明,由于51单片机价格便宜,功能齐全,到现在10几年历史,依然火爆,估计未来10年,51单片机不会淘汰,所以51单片机对初学者很合适。目前 一个单片机工程师工资都在5000左右,视你的能力吧,上万的都有。单片机应用小到手机,大到火箭,都需要用到。只不过功能强弱不同,价格也不同,从几块 钱到100多块钱。你说火箭的单片机要多少钱?我想最多100多块!什么?是不是真的?我想是!既然单片机这么厉害,为什么这么便宜?主要是现在技术成 熟,产量大,目前世界上很多公司都在生产51核心的单片机,国内的话就有STC公司。 好了,那么学单片机该如何入手呢?俗话说,小钱不出,大钱不入,当然是要先花点钱买设备了,放心,不贵,200多块左右,不要告诉我你连200多块 的钱都没有?现在淘宝上有很多开发板,而且还送教程,价格都在200块左右。开发板就是用来学习单片机的,虽然现在有很多仿真软件,但是跟实际应用还是有 区别的。本人就有这样的经历,自己写了个程序,在仿真软件始终无法正常运行,但是到了实际电路运行很正常,所以开发板不能省。学习单片机最主要是多学习多 实践,多在论坛上逛,遇到问题要自己研究,实在不行可以网上发帖问问。买了开发板,首先你得先学习C语言,C语言最重要就是关键字,语法。目前最常用的 51编译器就是KEIL了,这个大家可以去网下载,现在都是**版的了。单片机大家可以买ATMEL的单片机,这个是最常用的了,就买AT89S52这个 吧,注意S的支持ISP编程,而C的不支持。什么是ISP呢?ISP就是在线编程的意思,就是无需拔下芯片就能写程序,这个对我们学习是很方便的。 现在网上很多教程有一些都是误人子弟,有不少错误,本人总结了很多经验,因为在此之前本人对单片机也是小白一个,所以很会理解初学者的心里。下载了KEIL,买了单片机开发板和单片机,下面我们就来开始单片机学习之旅吧,先来看出自单片机教程网 www.51hei.com 第4课的一个闪烁灯的小程序(他文章中主要从汇编的角度详解了闪烁灯的工作原理,我对此进行了C语言方面的详解算是对第4课的补全.): #include //头文件 #define uchar unsigned char //宏定义 sbit LED=P1^0; //定义引脚 void delay() //延时函数 { uchar a,b; for(a=200;a0;a--) for(b=200;b0;b--); } void main() //主函数 { while(1) { LED=0; //点亮LED delay(); //延时 LED=1; //熄灭LED delay(); //延时 } } 在这里我先说明一个问题,关于KEIL的使用网上有很多教程,由于时间关系这里我就不说了。上面是一个LED闪烁的小程序,初学者往往连这个也看不懂,好 像在看天书,别急!本人刚开始也是!我一个个说明。第一个,就是头文件,什么是头文件呢?就是编译器里面的一个库,里面定义了单片机的一些寄存器,写了这 个头文件,编译器就知道你使用的是52单片机,以下的操作它就认识了,否则编译会报错!第二个,宏定义,就是自己定义的新名字,上面的操作就是告诉编译 器,以后遇到uchar就是unsigned char了,便于书写,节省时间。第三个,就是定义单片机的引脚,如果我的LED接在P1.0这个引脚上,就这样定义了,以此类推。好了,开始说函数,有 人说编程要大学生才可以,NO!NO!NO!就拿我来说,我才初中毕业呢!不过话说回来,你的英语必须有30分以上,代数在60分以上才可以,否则吃力! 呵呵....因为C语言运用到了计算,单词等初中知识。这个是一个延时函数,因为单片机运行速度很快,如果不延时,LED闪烁就十分快,我们是分辨不出来 的。那么这个是怎么延时的呢?首先我们定义了两个变量a、b,然后a先赋值200,for这个是32个关键字其中一个,是一个循环语句,首先执行 a=200,接着判断a是否大于0,如果不是,则执行a--,就是a-1,直到a=0,这个语句执行了200次,同样下面的语句也是,这两个语句这样写起 到了嵌套作用,就是上面执行完了执行下面,这样就执行了200*200=40000次。为什么要这样呢?就是为了延时!其实这个程序就是让CPU在那里执 行空操作浪费时间来达到延时目的。下面的函数叫主函数,C语言每一个程序都有且只有一个主函数main,程序都是从主函数开始执行,上面的延时函数叫子函 数,也叫子程序,主函数可以调用子函数,反过来子函数是不可以调用主函数的。前面大家都注意到有一个void ,void在英文的意思是空,意思这个函数不带返回值,至于什么是返回值,以后再说。在函数的后面还有一个小括号,这个里面也是有一个void的,只是省 略了,那这个是什么作用呢?这个就是函数的参数,什么参数?也是以后再说!程序从主函数开始,进入了while(1)这个函数体,每个函数体都要有一个大 括号来包括,while的意思是如果括号里面的条件为真即为1,就执行里面的程序,否则退出,所以也是一个循环函数,把里面写1就是这个while永远为 真,永远执行这个函数,这样做的目的就 是让程序不断执行下去,这样LED就不断闪烁了。到了LED=0时,意思是把单片机P1.0这个引脚置为低电平,LED正极是接电源的,负极接P1.0, 这样LED就亮了。接着,延时,到这里单片机执行延时函数,紧接着LED=1,意思P1.0置为高电平,这个时候LED就灭了,然后又是延时,再点亮,周 而复始,LED就闪烁了。闪烁的频率由延时函数决定,当然你可以再写个for,这个LED闪烁就更慢了。 看了这个小程序,你有什么感觉?实际上设备上的程序比这个可是复杂多了,要学的东西太多了。好了,先到这里,我会慢慢教大家继续深入单片机编程,大家有什么要交流可以加本人QQ.只要我有时间,绝对做出回答。