用单片机控制的LED流水灯设计(电路、程序全部给出)
光控流水灯实验报告

光控流水灯实验报告LED流水灯实验报告LED流水灯的设计报告课程名称:LED流水灯设计学院:大数据与信息工程学院专业:姓名:学号:年级:任课教师:一、实验的背景和意义单片机全称叫单片微型计算机,是一种集成在电路芯片,是采用大规模集成电路技术把CPU随机存储器RAM、只读存储器ROM、多种输入输出口、定时器/计时器等功能集成到一块硅片上构成的一个小而完善的计算机系统。
目前单片机渗透到我们生活的各个领域,几乎很难找到哪个领域没有单片机的应用。
大致可以分为以下几个范畴: 1、在智能仪器仪表上的应用,例如精确的测量设备;2、在工业控制中的应用,例如用单片机可以构成形式多样的控制系统,与计算机互联网构成二级控制系统等;3、在家用电器中的应用,可以从手机、电话机、小型程控交换机、楼宇自动通信呼叫系统、列车无线通信、再到日常工作中随处可见的移动电话、集群移动通信、无线电话对讲机等;4、在医用设备中的应用,例如医用呼叫机、各种分析仪、超声诊断设备及病床呼叫系统等等;5在各种大型电器中的模块化作用,如音乐集成单片机,看是简单的功能,微缩在电子芯片中,就需要复杂的类似于计算机的原理。
本设计着重在于分析计算器软件和开发过程中的环节和步骤,并从实践经验出发计算器设计做了详细的分析和研究。
本系统就是充分利用了8051芯片的I/O引脚。
系统已采用MCS—51系列单片机为中心器件来设计LED流水灯系统,实现LED左循环显示,并实现循环的速度可调。
二、设计目的1.学习基本理论在实践中综合运用的初步经验,掌握电路设计的基本方法、设计步骤,培养综合设计与调试能力。
2.掌握汇编语言程序和C语言程序设计方法。
3.培养实践技能,提高分析和解决实际问题的能力。
三、设计任务及要求1.用个发光二极管作为显示电路2.实现LED动态显示3.能连续循环显示四、设计思路LED流水灯实际上是一个带有八个放光二极管的单片机最小应用系统,即为由晶振LED灯、电阻、电容器、电源等电路和必要的软件组成的单个单片机。
实验1 流水灯实验

