51八只LED灯做流水灯实验知识分享.docx

上传人:b****5 文档编号:6945366 上传时间:2023-01-13 格式:DOCX 页数:13 大小:244.13KB
下载 相关 举报
51八只LED灯做流水灯实验知识分享.docx_第1页
第1页 / 共13页
51八只LED灯做流水灯实验知识分享.docx_第2页
第2页 / 共13页
51八只LED灯做流水灯实验知识分享.docx_第3页
第3页 / 共13页
51八只LED灯做流水灯实验知识分享.docx_第4页
第4页 / 共13页
51八只LED灯做流水灯实验知识分享.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

51八只LED灯做流水灯实验知识分享.docx

《51八只LED灯做流水灯实验知识分享.docx》由会员分享,可在线阅读,更多相关《51八只LED灯做流水灯实验知识分享.docx(13页珍藏版)》请在冰豆网上搜索。

51八只LED灯做流水灯实验知识分享.docx

51八只LED灯做流水灯实验知识分享

51八只LED灯做流水灯实验

第一节:

单片机在上电初始后,其各端口输出为高电平。

如果我们现在想让接在P1.0口的LED1亮,那么我们只要把P1.0口的电平变为低电平就可以了。

想让LED1灭,LED0亮,只需将P1.0升高,P1.1变低,LED1就熄灭LED2随后既点亮!

依始类推如下所示8只LED变会一亮一暗的做流水灯了。

本实验在“SP-51实验板”学习套件上的相关图纸:

P1.0低、P1.0高、P1.1低、P1.1高、P1.2低、P1.2高、P1.3低、P1.3高、P1.4低、P1.4高、P1.5低、P1.5高、P1.6低、P1.6高、P1.7低、P1.7高、返回到开始、程序结束。

我们不能说P1.1你变低,它就变低了。

因为单片机听不懂我们的汉语的,只能接受二进制的“1、0......”代码。

我们又怎样来用二进制语议论使单片机按我们的意思去工作呢?

为了让单片机工作,只能将程序写为二进制代码交给其执行;早期单片机开发人员就是使用人工编写的二进制代码交给单片机去工作的。

今天,我们不必用烦人的二进制去编写程序,完全可以将我们容易理解的“程序语言”通过“翻译”软件“翻译”成单片机所需的二进制代码,然后交给单片机去执行。

这里的“程序语言”目前主要有汇编和C两种;在这里我们所说的“翻译”软件,同行们都叫它为“编译器”,将“程序语言”通过编译器产生单片机的二进制代码的过程叫编译。

前面说到,要想使LED1变亮,只需将对应的单片机引脚电平变为低电平就可以了。

现在让我们将上面提到的8只LED流水灯实验写为汇编语言程序。

“汉语”语言

汇编语言

开始:

star:

P1.0低

clrp1.0

P1.0高

setbp1.0

P1.1低

clrp1.1

P1.1高

setbp1.1

P1.2低

clrp1.2

P1.2高

setbp1.2

P1.3低

clrp1.3

P1.3高

setbp1.3

P1.4低

clrp1.4

P1.4高

setbp1.4

P1.5低

clrp1.5

P1.5高

setbp1.5

P1.6低

clrp1.6

P1.6高

setbp1.6

P1.7低

clrp1.7

P1.7高

setbp1.7

返回到开始

ljmpstar

结束

end

这里用到了四条汇编指令:

clr、setb、ljmp、end;

clr:

是将其后面指定的位清为0;

setb:

是将其后面指定的位置成1;

ljmp:

是无条件跳转指令,意思是:

跳转到指定的标号处继续运行。

end:

是一条告诉编译器:

程序到此结束的伪指令。

伪指令只告诉编译器此程序到此有何要求或条件,它不参与和影响程序的执行。

这里需要说明的是,按汇编语法要求,所编制的程序(下称源程序)之格式和书写要求必须依下列原则:

1、源程序必须为纯文本格式文件,如用Windows“附件”中的“记事本”编写的文本文件;2、源程序的扩展名应是*.ASM;3、一行只能写一条语句,以回车作为本句的结束,每一语句行长度应少于80个字符(即40个汉字)。

4、每行的格式应为:

标号:

命令参数;注释

即一行由四部份组成,各部份的顺序不能搞错,依实际要求可以缺省其中的一部份或几部份,甚至全部省去,即空白行。

需要使用标号时标号后面必须有“:

