开关键盘流水灯设计3Word下载.docx

上传人:b****7 文档编号:22963141 上传时间:2023-02-06 格式:DOCX 页数:13 大小:54.35KB
下载 相关 举报
开关键盘流水灯设计3Word下载.docx_第1页
第1页 / 共13页
开关键盘流水灯设计3Word下载.docx_第2页
第2页 / 共13页
开关键盘流水灯设计3Word下载.docx_第3页
第3页 / 共13页
开关键盘流水灯设计3Word下载.docx_第4页
第4页 / 共13页
开关键盘流水灯设计3Word下载.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

开关键盘流水灯设计3Word下载.docx

《开关键盘流水灯设计3Word下载.docx》由会员分享,可在线阅读,更多相关《开关键盘流水灯设计3Word下载.docx(13页珍藏版)》请在冰豆网上搜索。

开关键盘流水灯设计3Word下载.docx

 

图1流水灯硬件原理图

从原理图中可以看出,如果要让接在P1.0口的LED1亮起来,那么只要把P1.0口的电平变为低电平就可以了;

相反,如果要接在P1.0口的LED1熄灭,就要把P1.0口的电平变为高电平;

同理,接在P1.1~P1.7口的其他7个LED的点亮和熄灭的方法同LED1。

因此,要实现流水灯功能,我们只要将发光二极管LED1~LED8依次点亮、熄灭,8只LED灯便会一亮一暗的做流水灯了。

在此我们还应注意一点,由于人眼的视觉暂留效应以及单片机执行每条指令的时间很短,我们在控制二极管亮灭的时候应该延时一段时间,否则我们就看不到“流水”效果了。

3、软件编程

单片机的应用系统由硬件和软件组成,上述硬件原理图搭建完成上电之后,我们还不能看到流水灯循环点亮的现象,我们还需要告诉单片机怎么来进行工作,即编写程序控制单片机管脚电平的高低变化,来实现发光二极管的一亮一灭。

软件编程是单片机应用系统中的一个重要的组成部分,是单片机学习的重点和难点。

下面我们以最简单的流水灯控制功能即实现8个LED灯的循环点亮,来介绍实现流水灯控制的几种软件编程方法。

3.1位控法

这是一种比较笨但又最易理解的方法,采用顺序程序结构,用位指令控制P1口的每一个位输出高低电平,从而来控制相应LED灯的亮灭。

程序如下:

ORG 

0000H 

单片机上电后从0000H地址执行

AJMP 

START 

跳转到主程序存放地址处

0030H 

设置主程序开始地址

START:

MOV 

SP,#60H 

设置堆栈起始地址为60H

CLR 

P1.0 

P1.0输出低电平,使LED1点亮

ACALL DELAY 

调用延时子程序

    SETB  P1.0 

P1.0输出高电平,使LED1熄灭

    CLR  P1.1 

P1.1输出低电平,使LED2点亮

    SETB  P1.1 

P1.1输出高电平,使LED2熄灭

    CLR  P1.2 

P1.2输出低电平,使LED3点亮

    SETB  P1.2 

P1.2输出高电平,使LED3熄灭

    CLR  P1.3 

P1.3输出低电平,使LED4点亮

    ACALL DELAY 

    SETB  P1.3 

P1.3输出高电平,使LED4熄灭

    CLR  P1.4 

P1.4输出低电平,使LED5点亮

    SETB  P1.4 

P1.4输出高电平,使LED5熄灭

    CLR  P1.5 

P1.5输出低电平,使LED6点亮

    SETB  P1.5 

P1.5输出高电平,使LED6熄灭

    CLR  P1.6 

P1.6输出低电平,使LED7点亮

SETB  P1.6 

P1.6输出高电平,使LED7熄灭

    CLR  P1.7 

P1.7输出低电平,使LED8点亮

    SETB  P1.7 

P1.7输出高电平,使LED8熄灭

    AJMP  

8个LED流了一遍后返回到标号START处再循环

DELAY:

  

延时子程序

R0,#255  ;

延时一段时间

D1:

MOV 

R1,#255

DJNZ 

R1,$

R0,D1

RET 

子程序返回

    END 

程序结束

3.2循环移位法

在上个程序中我们是逐个控制P1端口的每个位来实现的,因此程序显得有点复杂,下面我们利用循环移位指令,采用循环程序结构进行编程。