单片机原理及应用学院计算机与电子信息学院专业电子信息工程班级电信11 -班姓名学号 110340301 指导教师左敬龙实验报告评分:_______实验1 流水灯实验一、实验原理及电路单片机通过P0、P1口来分别控制8个LED灯,为了使它产生流水灯的效果,必须要对每个LED灯进行有规律的控制。
所以就要通过对P0、P1口进行赋值,来实现流水灯效果。
P0口的8个LED灯就相当于8位二进制,也可以用两位十六进制来代替,这样就会显得简洁、明亮。
根据不同的实验板,要使得LED灯亮起来,可能有些高电平有效,有些是低电平有效。
所以对P0、P1口进行编码是就需要注意。
而我的实验板是低电平有效的,换句话说也就是0代表亮、1代表灭。
接下来就要分别对P0、P1口进行编码,由于闪烁的方式比较多,为了使别人看起来简单、易懂,我就使用数组的方式来进行编码。
所需的代码编好之后,接下来还需要一个延时函数,其作用是控制每个LED灯亮的时间长短。
最后还要一个While语句使得P0P1口的编码不停地循环执行,这样就可以使得LED灯无间断地有规律地闪烁起来。
电路原理图二、功能说明该流水灯一共有种闪烁方式:第一种:两个两个轮流闪亮(从P0^0、P0^1开始);第二种:一个一个轮流闪亮直到最后一个然后接着又倒流回来(从P0^0开始);第三种:P0、P1口各三个轮流闪亮直到最后然后全亮全灭2次接着倒流回来(从P0^0-2、P1^0-2开始);第四种:一个接一个亮起来直到全亮然后一个接一个熄灭直到全灭,之后全亮全灭3次。
三、实验框图四、实验代码#include<reg52.h>#define uchar unsigned char#define uint unsigned intuchar code pattern_P0[]={ 0xf8,0xf1,0xe3,0xc7,0x8f,0x1f,0x3f,0x7f,0xff,0xff,0xff,0xff,0xff,0 xff,0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0xff,0xff,0xff,0xff,0xff,0xff ,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xbf,0xdf,0xef,0xf7,0xfb ,0xfd,0xfe,0xf8,0xf1,0xe3,0xc7,0x8f,0x1f,0xff,0x00,0xff,0x00,0x1f,0x8f,0xc7,0xe3 ,0xf1,0xf8,0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xc0,0xe0,0xf0,0xf8 ,0xfc,0xfe,0x00,0xff,0x00,0xff,0x00,0xff};uchar code pattern_P1[]={ 0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0x3f,0x1f,0x8f,0xc7,0xe3,0xf1,0x f8,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfd,0xfb,0xf7,0xef,0xdf ,0xbf,0x7f,0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe,0xff,0xff,0xff,0xff,0xff,0xff ,0xff,0xff,0xf8,0xf1,0xe3,0xc7,0x8f,0x1f,0xff,0x00,0xff,0x00,0x1f,0x8f,0xc7,0xe3 ,0xf1,0xf8,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfc,0xf8,0xf0,0xe0,0xc0 ,0x80,0x00,0x00,0x80,0xc0,0xe0,0xf0,0xf8,0xfc,0xfe,0xff,0xff,0xff,0xff,0xff,0xff ,0xff,0xff,0x00,0xff,0x00,0xff,0x00,0xff};void delayms(uint x){ uchar i;while(x--){ for(i=0;i<110;i++);}}void main(){ uchar i;while(1){ for(i=0;i<100;i++){ P0=pattern_P0[i];P1=pattern_P1[i];delayms(300);}}}五、实验过程第一步启动Keil,新建一个工程第二步新建一个liushui.C,并加入到工程中,输入如下内容:第三步编译并调试程序第四步将单片机学习板与计算机连接,并将编译完成后生成的*.hex文件下载到开发板第六步实验现象:将程序下载到学习板后,按下开发板的复位按钮,能够按照一开始设计的闪烁方式进行,没有出错。
流水灯(电路和汇编)-Proteus和Keil仿真演示实例知识讲解

流水灯(电路和汇编)-P r o t e u s和K e i l仿真演示实例示例要求:在80C51单片机的P2口连接8个发光二极管指示灯,编程实现流水灯的控制,轮流点亮指示灯。
在KEIL 51中编程序,形成HEX文件;在PROTEUS中设计硬件,下载HEX文件,运行看结果。
第1篇:PROTEUS电路设计1、打开PROTEUS的ISIS软件,如图1所示。
新建电路图文件,将文件保存到E:\projectio (新建文件夹projectio)下面,文件基本名为io,扩展名默认。
选择元图1 ISIS窗口图2、在component mode模式下单击选择元件按钮P,打开元件选择对话框,如图2所示。
图2 元件选择窗口在元件选择对话框的keywords窗口中输入元件关键字可换搜索元件,找到元件后,双击元件则可选中元件,添加元件到图3的device列表栏。
在这里依次添加元件单片机80C51、电阻RES、电容CAP、按键BUTTON、晶振CRYSTAL、发光二极管LED-RED,如图3所示。
图3 添加元件的device列表栏3、选择devices元件列表中的元件放到工作窗口,注意放置在工作窗口合适的位置,在元件放置时可对元件进行移动、旋转等操作;如图4所示。
电源(POWER)与地(GROUND):(右键-放置-终端里选)。
图4 放置元件图4、连接导线,如图5所示。
连接后存盘。
图5 连接元件图5、在Keil软件中设计软件程序,形成HEX文件(具体过程见第2篇Keil软件编程)。
保存软件项目到电路文件相同的文件夹E:\projectio下。
6、在PROTEUS电路图中,单击单片机80C51芯片,选中,再次单击打开单片机80C51的属性对话框,在属性对话框中的program file框中选择下载到80C51芯片中的程序。
这里是同一个文件夹下面的shili.hex文件。
如图6所示。
图6 下载程序到单片机7、单击仿真运行按钮play,运行程序。
单片机实训报告——花样流水灯的制作

