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

合集下载

单片机实训报告——花样流水灯的制作

单片机实训报告——花样流水灯的制作

单片机实训报告——花样流水灯的制作班级:电气一班学号: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();}}四、总结实训中我发现主要问题是在焊接电路板的时候有虚焊,导致电路接触不良,还有多焊导致电路板损坏或短路。

基于51单片机流水灯毕业设计

基于51单片机流水灯毕业设计

基于51单片机的流水灯毕业设计方案:一、引言流水灯是一种常见的电子设计项目,适合初学者练习和毕业设计。

通过使用51单片机和少量外围元件,可以实现一个简单而有趣的流水灯效果。

本文将介绍基于51单片机的流水灯设计方案,包括硬件连接、软件程序设计和效果展示等内容。

二、硬件设计1. 材料准备:51单片机(如STC89C52)、LED灯若干(建议4-8个)、电阻、面包板、连线等。

2. 连接方式:将LED灯按顺序连接到51单片机的IO口,每个LED 灯通过一个电阻连接到IO口,确保电流限制。

3. 电源供应:连接电源至电路板,保证正常工作电压和电流。

三、软件设计1. 编程环境:使用Keil C51等集成开发环境进行程序编写。

2. 程序设计:设计一个循环移位的程序,控制51单片机的IO口依次点亮LED灯,形成流水灯效果。

3. 定时控制:通过定时器中断或延时函数控制LED灯的亮灭时间,实现流水灯的效果。

四、效果展示1. 烧录程序:将编写好的程序烧录到51单片机中。

2. 调试测试:连接电路并通电,观察LED灯按顺序点亮并流动的效果。

3. 优化改进:根据实际效果调整程序和硬件设计,优化流水灯的效果和稳定性。

五、注意事项1. 电路连接:确保电路连接正确,避免短路或接反现象。

2. 程序设计:合理设计程序逻辑,确保LED灯的流水效果符合预期。

3. 调试测试:在调试过程中注意观察LED灯的亮暗情况,及时发现问题并进行调整。

六、总结基于51单片机的流水灯设计是一个适合初学者和毕业设计的简单而有趣的项目,通过设计和实现可以提升对单片机编程和电路连接的理解和技能。

希望通过本文的介绍,读者能够顺利完成基于51单片机的流水灯毕业设计,并在实践中不断提升自己的电子设计能力。

《单片机原理及应用》基于51单片机实验箱的流水灯设计

《单片机原理及应用》基于51单片机实验箱的流水灯设计

《单片机原理及应用》基于51单片机实验箱的流水灯设计一、实验目的和要求1.掌握单片机基本资源使用。

2.掌握单片机电路原理图。

3.掌握单片机C语言软件开发以及试验箱使用。

二、实验内容和原理实验内容:1.绘制程序流程图并编写C语言程序2.在实验箱中进行测试,最后提交实验报告三、主要仪器设备Keil4软件、C51单片机实验箱。

四、操作方法与实验步骤4.1 题目要求使用单片机实验箱实现流水灯功能。

4.2 系统设计思路主程序中实现流水灯功能,时间单位采用500ms信号,作为实现流水灯的发光二极管和单片机的P1相连。

4.2 C程序编制(包含详细的文字和程序流程图)#include<intrins.h>#include<reg52.h>#define uchar unsiged char#define uint unsigned intvoid mDelay(uint Delay){int i;for(;Delay>0;Delay--)for(i=0;i<110;i++);}void main(){unsigned char a,i;While(1){a=0x01;for(i=0;i<8;i++){a=-crol-(a,1)P2=amDelay(500);}}4.3 测试分析(包含文字和图像叙述)在KeilC51软件软件中编写好程序并调试好后,连接单片机实验箱,实验结果如下:实验箱上连接的八个灯,每个灯间隔500ms的时间一个接一个的循环闪烁。