”(冒号),而命令语句和参数之间必须用空格分开,如果命令有多个参数,则参数与参数之间必须用“,”(逗号)分开,需要注释时注释前必须用“;”(分号),“;”后面的语句可以写任何字符,包括汉字用于解释前面的汇编语句,它将不参与汇编,不生成代码。

由于汇编程序对我们还不直观,所以在编写源程序时,应当养成多写注释的习惯,这样有助于今后源程序的阅读和维护。

标号是标志程序中某一行的符号名,编译后标号的数值就是标号所在行代码的地址。

在宏汇编ASM51中标号的长度不受限制,但标号中不能包含‘:

’或其它的一些特殊符号,也不能用汉字,可以用数字作标号,但必须用字母开头。

当标号作参数用(如标号作转移地址),在命令后面出现时,必须舍去‘:

’(如上面程序中的LJMPSTAR中的STAR是不能再有:

)。

每行只能有一个标号,一个标号只能用在一处,如果有两行用了同一个标号,则汇编时就会出错。

由于标号的长度没有限制,可以用有意义的英文或汉语拼音来说明行,使源程序读起来更方便。

源程序中的字母不区分大小写,也就是说star和STAR是一样的,请不要用大小写方式去区分不同的标号。

好拉!

规矩知道了,现在该来看看前面我们编写的源程序该怎样处理了:

编写源程序:

先将编译软件安装好(c51eval软件的安装)。

软件安装好我们就可以编写程序了。

第一步:

双击Uvw51图标,出现如图一所示的主界面

第二步:

新建文件

单击菜单栏内的“文件----新建”或者单击图标按钮则在上图所示的灰色区域内出现一个白色的编辑区,这时我们就中以在这里编辑程序了。

如图二所示。

图二

第三步:

编程程序

建立了一个新的编程文件后,我们就可以在这里编写我们所需要的程序了,下面我们就来编写前面所说的程序吧。

如图三所示:

第四步:

保存文件

程序编写好了,我们当然要记得保存了,要不我们编写程序就白费劲了。

好了,下面我们将上面编写的程序保存起来:

单击“文件----保存”或者单击图标,出现如图四所示的对话框:

图四

这时参照图五所示将对话框的内容设置好:

c51eval保存文件时默认的文件扩展是名*.C,请按图五所示改变为为*.a51:

图五

我们这里就先将文件保存在D/DDW文件夹中,文件名你可以随便取,这里先叫他为LED.a51;需强调的是保存文件的文件夹和文件名不能使用中文!

即保存文件时不能以如下格式保存:

正确的保存路径:

D/DDW/LED.a51当然,保存的文件夹名DDW、编写的程序的文件名LED,你都可以随意的取一个,可以是D/ABC/000.a51。

这就取决于你的兴趣了。

错误的保存路径:

D/源程序/DDW/LED.a51,或者是D/DDW流水灯程序.a51。

总之在源程序的保存路径下不能有中文的出现,同时文件名不能取的太长。

第五步:

建立项目

将汇编的源程序保存后,还没有得到我们所需要的文件,这时我们还需要再建立项目,以便得到我们所需的hex文件。

新建项目的步骤如下:

首先先打开新建项目的对话框文件,如图六所示:

图六

点击新建项目后出现如图七所示的对话框,我们将对话框的参数设定好。

将文件名设置成与刚才源程序的文件名相同,即设为LED.prj,同时保存的路径跟前面的源程序保存的路径一样,在D/DDW上。

现在就可以把刚才建立的项目文件LED.prj添加到刚保存的LED.A51源程序上了,注意它们都在同一个根目录下。

图七

按图七所示操作后,会出现如图八所示的对话框:

图八

点击“(A)加”出现如图九所示画面:

图九

按图九所示完成操作后,软件会自动打开一个对话框,如图十所示:

图十

如图十所示点击保存后,系统会自动回复到汇编状态。

这时点击*创建所有

图标*按钮,则进行了转换,并出现如图十一所示的状态显示画面:

图十一

完成上述操作后,在图十一,我们看到了创建成功了的提示画面,这时我们点击OK就大功告成了。

打开我们文件的保存路径:

我的电脑/D/DDW我们可以看到包含hex文件在内的所有相关程序文件了。

我们上面的项目文件也在其中了。

他的名字叫作LED.hex文件。

好啦,到此我们已将第一个流水灯程序编写、编译、烧写进行完啦,再下来就是将烧写好的AT89C51从编程器上取下,放到“SP-51实验板”学习套件的实验部份通电让LED1~LED8“流水”。