单片机实训报告——花样流水灯的制作班级:电气一班学号:110101127姓名:李亚龙一、花样流水灯的设计方案流水灯实际上就是一个带有八个发光二级管的单片机最小应用系统,即为由发光二极管、晶振、复位、电源等电路和必要的软件组成的单个单片机。
如果要让P0.0口的LED2亮起来,那么只要把P0.0口的电平变为低电平就可以了;相反,如果要接在P0.0口的LED1熄灭,就要把P0.0口的电平变为高电平;同理,接在P0.0~P0.7口的其他7个LED的电亮和熄灭的方法同LED2。
因此,要实现流水灯功能我们只要将发光二极管LED2~LED9依次点亮、熄灭,8只LED灯便会一亮一暗的做流水灯了。
对8段LED数码管显示器的控制,包括“显示段”和“公共端”两个地方的控制。
其中显示段用来控制字符的形状,公共端用来控制若干个LED中的那一只被选中,前者称为“段选”,后者称为”位选”。
只有二者结合起来,才能在指定的LED上显示指定的字形。
显然,要显示某种字形就应该使此字形的相应字段点亮,按照dp、g、e、f、e、d、c、b、a的顺序,dp为最高位,a为最低位,引脚输入不同的8位二进制编码,可显示不同的数字或字符。
二、花样流水灯的硬件电路设计时钟电路是计算机的心脏,它控制着计算机的工作节奏,CPU 就是通过复杂的时序电路完成不同的指令功能的,89C52的时钟信号可以由两种方式产生:一种是内部方式,利用芯片内部的振荡电路,产生时钟信号;另一种为外部方式,时钟信号由外部引入。
单片机有多种复位电路,本系统采用电平式复位与上电复位方式,如下图所示当上电时C1相当于短路时,使单片机复位,在正常工作时,按下复位键是单片机复位。
显示部分主要是由八个LED和四个七段数码管组成,八个LED 由限流电阻限流后接入89C52的P0口。
三、花样流水灯的软件设计#include <reg52.h>#include <intrins.h>#define uchar unsigned char#define uint unsigned intsbit key3=P3^1;sbit key2=P3^2;sbit key1=P3^3;uchar code table[]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09}; uchar code moshi1[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};uchar code moshi2[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};uchar code moshi3[]={0x00,0x00,0xff,0x00,0x00,0xff,0x00,0x00};uchar code moshi4[]={0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00};uchar code moshi5[]={0x7f,0x3f,0x1f,0x0f,0x07,0x03,0x01,0x00};uchar code moshi6[]={0x7e,0x3c,0x18,0x00,0x81,0xc3,0xe7,0xff};uchar moshi,dingshi; //模式,定时uchar shijian,k1; //时间控制uchar num0,num;void delay(uint x) //延时程序{uchar i;while(x--);for(i=0;i<120;i++);}void keyscan() //键盘扫描{if(key1==0){delay(10);if(key1==0) //按键1,模式循环{moshi++;if(moshi==7)moshi=1;TR0=1;k1=1;while(!key1);}}if(key2==0) //按键2,时间调整{delay(10);if(key2==0){shijian++;if(shijian==15)shijian=15;while(!key2);}}if(key3==0) //按键3,时间复位{delay(10);if(key3==0){shijian--;if(shijian==1)shijian=1;while(!key3);}}}void display() //数码管显示{P1=table[moshi];P2=0xfe; //从左向右显示delay(2);P1=0XFF;P2=0XFF; //数码管不显示delay(2);P1=table[dingshi/10]; //十位显示P2=0xfd;delay(2);P1=table[dingshi%10]; //个位显示P2=0xfe;delay(2);}void liushuideng() //流水灯显示{switch(moshi) //模式选择{case 1:P0=moshi1[num];break;case 2:P0=moshi2[num];break;case 3:P0=moshi3[num];break;case 4:P0=moshi4[num];break;case 5:P0=moshi5[num];break;case 6:P0=moshi6[num];break;}}void disp() //显示器{num++;if(num==8){num=0;dingshi--;if(dingshi==0){dingshi=shijian;moshi++;if(moshi==7)moshi=1;}}}void init() //初始化{TMOD=0X01;TH0=(65536-50000)/256;TL0=(65536-50000)%256;EA=1;ET0=1;TR0=0;shijian=5;dingshi=5;moshi=0;P3=P0=0xff;num=num0=0;}void main(){init();while(1){keyscan(); //键盘扫描display(); //数码管显示if(k1==1) //模式选择liushuideng(); //流水灯显示}}void t0_time() interrupt 1 //中断{TH0=(65536-50000)/256;TL0=(65536-50000)%256;num0++;if(num0==6){num0=0;disp();}}四、总结实训中我发现主要问题是在焊接电路板的时候有虚焊,导致电路接触不良,还有多焊导致电路板损坏或短路。
流水灯课程设计报告

