用单片机设计流水灯的方法和程序编写

上传人:pu****.1 文档编号:561804372 上传时间:2022-12-22 格式:DOCX 页数:11 大小:57.66KB
返回 下载 相关 举报
用单片机设计流水灯的方法和程序编写_第1页
第1页 / 共11页
用单片机设计流水灯的方法和程序编写_第2页
第2页 / 共11页
用单片机设计流水灯的方法和程序编写_第3页
第3页 / 共11页
用单片机设计流水灯的方法和程序编写_第4页
第4页 / 共11页
用单片机设计流水灯的方法和程序编写_第5页
第5页 / 共11页
点击查看更多>>
资源描述

《用单片机设计流水灯的方法和程序编写》由会员分享,可在线阅读,更多相关《用单片机设计流水灯的方法和程序编写(11页珍藏版)》请在金锄头文库上搜索。

1、S51增强型单片机实验板上有8个高亮度发光二极管见图1所示,可以用来做单片机流水灯、跑马灯。等实验,电路原理图见以下列图3。VCC(-+5VfIC1311Z詔振 11.U592MHZ-HDI |:1C2和F页P1.CIEAVPPP1.1P1.2RSTP1.3F1.4F1.5XTAUPl .SXTAI 1円了INTO期口INTLjTSyS51FL1S51増彊型实验扳JM理图L.ED1LED2* 一LED3T .F.D4T FO5 M-LD6图3单片机流水灯设计方法从原理图可以看出,假设我们想让接在P1.0 口的LED1亮起来,那么我们只要把P1.0 口的电平变为低电平就可以了;相反,假设要接在P

2、1.0 口的LED1熄灭,就要把P1.0 口的 电平变为高电平就可以;同理,接在P1.1P1.7 口的其他7个LED的点亮和熄灭方法方法 同LED1。因此,要实现流水灯功能,我们只要将LED2LED8依次点亮、熄灭,依始类 推, 8只LED变会一亮一暗的做流水灯了。实现8个LED流水灯程序用中文表示为: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高、返回到开始、程序完毕。从上面中文表示看来实现单片机流水灯

3、很简单,但是我们不能说P1.0你变低,它就变低了。因为单片机听不懂我们的汉语的,只能承受二进制的“1、0机器代码。我们又怎样来使单片机按我们的意思去工作呢?为了让单片机工作,只能将程序写为二进制代码交给 其执行;早期单片机开发人员就是使用人工编写的二进制代码交给单片机去工作的。今天 我们不必用烦人的二进制去编写程序,完全可以将我们容易理解的“程序语言通过“翻译 软件“翻译成单片机所需的二进制代码,然后交给单片机去执行。这里的“程序语言目前 主要有汇编语言和C语言两种;在这里我们所说的“翻译软件,同行们都叫它为“编译器, 将“程序语言通过编译器产生单片机的二进制代码的过程叫编译。前面说到,要想使

4、LED 1 变亮,只需将对应的单片机引脚电平变为低电平就可以了。如今让我们将上面提到的8 只 LED 流水灯实验写为汇编语言程序。;-主程序开始-START: CLRP1.0;P1.0输出低电平,使LED1点亮ACALLDELAY;调用延时子程序SETBP1.0;P1.0输出高电平,使LED1熄灭CLRP1.1;P1.1输出低电平,使LED2点亮ACALLDELAY;调用延时子程序SETBP1.1;P1.1输出高电平,使LED2熄灭CLRP1.2;P1.2输出低电平,使LED3 点亮ACALLDELAY;调用延时子程序SETBP1.2;P1.2输出高电平,使LED3熄灭CLRP1.3;P1.3

5、输出低电平,使LED4点亮ACALLDELAY;调用延时子程序SETBP1.3;P1.3输出高电平,使LED4熄灭CLRP1.4;P1.4输出低电平,使LED5点亮ACALLDELAY;调用延时子程序SETBP1.4;P1.4输出高电平,使LED5熄灭CLRP1.5;P1.5输出低电平,使LED6 点亮ACALLDELAY;调用延时子程序SETBP1.5;P1.5输出高电平,使LED6熄灭CLRP1.6;P1.6输出低电平,使LED7 点亮ACALLDELAY;调用延时子程序SETBP1.6;P1.6输出高电平,使LED7熄灭CLRP1.7;P1.7输出低电平,使LED8 点亮ACALLDEL

6、AY;调用延时子程序SETBP1.7;P1.7输出高电平,使LED8熄灭ACALLDELAY;调用延时子程序AJMPSTART;8个LED流了一遍后返回到标号START处再循环;-延时子程序-DELAY:MOVR0,#255;延时一段时间D1:MOVR1,#255DJNZR1,$DJNZR0,D1RET;子程序返回END;程序完毕在上面主程序中用到了五条汇编语言指令:CLR、ACALL、SETB、LJMP、END。CLR: 是将其后面指定的位清为0,程序中使对应端口输出低电平ACALL:是子程序调用指令,程序中调用了 DELAY延时子程序SETB :是将其后面指定的位置成1,程序中使对应端口输

7、出高电平AJMP:是无条件跳转指令,意思是:跳转到指定的标号处继续运行END: 是程序完毕的伪指令,意思是告诉编译器,程序到此完毕。伪指令只告诉编译 器此程序到此有何要求或条件,它不参与和影响程序的执行。在上面源程序中ACALL DELAY指令的作用是调用DELAY延时子程序。为什么要 使用这指令呢?假设不用该指令可以实现流水效果吗?答案是肯定的,一定要用该指令才 能看到我们需要的流水效果。假设不用该指令,那么由于8个LED发光与熄灭的时间都 很短,我们肉眼无法看到LED的熄灭与点亮,凭我们肉眼看到的是LED 1LED8都同时亮 半亮,而看不到“流水效果的!注:初学者可以将上面源程序中所有AC

8、ALL DEL AY指令行删除后再编译后烧写到单片机进展验证一下。产生这种现象主要是因为单片机执行每条指令的时间很短,我们知道实验板上单片机的 时钟高达11.0592MHz,在这个时钟信号即晶体振荡信号下,一个“机器周期仅大约1. 08uS(微秒)。本程序中我们用到的SETB P.x和CLR P.x均属于单周期指令,也就是说,执 行一句SETB P.x用时仅1.08uS(微秒),CLR P.x也是1.08uS(微秒);也就是点亮和熄灭时 间都为1.08uS(微秒),在如此高速的流水速度下,8个LED发光与熄灭的时间都很短,当然凭我们的肉眼看不到“流水效果了!这里需要说明的是,按汇编语法要求,所

9、编制的程序下称源程序之格式和书写要求 必须依以下原那么:1、源程序必须为纯文本格式文件,如用Windows“附件中的“记事本编写的文本文 件或用 UltraEdit 文本编辑器编辑;2、源程序的扩展名应是 *.ASM;3、一行只能写一条语句,以回车作为本句的完毕,每一语句行长度应少于80 个字符即 40 个汉字。4、每行的格式应为:标号: 命令 参数 ;注释 。即一行由四部份组成,各部份的顺 序不能搞错,依实际要求可以缺省其中的一部份或几部份,甚至全部省去,即空白行。需要 使用标号时标号后面必须有“:冒号,而命令语句和参数之间必须用空格分开,假设 命令有多个参数,那么参数与参数之间必须用“,逗

10、号分开,需要注释时注释前必须 用“;分号, “;后面的语句可以写任何字符,包括汉字用于解释前面的汇编语句, 它将不参与汇编,不生成代码。由于汇编程序对我们还不直观,所以在编写源程序时,应当 养成多写注释的习惯,这样有助于今后源程序的阅读和维护。标号是标志程序中某一行的符号名,编译后标号的数值就是标号所在行代码的地址。在 宏汇编 ASM51 中标号的长度不受限制,但标号中不能包含:或其它的一些特殊符号,也 不能用汉字,可以用数字作标号,但必须用字母开头。当标号作参数用如标号作转移地址, 在命令后面出现时,必须舍去:如上面程序中的AJMP START中的START是不能再 有:。每行只能有一个标号

11、,一个标号只能用在一处,假设有两行用了同一个标号,那么 汇编时就会出错。由于标号的长度没有限制,可以用有意义的英文或汉语拼音来说明行,使 源程序读起来更方便。在源程序中的字母不区分大小写,也就是说 start 和 START 是一样 的,请不要用大小写方式去区分不同的标号。好啦!我们知道了汇编语言程序的规那么,如今就动手编辑源程序吧。马上启动Keil 单片机集成开发环境,建立新工程liuO1.UV2,将上面的源程序liuOl.asm导入到工程中,设 置好Keil工程的编译参数,编译得到HEX格式的目的文件liuOl.hex,用ISP编程器将目 的文件liu01.hex烧写到AT89S51单片机

12、中,接下来就是将烧写好的AT89S51从编程器上取下,放到“ S51增强型单片机实验板上通电,我们就看到了 LED 1LED8的流水效果了。到此,我们做的流水灯已成功,工作原理也清楚啦,假设你完全掌握了上面程序,那么你就 可以将“流水灯的流向改变一下,可以将从左向右流改为从右向左流,也可以改为两 边向内流、内部向外流,我想你一定能用前面学到的方法实现这些功能。可能有些高手说,前面的编程方法是最最笨的!不错!但初学单片机初期可以不必讲究语言的简练,只 要能实现预先要求就好,最主要的是学好根本指令111 条的用法,清楚各个指令的功能, 这是初学者要知道的。那么还有更好的编程思路吗?当然有!请跟随站

13、长继续学习下面的内 容。在前面学习的程序中我们让LED流水是去逐个控制P1端口的每个位来实现的,因此程 序显得有点复杂,下面我们就采用新的思路来编程。新的编程思路如下:我们在程序一开始 就给P1 口送一个数,这个数本身就让P1.0先低,其他位为高,然后让这个数据向高位挪动 不就实现“流水效果啦?确实如此! 8051指令中没有让P1数据挪动的指令,但有对累加 器ACC中数据左移或右移的指令,ACC在指令中常写为A,累加器A数据左移指令为RL A,累加器数据右移指令为RR A,累加器在数据传输和数据处理过程中作用非常重要, 累加器ACC为8位。他可与片内所有单字节存放器交换数据,实际上P1和其他端

14、口在单 片机中也是一个存放器。这样我们可以将需挪动的数据先放到ACC中,让其挪动,然后将 ACC挪动后的数据再转送到P1 口,这样同样可以实现“流水效果。下面程序就是采用新 的编程思路源程序 liu02.asm。主程序开始START: MOV ACC,#0FEH;ACC中先装入LED1亮的数据二进制的11111110MOV P1,ACC;将ACC的数据送P1 口MOV R0,#7;将数据再挪动7次就完成一个8位流水过程LOOP:RLA;将ACC中的数据左移一位MOVP1,A;把ACC挪动过的数据送pl 口显示ACALLDELAY;调用延时子程序DJNZR0,LOOP;没有挪动够7次继续挪动AJMPSTART;挪动完7次后跳到开始重来,以到达循环流动效果;-延时子程序-DELAY: MOVR0,#255;延时一段时间Dl:MOVR1,#255DJNZR1,$DJNZR0,

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 学术论文 > 其它学术论文

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号