欢迎来到天天文库
浏览记录
ID:2013878
大小:29.50 KB
页数:5页
时间:2017-11-14
《51单片机学习心得(二)》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库。
1、51单片机的那些事儿(续)上次说到彩灯循环的程序,使用汇编语言编写。现在我们逐一分析一下。彩灯循环:这是常见的简单程序,我们先让P0口接的LED中的一个灯亮,然后顺序左移,移到最后一个再右移。循环往复。代码如下:ORG0000HAJMPMAINORG0080HMAIN:MOVA,#7FH这行是让一个灯亮起来MOVP0,A MOVR0,#07H移动7次MOVR1,#07HMOVR2,#0FFH用来延时,要不然太快了MOVR3,#0FFHL1:RRCAMOVP0,AL2:DJNZR2,L2NOPNOPNOPNOPDJNZR3,L2DJNZR
2、0,L1MOVR3,#0FFHMOVR2,#0FFHL3:RLCAMOVP0,AL4:DJNZR2,L4NOPNOPNOPNOPDJNZR3,L4DJNZR1,L3AJMPMAINEND首先为什么要MOVA,#7FH呢,7FH转换成二进制是01111111,大家会发现,这里面只有一个零,所以,在共阳极的LED接法中,0会让LED发光,所以这里面只亮一个灯。MOVP0,A就是把这个7FH输出,输出了才能亮起来。所以这两句表示一个初始的彩灯状态,就是只有第一个灯亮了。MOVR0,#07HMOVR1,#07H两句为什么是7次呢,因为从第一个到最后一
3、个,我们只接通8个灯,初始状态第一个灯已经亮了,所以剩下7个灯,只能移动七次,就能让最后一个灯亮,移动8次就仍然回到第一个灯了。我们要达到的效果不是简单的从头到尾再从头到尾的循环,而是先从第一个移动到最后一个然后从最后一个再回到第一个,所以不能让每次再回到第一个。MOVR3,#0FFHMOVR2,#0FFH这两句为了延长时间而设计。汇编语言中,为了延长时间,我们只能让单片机一次一次的减一,然后判断是否为零,不是零就再减一判断,就这么周而复始的消磨时间,这就是延时。RRCARLCA就是整体右移和左移。DJNZ用的较为普遍,例如DJNZR3,L3
4、就是把R3当中的数自减一,然后判断是否为零,不是零就跳转到标签为L3处的程序执行。最后别忘了END,虽然它不产生编译代码,但是为了尊重程序的完整性,还是写在最后吧。单片机程序编写还有一种语言,就是C51,语言。KEIL编译器可以把C语言转化成汇编语言,然后用转化成的汇编语言再次变异hex文件。上面的彩灯循环,我们可以写成如下的方式。#include#includesfrP0=0x80;voiddelay(){inta,b;for(a=0;a<5000;a++)for(b=0:b<20;b++);}voi
5、dmain(){charc,d,e;c=0x7f;P0=c;for(d=0,d<7,d++){c=c>>1;P0=c;delay();}delay();for(e=0,e<7,e++){c=c<<1;P0=c;delay();}}C语言最大的特点就是模块化特别强,用C语言编写的程序出了兼顾51单片机的结构,最重要的是语法规范。大家可以参照C语言教程中的语法结构来分析这段简单的程序。记得一位前辈写过,单片机程序的大体结构是首先上电复位,然后是参数初始化,之后就是个大循环体。每个循环体开始要有使能标志,以便取舍。这一篇先告一段落,下一篇分享一下定
6、时器/计数器的应用,以及矩阵键盘,中断应用,还有LCD1602的驱动方式。
此文档下载收益归作者所有