流水灯课程设计报告1、概述随着科学技术水平的不断向前提高以及社会经济的不断向前发展,人们越来越意识到广告宣传的重要性,越来越多的丰富多彩、新颖夺目的LED广告宣传牌充斥在城市的公共场所中,为灯红酒绿的城市增加了炫目多姿的色彩。
这些LED 广告宣传牌动态显示的背后,则是以流水灯的原理为基础,以单片机为控制核心,按照广告商的宣传需求,通过炫目的多彩和新颖的方式来吸引人们的眼球来完成广告宣传。
基于单片机的流水灯的设计,主要是以单片机为控制核心,通过自身的数据输入输出端口完成与流水灯显示电路的数据联通,通过内部的程序运行来实现对流水灯显示电路的动态控制,进而实现显示电流的循环亮灭的操作。
所以对于基于单片机的流水灯系统的深入研究与学习对于学习单片机控制系统以及LED广告宣传系统的工作机制进来说具有非常重要的现实意义。
2、基于单片机的流水灯的系统电路流水灯的显示电路就是多个二极管通过一端公共连接而构成的显示电路,并将另一端分别与单片机的多个数据输入输出端口进行连接,当单片机向这些端口发送相应的数据时,根据二极管的工作特性,从而实现对其的亮灭控制。
当然,单片机工作还需要复位电路和晶振电路配合单片机芯片构成单片机工作的最小系统,从而满足单片机正常工作的基本条件。
如图1所示,为基于单片机的流水灯控制系统硬件电路图,该硬件电路以AT89C51为基本的控制核心,实现对8为二极管流水灯显示电路的亮灭控制。
该控制系统是以AT89C51为系统的控制单片机,它是美国ATMEL公司生产的高性能的CMOS 8位处理器,同时配备了丰富的硬件资源,有128字节的RAM供用户使用,并提供2个16为定时器/计数器完成定时和计数的工作以及32根数据输入输出端口来单片机与外部电路的数据连通的工作。
8位二极管构成的流水灯显示电路是用共阳极的连接方法来构成的显示电路的。
常见的LED显示灯电路中的二极管连接方法有两种,一种是共阳极连接,一种是共阴极连接,它们是根据显示电路中二极管公共连接的方式来决定的。
通过51单片机控制24个发光二极管形成流水灯效果的亮灭状态