五、讨论和心得(不少于100字)通过此次实验,我不仅加深了对单片机理论的理解,将理论很好地应用到实际当中去,而且我还学会了如何去培养我们的创新精神,试验过程还是比较繁琐,但是还是完成了这次试验,使我对于理解单片机的基本原理更加深刻,将所学知识运用到实践中,在实践中发现问题,强化理论知识。

课程名称:单片机原理及应用实验项目名称(二):定时计数器的应用—按钮控制LED灯四、实验目的和要求1.掌握单片机基本资源使用。

单片机控制左右循环的流水灯设计

单片机控制左右循环的流水灯设计

单片机控制左右循环的流水灯设计单片机是一种微型计算机芯片,可以用于控制和管理各种电子设备。

流水灯是一种经典的电子元件,通过依次点亮或熄灭一组LED灯来形成流动效果。

本文将设计一个使用单片机控制的左右循环流水灯。

设计思路:1.硬件设计:a.先准备一个单片机开发板、一组LED灯和与LED灯串联的电阻。

b.将LED灯按照循序连接,连接方式可以为并联或串联。

c.通过引脚和外部电路将LED灯与单片机的IO口相连。

每个LED灯与一个IO口相连,并且通过电阻限流。

2.软件设计:a.在单片机上编写控制流水灯的程序。

这可以使用C语言或汇编语言进行编写。

b.程序主要通过循环结构来实现流水灯的效果。

编写一个循环函数,用于控制LED灯的点亮和熄灭。

c.在循环函数中,通过控制IO口输出高电平或低电平来控制LED灯的亮灭。

每次循环,根据需要逐个点亮或熄灭LED灯。

d.为了实现左右循环的效果,可以通过改变点亮或熄灭的顺序来改变流水灯的方向。

可以使用一个变量来控制点亮和熄灭的顺序,每次循环后改变该变量的值。

示例代码:以下是一个使用C语言编写的简单示例代码,来控制左右循环流水灯。

```c#include <reg52.h>//定义LED灯使用的IO口sbit LED1 = P1^0;sbit LED2 = P1^1;sbit LED3 = P1^2;sbit LED4 = P1^3;//控制流水灯循环void lightFlowint i;int direction = 1; // 控制流水灯的方向,1表示向右,-1表示向左//流水灯循环while(1)//控制LED灯的点亮和熄灭LED1=0;LED2=1;LED3=1;LED1=1;LED2=0;LED3=1;LED4=1;LED1=1;LED2=1;LED3=0;LED4=1;LED1=1;LED2=1;LED3=1;LED4=0;//根据方向改变控制顺序if(direction == 1)//向右direction = -1;}elsedirection = 1;}}void mainlightFlow(;```这个示例代码中,使用P1口上的4个IO口来控制4个LED灯的点亮和熄灭。

单片机控制LED流水灯从中间向两边

单片机控制LED流水灯从中间向两边

单片机控制LED流水灯从中间向两边,从两边向中间这个就是把先奇数亮再偶数亮,循环三次;一个灯上下循环三次;两个分别从两边往中间流动三次;再从中间往两边流动三次;不过这个程序实现的应该是这样的先奇数亮再偶数亮,循环三次;一个灯上下循环三次;两个分别从两边往中间流动;再从中间往两边流动;#include< reg52.h>#include< intrins.h>#define uint unsigned int#define uchar unsigned charvoid delay();void main(){ uchar temp,temp1,temp2,a,b;P3=0xff;while(1){ for(b=3;b>0;b--){ temp=0xaa;P1=temp;delay();temp=0x55;P1=temp;delay();}for(a=3;a>0;a--){ temp=0xfe;for(b=7;b>0;b--){ P1=temp;temp=_crol_(temp,1);delay();P1=temp;delay();}}temp1=0xfe;temp2=0x7f;for(a=8;a>0;a--){temp=temp1&temp2;P1=temp;delay();temp1=_crol_(temp1,1);temp2=_cror_(temp2,1);}}void delay(){ uint a,b;for(a=100;a>0;a--)for(b=600;b>0;b--);}程序实现的第2种方法:下面是 51hei单片机12群里的朋友木信大侠提出的,实现单片机led流水灯从中间向两边,从两边向中间的效果,下面的程序就是实现思路,这个是直接调用,应该明白吧,数组那其实也可以改一下,如采用一维数组,在多次调用;也可以采用二维数组。