说明:

由于单片机的时钟高达12MHz,8个LED发光与熄灭的时间很短,实际实验结果凭我们的肉眼是看不到“流水”效果的!

那怎样才能让我们肉眼看到“流水”灯效果呢?

请继续学习下节课

 流水灯实验详解二

上一节的实验最后没有得到“流水”显示的效果,主要是单片机执行每条指令的时间很短,我们肉眼无法看到LED的熄灭与点亮。

单片机内部能按部就班的自动工作,正是在系统时钟的作用下,内部各逻辑硬件产生各种所需脉冲信号而实现的。

这个时钟信号(既晶体振荡信号)的周期称“振荡周期”。

我们这个实验中晶体使用的是12MHZ.在单片机中,要处理最短周期的一条指令需要由12个振荡周期(既晶振振荡周期)组成的,这个叫“机器周期”。

8051核的单片机,大多数指令只用一个机器周期(既单周期),也有双周期和四周期的指令。

本实验中用到的SETBP.x和CLRP.x均属于单周期指令,也就是说,执行一句SETBP.x用时仅1uS(微秒),CLRP.x也是1uS;难怪我们前面的程序不能看到流水效果。

现在,将程序改动一下,在每点亮一个LED后,让程序干点别的事,也就是让它等一会再将该LED熄灭,继续执行下面的程序:

DDW:

;程序开始

CLR

P1.0

;LED1亮

ACALL

DELAY

;调用延时子程序

SETB

P1.0

;LED1灭

CLR

P1.1

;换灯,同上

ACALL

DELAY

?

SETB

P1.1

?

CLR

P1.2

?

ACALL

DELAY

?

SETB

P1.2

?

CLR

P1.3

?

ACALL

DELAY

?

SETB

P1.3

?

CLR

P1.4

?

ACALL

DELAY

?

SETB

P1.4

?

CLR

P1.5

?

ACALL

DELAY

?

SETB

P1.5

?

CLR

P1.6

?

ACALL

DELAY

?

SETB

P1.6

?

CLR

P1.7

?

ACALL

DELAY

?

SETB

P1.7

?

LJMP

DDW

;返回到开始循环

DELAY:

?

;延时子程序

MOV

R1,#50

?

AD10:

?

 

MOV

R2,#100

?

AD11:

?

 

MOV

R3,#100

?

DJNZ

R3,$

?

DJNZ

R2,AD11

?

DJNZ

R1,AD10

?

RET

;延时子程序结束,返回到调用处的下一句

END

?

请将上面的程序保存为1LED.asm,进行编译,并烧写到AT89S51中,之后将89S51安装到套件的实验部份插座上实验,这回显示的就是“流水灯”的效果了!

?

回过头,让我们看看延时子程序是怎样工作的:

单片机内部有不少寄存器,这些寄存器在单片机通电时,你可以给他写入数据(是单片机按你程序要求写的数据,而不是编程器写的),当第二次给他写入新数据时,前次的数据就被新数据覆盖;当然也可以从寄存器中读取数据。

当单片机没有电源供给时,寄存器内部的数据也随即消失;这些寄存器人们叫他RAM,而用编程器将我们编写的程序烧写到单片机中的存储器叫ROM;现在,我们应该清楚:

RAM是让程序去使用的,ROM是我们编写的程序存放的地方!

前面说过,单片机内部有不少RAM,本实验用的AT89C51有多少寄存器?

我们现在不必关心,现在只须知道单片机内部有名叫R0~R7的这8个寄存器。

这8个寄存器每个都由8个单独的位寄存器组成,最大存放数据为二进制的11111111,十六进制=FF,十进制=255。

在使用时注意不要大于其有效范围。

上面延时程序中,先用到MOVR1,#50,MOV是移动的意思,该句是将50这个十进制数放到R1中;50是立即数,按汇编语言要求前面要加“#”号,汇编语言还规定,十六进制数后面要加“?

H”,十六进制数的高位是字母时在字母前面还要加“0”,例如:

#0F8H;二进制数后面加“B”,例如:

#11110000B。

十进制不加,例如:

#100。

延时程序的第二、三句为:

MOVR2,#100;MOVR3,#100;这两句意思同前。

第四句中DJNZR3,$的意思是将R3里面的数减1后如果R3不等于0则跳到后面指定的程序位置,这里的“$”既要跳转的程序位置,“$”代表当前语句处,也就是说,R3不等于0,程序返回再次执行本句。