我们在程序一开始就给P1口送一个数,这个数本身就让P1.0先低,其他位为高,然后延时一段时间,再让这个数据向高位移动,然后再输出至P1口。

由于8051系列单片机的指令中只有对累加器ACC中数据左移或右移的指令,因此实际编程中我们应把需移动的数据先放到ACC中,让其移动,然后将ACC移动后的数据再转送到P1口,这样同样可以实现“流水”效果。

具体编程如下所示。

设置堆栈起始地址为60H

MOV  

A,#0FEH 

ACC中先装入LED1亮的数据(二进制的11111110)

MOV  P1,A 

将ACC的数据送P1口

MOV  R0,#7 

将数据再移动7次就完成一个8位流水过程

LOOP:

RL 

将ACC中的数据左移一位

P1,A 

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

ACALL 

DELAY 

R0,LOOP 

没有移动够7次继续移动

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

3.3查表法

  上面的两个程序都是比较简单的流水灯程序,“流水”花样只能实现单一的“从左到右”流方式。

运用查表法所编写的流水灯程序,能够实现任意方式流水,而且流水花样无限,只要更改流水花样数据表的流水数据就可以随意添加或改变流水花样,真正实现随心所欲的流水灯效果。

我们首先把要显示流水花样的数据建在一个以TAB为标号的数据表中,然后通过查表指令“MOVC A,@A+DPTR”把数据取到累加器A中,然后再送到P1口进行显示。

具体源程序如下,TAB标号处的数据表可以根据实现效果的要求任意修改。

DPTR,#TAB 

流水花样表首地址送DPTR

CLR 

累加器清零

MOVC 

A,@A+DPTR 

取数据表中的值

CJNE 

A,#0FFH,SHOW;

检查流水结束标志

所有花样流完,则从头开始重复流

SHOW:

将数据送到P1口

INC 

DPTR 

取数据表指针指向下一数据

LOOP 

继续查表取数据

 

R0,#255   

TAB:

     

下面是流水花样数据表,用户可据要求任意编写

DB 

11111110B 

二进制表示的流水花样数据,从低到高左移

11111101B

11111011B

11110111B

11101111B

11011111B

10111111B

01111111B

01111111B 

二进制表示的流水花样数据,从高到低右移

11111110B

0FEH,0FDH,0FBH,0F7H 

十六进制表示的流水花样数据

0EFH,0DFH,0BFH,7FH

7FH,0BFH,0DFH,0EFH

0F7H,0FBH,0FDH,0FEH

……

DB0FFH 

流水花样结束标志0FFH

END 

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

  1、源程序必须为纯文本格式文件,如用Windows“附件”中的“记事本”编写的文本文件或用UltraEdit文本编辑器编辑;

  2、源程序的扩展名应是*.ASM;

  3、一行只能写一条语句,以回车作为本句的结束,每一语句行长度应少于80个字符(即40个汉字)。

  4、每行的格式应为:

标号:

命令参数;

注释。

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

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

”(冒号),而命令语句和参数之间必须用空格分开,如果命令有多个参数,则参数与参数之间必须用“,”(逗号)分开,需要注释时注释前必须用“;

”(分号),“;

”后面的语句可以写任何字符,包括汉字用于解释前面的汇编语句,它将不参与汇编,不生成代码。

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

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

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

'

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

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

(如上面程序中的AJMPSTART中的START是不能再有:

)。

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

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

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

 知道了汇编语言程序的规则,现在就动手编辑源程序。

马上启动Keil单片机集成开发环境,建立新工程liu01.UV2,将上面的源程序liu01.asm导入到工程中,设置好Keil工程的编译参数,编译得到HEX格式的目标文件liu01.hex,用ISP编程器将目标文件liu01.hex烧写到AT89S51单片机中,接下来就是将烧写好的AT89S51从编程器上取下,放到“S51增强型单片机实验板”上通电,我们就看到了LED1~LED8的"

流水"

效果。

  到此,我们做的流水灯已成功,工作原理也清楚啦,若你完全掌握了上面程序,那么你就可以将“流水灯”的流向改变一下,可以将从"

左向右流"

改为从"

右向左流"

,也可以改为"

两边向内流"

、"

内部向外流"

......,我想你一定能用前面学到的方法实现这些功能。

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

不错!

但初学单片机初期可以不必讲究语言的简练,只要能实现预先要求就好,最主要的是学好基本指令(111条)的用法,清楚各个指令的功能,这是初学者要知道的。

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

当然有!