单片机流水灯实验

单片机流水灯实验

实验一单片机流水灯实验一、实验目的1、熟练掌握实验箱的使用方法和注意事项。

2、了解简单单片机应用系统的设计方法。

3、掌握应用KEIL软件编辑、编译源汇编程序的操作方法。

4、掌握应用仿真器的操作方法。

二、实验内容在实验箱上实现8个发光LED“流水”的现象,并通过编写程序控制流水现象。

三、实验器材PC机一台, 仿真器一台, 实验箱一台, 导线若干。

四、实验说明当AT89C51的P1口有低电平输出时,相应的发光二极管就会点亮。

应用这一原理我们可以容易的点亮一个数码管,例如令P1口输出0111 1111时D1就会点亮。

若再把0111 1111向右循环一位,利用P1口输出,就会点亮D2。

在发光二极管两次点亮的间隔中加延时程序,让每次点亮停留一段时间,像这样人眼就可以看到“流水”的现象。

五、实验原理图单片机的P1口为准双向口,每一位均可独立定义为输入或输出,若要将P1口的某一位所对应的灯熄灭,则需要向该端口写“0”。

电路图如下:图3-1 接线图六、实验步骤1.按照实验一中的建立工程的步骤,建立本实验内容相应的工程;2.单片机的P1口接8个发光二极管L0~L7;3.运用调试工具,调试软件,观察现象;4.调试计算延时子程序DELAY定时时间。

七、参考程序。

#include<reg51.h>#include<intrins.h>int temp;void delay(){int i,j;for(i=0;i<200;i++)for(j=0;j<110;j++);}void main(){temp=0x01;P1=temp;delay();while(1){temp=_crol_(temp,1);P1=temp;delay();}}八、实验现象当程序监测无误后,通过translate,build生成hex文件,并将文件烧入单片机中,点击全速运行,会发现P1口连接的LED灯轮流闪烁。

流水灯控制系统设计(单片机)

流水灯控制系统设计(单片机)

实验报告单实验名称:流水灯控制系统设计实验项目:实验目的:1. 理解单片机系统软硬件开发的过程,单片机基本的I/O控制方法。

2. 掌握51单片机的汇编指令。

3. 掌握Proteus硬件仿真软件的使用及技巧。

4. 掌握Keil uVision程序开发软件的使用技巧。

实验器材:安装了Keil uVision5和Proteus的电脑;实验原理:通过更改P2口8位的高低电平,分别控制8个Led灯的亮灭。

单片机流水灯的实质是单片机各引脚在规定的时间逐个上电,使LED灯能逐个亮起来但过了该引脚通电的时间后便灭灯的过程,实验中使用了单片机的P2端口,对8个LED灯进行控制,要实现逐个亮灯即将P2的各端口逐一置零,中间使用时间间隔隔开各灯的亮灭。

使用rl或rr a实现位的转换。

然后将A寄存器转换一次便送给P2即MOV P2,A便将转换后的数送到了P2口,不断循环下去,便实现了逐位置操作。

具体的亮灭情况如下表:要实现“流水灯”效果,也就是需要将P2口的输出值发生以下变化:FE→FD→FB→F7→EF→DF→BF→7F→BF→DF→EF→F7→FB→FD→FE ..... 可以使用一个循环,不断对数据进行移位运算实现。

这里的移位指令采用RL和RR,即不带进位的位移运算指令。

如果使用带进位的位移运算指令(RLC 和RRC),则需要定期把cy置0,否则会出现同时亮起两个发光二极管的情况。

实验步骤:1.在仿真系统Proteus中实现电路原理图设计;新建设计文档、设置工作环境、选择并放置元器件、对原理图进行布线、原理图的电器规则检查、调整、保存和输出报表等。