如果R3减1后等于0,程序结束本句,继续执行下面的语句。

延时程序的最后一句是RET,意思是退出本子程序,返回到调用本子程序处的下一句。

根据上面的解释,一进入延时子程序首先为R1,R2,R3寄存器装入我们需要的数据,然后先对R3进行减数,每次减1,R3减完后减R2,减R2时就费事啦,因为R2每减1后不为0需要跳转到AD11标号处执行下面的语句,此时R3再次装入数据100,并且还要再次对R3进行减数......,R2减完后减R1,减R1的过程你研究研究看看。

每执行DJNZ?

Rn,rel(Rn指R0~R7,rel指转移地址)指令一次,需要2个机器周期,单片机需耗时2uS(指本实验),若忽略装数等语句,延时子程序从开始到结束,单片机共耗时100*100*50*2nS,既1000000uS=1秒!

若加上装数等语句的耗时,延时时间大于1秒。

到此,我们做的流水灯已成功,原理大致也明白啦,若你自认为这一课你完全明白了,那请你将“流水灯”的流向改变一下,也可以改为两边向内流,内部向外流......,我想你一定能用前面学到的方法实现这些功能。

可能有些高手说,前面的编程方法是最最笨的!

,不错!

但玩单片机初期不必讲究语言的简练,只要能完成预先要求就好,这是初学者要知道的。

那么还有更好的编程思路吗?

有!

请继续学习下节课

做流水灯实验详解三

在上节课中让LED流水是去逐个控制P1端口的每个位来实现的,那么我们在程序一开始就给P1口送一个数,这个数本身就让P1.0先低,其他位为高,然后让这个数据向高位移动不就实现“流水”效果啦?

的确如此!

可惜,8051没有让P1数据移动的指令,但有对累加器ACC中数据左移或右移的指令,ACC是8051单片机内部算术逻辑单元中的一个“寄存器”(这里叫他寄存器是不正确的,但你可以先这样理解,ACC在指令中常写为A),他在数据传输和数据处理过程中作用十分重要,ACC为8位。

他可与片内所有单字节寄存器交换数据,实际上P1和其他端口在单片机中也是一个寄存器。

这样我们可以将需移动的数据先放到ACC中,让其移动,然后将ACC移动后的数据再转送到P1口,这样同样可以实现“流水”效果。

程序如下:

DDW:

?

;开始

MOV

ACC,#0FEH

;ACC中先装入LED1熄灭的数据(即二进制的11111110)

MOV

P1,ACC

;将ACC的数据送P1口

MOV

R0,#7

;因上句送到?

p1口的数据就熄灭了一位,所以将数据再移动7次就完成一个8位流水过程

LOOP:

?

;数据移动循环

Rl

A

;将ACC中的数据左移一位

MOV

P1,A

;把ACC移动过的数据送p1口显示

ACALL

DELAY

;调用延时

DJNZ

R0,LOOP

;没有移动够7次继续移动

LJMP

DDW

;移动完7次后跳到开始重来,以达到循环流动效果

DELAY:

?

;延时子程序,就是上节课中的延时子程序

MOV

R1,#50

?

ADl0:

?

 

MOV

R2,#100

?

ADl1:

?

 

MOV

R3,#100

?

DJNZ

R3,$

?

DJNZ

R2,AD11

?

DJNZ

R1,AD10

?

RET

?

;延时子程序结束,返回到调用处的下一句

END

?

;本汇编程序到此结束

接下来,将上述程序编译,并烧写到前面我们的实验芯片中,流水效果与第二节课的一样。

其实8051单片机有111条指令,这111条指令好比以前我们使用数字传呼机时的“短语代码”一样,可以用几个“短语代码”去表示一句完整、通顺的语句段落。

有的指令常用,有的指令不常用,只要遵守语法规则,你可以用这些指令“组合”成你想象到的任何程序。

当然,有时一条指令可以替代很多条指令,这样会使程序简捷,费码减少,在编写较大程序时可以让程序存储器放得下你需要的代码。

这也是单片机高手所追求的。

当然,在程序存储器空间不成问题时,你不这样做但也可以达到预期的功能,这也不算错。

单片机内部还有很多“部件”我们只是用到什么说什么,很不系统。

但是我也不想系统的介绍这些,因系统介绍单片机结构和指令的书很多,何况写的远比我好,因此,希望你在看本讲座的过程中,还要结合正规的教材学习其更多的指令和“部件”。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工作范文

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1