请跟随站长继续学习下面的内容。

在前面学习的程序中我们让LED流水是去逐个控制P1端口的每个位来实现的,因此程序显得有点复杂,下面我们就采用新的思路来编程。

新的编程思路如下:

我们在程序一开始就给P1口送一个数,这个数本身就让P1.0先低,其他位为高,然后让这个数据向高位移动不就实现“流水”效果啦?

的确如此!

8051指令中没有让P1数据移动的指令,但有对累加器ACC中数据左移或右移的指令,ACC在指令中常写为A,累加器A数据左移指令为"

RL A"

,累加器数据右移指令为"

RR A"

,累加器在数据传输和数据处理过程中作用十分重要,累加器ACC为8位。

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

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

下面程序就是采用新的编程思路源程序liu02.asm。

实现8个LED流水灯汇编语言程序liu02.asm

;

-----主程序开始-----

START:

 MOV  ACC,#0FEH  ;

ACC中先装入LED1亮的数据(二进制的11111110)

    MOV  P1,ACC   ;

将ACC的数据送P1口

    MOV  R0,#7    ;

将数据再移动7次就完成一个8位流水过程

LOOP:

 RL   A      ;

    MOV  P1,A    ;

    ACALL DELAY    ;

    DJNZ  R0,LOOP   ;

    AJMP  START    ;

    ;

-----延时子程序-----

DELAY:

 MOV  R0,#255   ;

D1:

  MOV  R1,#255

    DJNZ  R1,$

    DJNZ  R0,D1

    RET         ;

    END         ;

接下来,我们将上述程序编译,并烧写到实验芯片中,放到实验板上可以看到程序的"

效果是一样的,但源程序看起来更加简洁,直观。

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

当然,有时一条指令可以替代很多条指令,这样会使程序简洁,程序代码减少,在编写较大程序时可以让程序存储器放得下你需要的代码,这也是单片机高手所追求的“程序简洁高效”。

总结

通过这次开关/键盘控制流水灯设计研究的课程设计让我学到了许多知识,不仅给我开阔了思路,而且还让我认识到了自己对以前所学过知识的不足。

在这次课程设计当中我碰到了许多问题,我曾经接触过这方面的书籍和实物,也对其有一些简单的了解。

但是却不知道具体的工作原理,当我拿到课程设计的题名后完全不知道该怎么办好,在李老师的悉心指导下,我明白了其中的道理,于此同时我通过大量地阅读和查阅相关的资料,最终此次课程设计才得以完成。

通过这次课程设计让我懂得了在以后的学习和工作当中要不断地完善自我、努力上进、刻苦钻研力争在电子信息行业有一个好的发展和结果。

致谢

课程设计是自己在大学中的一段经历,从设计之初的无从下手到设计工作的圆满完成,期间遇到了诸多的问题和困难。

但在李老师的细心指导和帮助下,通过自己的努力,最终这些问题与困难都得到了圆满解决。

使我可以按时课程设计并使自己的专业知识与综合能力都得到了相应的提高。

在课程设计过程中,李老师在百忙中对我的设计进行了指导。

他首先细致地为我解题;

当我迷茫于众多的资料时,又为我提纲挈领、梳理脉络,使我确立了本文的框架。

感谢李老师对我的课程设计不厌其烦的悉心指导。

在课程设计写作当中中,每次都能恰逢其时地得到李老师的亲切指点。

从框架的完善,到内容的扩充;

从行文的用语到格式的规范;

李老师都严格要求,力求完美。

而且我还从李老师那里学到了严谨、务实、认真的工作态度和极强的敬业精神。

我再次为李老师的耐心付出表示感谢。

参考文献:

[1]胡汉才.单片机原理与接口技术[M].北京:

清华大学出版社,1995.6.

[2]楼然苗等.51系列单片机设计实例[M].北京:

北京航空航天出版社,2003.3.

[3]何立民.单片机高级教程[M].北京:

北京航空航天大学出版社,2001.

[4]赵晓安.MCS-51单片机原理及应用[M].天津:

天津大学出版社,2001.3.

[5]肖洪兵.跟我学用单片机[M].北京:

北京航空航天大学出版社,2002.8.

[6]夏继强.单片机实验与实践教程[M].北京:

北京航空航天大学出版社,2001.[7]于凤明.单片机原理及接口技术[M].北京:

中国轻工业出版社,1998.

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

当前位置:首页 > 总结汇报 > 学习总结

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

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