2.源代码的设计与生成目标代码;在Keil uVision5平台进行C语言和汇编语言源代码的输入、编译与调试,并生成可执行文件.hex。

C语言存储为.c文件,汇编语言存储为.asm文件。

3.调试与仿真在Proteus中将可执行文件.hex加载到单片机中,对系统进行虚拟仿真。

单片机课程设计报告流水灯(WORD档)

单片机课程设计报告流水灯(WORD档)

XX工程学院单片机课程设计报告题目:流水灯学生姓名:学号:系部名称:职业技术学院班级:机电一体化Z11-1 指导教师:目录摘要 (3)一、课程设计题目 (4)二、设计任务及要求 (4)三、实验方案 (4)四、流程图 (4)五、硬件电路 (6)六、软件设计 (6)1 主体程序 (6)2 键扫描子程序 (6)3 闪烁控制程序 (6)4 延时子程序 (6)5 源程序设计 (7)七、功能调试 (12)八、设计总结 (12)九、参考文献 (13)【摘要】单片机课程设计主要是为了让我们增进对单片机芯片电路的感性认识,加深对理论方面的理解。

了解软硬件的有关知识,并掌握软件设计过程、方法及实现,为以后设计和实现应用系统打下良好基础。

另外,通过简单课题的设计练习,使我们了解必须提交的各项工程文件,达到巩固、充实和综合运用所学知识解决实际问题的目的。

一、课程设计题目:流水灯二、设计任务及要求:任务:完成对接在P1,P3口的发光二极管闪亮控制程序的设计1.用程序延时方法让P1的一个LED小灯每隔1S交替闪亮2.用程序延时方法让P1的8个LED小灯循环(每个亮50MS)闪亮3.用程序延时方法让P1的8个LED小灯追逐闪亮(50MS间隔变化)4.用程序延时方法让P1、P3的16个LED小灯循环(每个亮50MS)闪亮要求:1. 根据硬件电路原理,画出接线2. 设计出相应的软件程序三、实验方案:方案:单片机采用40脚的89C52标准双列直插系列,有4个标准输入/输出端口共32位控制端口。

本次设计采用并行口低电平(吸电流)直接驱动LED发光管发光形式,选择了P1和P3口的16个端口进行模拟LED小灯控制,如要多些小灯单元可再将P2口、P0口及其他空余端口用LED小灯驱动控制。

因系统功能要求能控制灯亮的方式,在P0.0—P0.3端口接了4个按键小开关,每个小开关可控制一种亮灯方式。

在端口较紧张的情况下,LED小灯驱动也可用串入/并出移位寄存器(如74HC595),单片机用并行移位方式进行驱动。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

1.引言
当今时代是一个新技术层出不穷的时代,在电子领域尤其是自动化智能控制领域,传统的分立元件或数字逻辑电路构成的控制系统,正以前所未见的速度被单片机智能控制系统所取代。

单片机具有体积小、功能强、成本低、应用面广等优点,可以说,智能控制与自动控制的核心就是单片机。

目前,一个学习与应用单片机的高潮正在工厂、学校及企事业单位大规模地兴起。

学习单片机的最有效方法就是理论与实践并重,本文笔者用AT89C51单片机自制了一款简易的流水灯,重点介绍了其软件编程方法,以期给单片机初学者以启发,更快地成为单片机领域的优秀人才。

2.硬件组成
按照单片机系统扩展与系统配置状况,单片机应用系统可分为最小系统、最小功耗系统及典型系统等。

AT89C51单片机是美国ATM EL公司生产的低电压、高性能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 &nbsp; ;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 &nbsp; ;子程序返回
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的“流水”效果了。

本文所给程序实现的功能比较简单,旨在抛砖引玉,用户可以自己在此基础上扩展更复杂的流水灯控制,比如键盘控制流水花样、控制流水灯显示数字或图案等等。

相关文档
最新文档