成绩实验名称:单片机系统简单扩展实验
一、实验目的
1、了解单片机系统的扩展方法
2、熟悉8255A在单片机系统扩中的使用方法。
3、熟悉仿真软件Proteus以及编程软件Keil的使用。
二、实验仪器
三、实验内容
四、实验原理
实验报告
五、实验步骤
步骤:
1、根据给定的实验要求,分析实验的目的以及实验要求。
2、通过计算机仿真软件Proteus,根据实验目的设计电路,并且绘制电路原理图。
3、根据自己设计的电路,编写控制程序。
4、调试所编写的控制程序,直至程序没有语法及语意错误,可以通过编译。
5、将所编写的无错误的程序下载至仿真软件,并进行调试,根据仿真结果修改程序。
6、重复上一步骤,知道仿真效果达到实验要求,即可完成。
六、实验程序
#include <reg51.h>
#include<absacc.h>。
实验三流水灯实验(io口和定时器实验)

实验三流水灯实验(I/O口和定时器实验)一、实验目的1.学会单片机I/O口的使用方法和定时器的使用方法;2.掌握延时子程序的编程方法、内部中断服务子程序的编程方法;3.学会使用I/O口控制LED灯的应用程序设计。
二、实验内容1.控制单片机P1口输出,使LED1~LED8右循环轮流点亮(即右流水),间隔时间为100毫秒。
2.控制单片机P1口输出,使LED1~LED8左循环轮流点亮(即左流水),间隔时间为100毫秒。
3.使用K1开关控制上面LED灯的两种循环状态交替进行;4. 用定时器使P1口输出周期为100ms的方波,使LED闪烁。
5.使用定时器定时,使LED灯的两种循环状态自动交替,每一种状态持续1.6秒钟(选作)。
三、实验方法和步骤1.硬件电路设计使用实验仪上的E1、E5和E7模块电路,把E1区的JP1(单片机的P1口)和E5区的8针接口L1~L8(LED的驱动芯片74HC245的输入端)连接起来,P1口就可以控制LED 灯了。
当P1口上输出低电平“0”时,LED灯亮,反之,LED灯灭。
E7区的K1开关可以接单片机P3.0口,用P3.0口读取K1开关的控制信号,根据K1开关的状态(置“1”还是置“0”),来决定LED进行左流水还是右流水。
综上,画出实验电路原理图。
2.程序设计实验1和实验2程序流程图如图3-1实验3程序流程图如图3-2所示。
图3-1 实验1,2程序流程图图3-2 实验3程序流程图实验4程序流程图如图3-3,3-4所示。
实验5程序流程图如图3-5,3-6所示。
图3-5 实验5主程序流程图图3-6 定时器中断服务子程序流程图图3-4 定时器中断服务子程序流程图图3-3 实验4主程序流程图编程要点:(1)Pl,P3口为准双向口,每一位都可独立地定义为输入或输出,在作输入线使用前,必须向锁存器相应位写入“1”,该位才能作为输入。
例如:MOV P1,A; P1口做输出MOV P1,#0FFHMOV A,P1;P1口做输入SETB P3.0MOV C,P3.1;从P3.1口读入数据(2)每个端口对应着一个寄存器,例:P1→90H(P1寄存器地址);P3→B0H(P3寄存器地址);寄存器的每一位对应着一个引脚,例:B0H.0→P3.0(3)对寄存器写入“0”、“1”,对应的外部引脚则输出“低电平”、“高电平”。
流水灯控制系统设计

目录第1章方案的论述以与与最终方案的确定......................... - 1 -1.1第一种方案的论述. (1)1.2第二种方案的论证 (1)1.3第三种方案的论述 (1)1.4最终方案的确定 (2)第2章硬件设计.................................................. - 3 -2.1总体方案设计分析. (3)2.2系统逻辑框图 (3)2.3主要元器件简介 (3)2.3.1 8086CPU ························································································- 3 -2.3.2 地址锁存器74LS373的内部电路与工作原理························- 6 -2.3.3 可编程外围接口芯片8255A的简介.........................................- 8 -第3章软件设计.................................................- 13 -3.1程序流程设计.. (13)3.1.1 主程序流程·················································································· - 13 -3.1.2 程序流程图·················································································· - 14 -3.1.3 系统硬件连接图········································································· - 15 -3.1.4 源程序设计(附录) ....................................................................... - 15 -3.2设计最终理想结果与原理.. (15)3.2.1 左向移动流水灯········································································· - 15 -3.2.2 右向移动流水灯········································································· - 15 -设计心得·························································- 17 -参考文献·························································- 18 -附录······························································- 19 -第1章方案的论述以与与最终方案的确定1.1 第一种方案的论述第一种方案,使用AT89C51单片机实现流水灯闪烁设计。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1.引言 当今时代是一个新技术层出不穷的时代,在电子领域尤其是自动化智能控制领域,传统的分立元件或数字逻辑电路构成的控制系统,正以前所未见的速度被单片机智能控制系统所取代。单片机具有体积小、功能强、成本低、应用面广等优点,可以说,智能控制与自动控制的核心就是单片机。目前,一个学习与应用单片机的高潮正在工厂、学校及企事业单位大规模地兴起。学习单片机的最有效方法就是理论与实践并重,本文笔者用AT89C51单片机自制了一款简易的流水灯,重点介绍了其软件编程方法,以期给单片机初学者以启发,更快地成为单片机领域的优秀人才。
2.硬件组成 按照单片机系统扩展与系统配置状况,单片机应用系统可分为最小系统、最小功耗系统及典型系统等。AT89C51单片机是美国ATMEL公司生产的低电压、高性能CMOS 8位单片机,具有丰富的内部资源:4kB闪存、128BRAM、32根I/O口线、2个16位定时/计数器、5个向量两级中断结构、2个全双工的串行口,具有4.25~5.50V的电压工作范围和0~24MHz工作频率,使用AT89C51单片机时无须外扩存储器。因此,本流水灯实际上就是一个带有八个发光二极管的单片机最小应用系统,即为由发光二极管、晶振、复位、电源等电路和必要的软件组成的单个单片机。其具体硬件组成如图1所示。
图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 ;跳转到主程序存放地址处 ORG 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点亮 ACALL DELAY ;调用延时子程序 SETB P1.1 ;P1.1输出高电平,使LED2熄灭 CLR P1.2 ;P1.2输出低电平,使LED3点亮 ACALL DELAY ;调用延时子程序 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点亮 ACALL DELAY ;调用延时子程序 SETB P1.4 ;P1.4输出高电平,使LED5熄灭 CLR P1.5 ;P1.5输出低电平,使LED6点亮 ACALL DELAY ;调用延时子程序 SETB P1.5 ;P1.5输出高电平,使LED6熄灭 CLR P1.6 ;P1.6输出低电平,使LED7点亮 ACALL DELAY ;调用延时子程序 SETB P1.6 ;P1.6输出高电平,使LED7熄灭 CLR P1.7 ;P1.7输出低电平,使LED8点亮 ACALL DELAY ;调用延时子程序 SETB P1.7 ;P1.7输出高电平,使LED8熄灭 ACALL DELAY ;调用延时子程序 AJMP START ;8个LED流了一遍后返回到标号START处再循环
DELAY: ;延时子程序 MOV R0,#255 ;延时一段时间 D1: MOV R1,#255 DJNZ R1,$ DJNZ R0,D1 RET ;子程序返回 END ;程序结束 3.2循环移位法 在上个程序中我们是逐个控制P1端口的每个位来实现的,因此程序显得有点复杂,下面我们利用循环移位指令,采用循环程序结构进行编程。我们在程序一开始就给P1口送一个数,这个数本身就让P1.0先低,其他位为高,然后延时一段时间,再让这个数据向高位移动,然后再输出至P1口,这样就实现“流水”效果啦。由于8051系列单片机的指令中只有对累加器ACC中数据左移或右移的指令,因此实际编程中我们应把需移动的数据先放到ACC中,让其移动,然后将ACC移动后的数据再转送到P1口,这样同样可以实现“流水”效果。具体编程如下所示,程序结构确实简单了很多。
ORG 0000H ;单片机上电后从0000H地址执行 AJMP START ;跳转到主程序存放地址处 ORG 0030H ;设置主程序开始地址 START:MOV SP,#60H ;设置堆栈起始地址为60H MOV A,#0FEH ;ACC中先装入LED1亮的数据(二进制的) MOV P1,A ;将ACC的数据送P1口 MOV R0,#7 ;将数据再移动7次就完成一个8位流水过程 LOOP: RL A ;将ACC中的数据左移一位
MOV P1,A ;把ACC移动过的数据送p1口显示 ACALL DELAY ;调用延时子程序 DJNZ R0,LOOP ;没有移动够7次继续移动 AJMP START ;移动完7次后跳到开始重来,以达到循环流动效果
DELAY: ;延时子程序
MOV R0,#255 ;延时一段时间 D1: MOV R1,#255 DJNZ R1,$ DJNZ R0,D1 RET ;子程序返回 END ;程序结束 3.3查表法 上面的两个程序都是比较简单的流水灯程序,“流水”花样只能实现单一的“从左到右”流方式。运用查表法所编写的流水灯程序,能够实现任意方式流水,而且流水花样无限,只要更改流水花样数据表的流水数据就可以随意添加或改变流水花样,真正实现随心所欲的流水灯效果。我们首先把要显示流水花样的数据建在一个以TAB为标号的数据表中,然后通过查表指令“MOVC A,@A+DPTR”把数据取到累加器A中,然后再送到P1口进行显示。具体源程序如下,TAB标号处的数据表可以根据实现效果的要求任意修改。
ORG 0000H ;单片机上电后从0000H地址执行 AJMP START ;跳转到主程序存放地址处 ORG 0030H ;设置主程序开始地址 START:MOV SP,#60H ;设置堆栈起始地址为60H MOV DPTR,# TAB ;流水花样表首地址送DPTR
LOOP: CLR A ;累加器清零
MOVC A,@A+DPTR ;取数据表中的值 CJNE A,#0FFH,SHOW;检查流水结束标志 AJMP START ;所有花样流完,则从头开始重复流
SHOW: MOV P1,A ;将数据送到P1口
ACALL DELAY ;调用延时子程序 INC DPTR ;将数据表指针指向下一数据
AJMP LOOP ;继续查表取数据 DELAY: ;延时子程序
MOV R0,#255 ;延时一段时间 D1: MOV R1,#255 DJNZ R1,$ DJNZ R0,D1
RET ;子程序返回
TAB: ;下面是流水花样数据表,用户可据要求任意编写
DB B ;二进制表示的流水花样数据,从低到高左移
DB B DB B DB B DB B DB B DB B DB B DB B ;二进制表示的流水花样数据,从高到低右移
DB B DB B DB B DB B DB B DB B DB B DB 0FEH,0FDH,0FBH,0F7H ;十六进制表示的流水花样数据 DB 0EFH,0DFH,0BFH,7FH DB 7FH,0BFH,0DFH,0EFH DB 0F7H,0FBH,0FDH,0FEH …… DB 0FFH ;流水花样结束标志0FFH
END ;程序结束
4.结语 当上述程序之一编写好以后,我们需要使用编译软件对其编译,得到单片机所能识别的二进制代码,然后再用编程器将二进制代码烧写到AT89C51单片机中,最后连接好电路通电,我们就看到LED1~LED8的“流水”效果了。本文所给程序实现的功能比较简单,旨在抛砖引玉,用户可以自己在此基础上扩展更复杂的流水灯控制,比如键盘控制流水花样、控制流水灯显示数字或图案等等。