流水灯电路图和程序

合集下载

流水灯实验·

流水灯实验·

实验一发光二极管流水灯实验一、实验要求利用单片机及8个发光二极管等器件,制作一个单片机控制的流水灯系统。

单片机的P0.0~P0.7接有8个发光二极管,运行程序,则8个发光二极管进行流水灯操作,流水灯从上到下依次点亮,反复循环。

二、实验目的1.掌握单片机最小系统的构成。

2.掌握P0口作为基本I/O口使用时,外部电路的连接方法。

3.如何控制I/O口来驱动LED发光二极管。

4.学会用PROTEUS 设计电路原理图,并进行仿真的方法。

5.学会使用Keil C编程。

三、实验步骤(一)电路原理图设计1.启动PROTEUS ISIS仿真工具。

参照实验指导书P24页2.5节的方法,设计电路原理图。

2.在元器件模式下,单击选取元器件,在Keywords一栏中输入元器件名称,如AT89C51,双击所匹配的元器件,便可将其加入到对象选择器中。

本实验需要选取的元器件有单片机AT89C51、发光二极管LED-BIRG、瓷片电容CAP、电解电容CAP-ELEC、电阻RES、上拉排阻RESPACK-8、晶振CRYSTAL、按钮BUTTON、双极性晶体管ST5771-1。

3.按图一电路原理图,在编辑区放置相应元器件,单击选择终端模式,放置电源和地,并连线。

4.设置元器件参数值,本实验中晶振X1频率为12MHz,瓷片电容C1、C2的值为30pF,电解电容C3的值为10uF,电阻R1为470,R2、R3的值为10K,电阻R4~R11的值为470,单片机AT89c51的时钟频率12MHz。

5. 设计完成电路后,单击电气检测按钮,会出现检查结果窗口,若有错,会给出详细的说明。

如没有错,将设计保存到自己的工作目录中。

(二)编写源程序,并生成.HEX文件。

1.启动KEIL Uvision4。

2. 按照实验指导书P50页4.1节的方法输入源程序并生成.HEX文件。

(注意:程序设计时考虑到实验学习板上的电路的设计,要使P2.7 = 0; 关闭液晶使能位,防止液晶数据口输出干扰P0口; 使P3.7 = 0, 选通WS 系列实验板的LED 流水灯的电源控制端)(三)仿真回到PROTEUS ISIS环境,并按照实验指导书P60页4.2节的方法加载.HEX文件进行仿真。

流水灯(电路和汇编)-Proteus和Keil仿真演示实例知识讲解

流水灯(电路和汇编)-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,运行程序。

使用74LS164制作流水灯

使用74LS164制作流水灯

使用74LS164制作流水灯单片机初学者对于流水灯实验一定特别的熟悉,这个实验逻辑清晰,效果明显,在各类单片机以及微机控制相关材料中都会进行讲解。

当我们学习了一段时间单片机之后,或者在进行单片机系统设计时,会发现51单片机的引脚有时并不是很够用,有时候需要尽量节省单片机I/O引脚。

如何节省I/O引脚是我们在设计单片机系统时,经常需要考虑的一个问题。

下面以8个LED组成的流水灯效果的实现为例,讲解如何节省单片机的I/O引脚。

通常我们会采用如图1所示的电路图,通过单片机直接驱动8个LED,但是这种控制方式消耗了8个单片机引脚。

图1 常规流水灯电路我们也可以使用三八译码器来完成流水灯的效果。

其控制电路图如图2所示(这种控制方式在我之前上传的文档中有详细介绍,感兴趣读者可以查看)。

这种控制方式虽然可以在一定程度上可以节省单片机I/O接口的使用,如下图所示,最少只需要使用3个I/O口。

但是这种方式也存在一定的缺点,这种控制方式只能同时点亮1个LED 灯,如果想实现两个以及以上的LED灯点亮的效果,那么这种电路将无法直接实现效果。

图2 三八译码器拓展I/O口下面我们看一下能够使用其他的芯片,来进一步降低单片机I/O 口的消耗。

使用串行转并行芯片74LS164来制作流水灯效果,其控制原理图如图3所示。

从原理图中可以看出,使用了74LS164芯片控制流水灯之后,只占用了单片机的两个I/O口。

一个用于输出时钟脉冲,另外一个用于输出串行数据。

图3 74LS164控制流水灯原理图与前面采用译码器控制的流水灯相比,使用74LS164控制的流水灯效果具有如下两个显著优点:1.占用单片机I/O口少,最少仅为2个。

2.控制功能强大,74LS164驱动的流水灯点亮的个数没有限制,可以任意数量点亮。

编程思路:单片机以最快的速度通过串口控制8个LED灯的点亮状态,由于此过程极短,人眼无法分辨,通过延时函数稳定输出效果,并延时一定时间,再次以最快的速度通过串口控制8个LED灯的亮灭状态,并执行延时函数实现等待效果,如此反复,就可以实现流水灯的效果,且可以实现任意的流水灯的效果。

PLC流水灯实验报告

PLC流水灯实验报告

基于WinPAC的流水灯实验实验目的1、掌握PLC编程的基本流程,学会在ISaGRAF环境下编程和仿真。

2、学会在ISAGRAF创建工程、下载程序、调试方法。

3、掌握Ladder Diagram(LD)语言的语法和各种符号的含义,以及掌握ISAGRAF提供的相关功能函数的用途。

3、在以上基础上编写一个简单的流水灯程序。

实验器材泓格WinPAC控制器、i_87096继电器输出模块实验原理ISaGRAF下可编程控制器PLC(Programmable Logic Controller)开发语言有SFC语言、FC语言、FBD语言、梯形图(Ladder Diagram以下简称LD)、ST语言、IL语言等,但是LD语言凭借其直观、易上手、与真实控制电路相似的独特优点成为大多数PLC开发者首选语言。

LD是电路逻辑的一种图表表示法,它把contacts(输入)与coils线圈(输出)组合在一起,是真实控制电路的图形语言表达。

本实验是采用泓格WinPAC控制器和i_87069数字输出模块采用LD语言和ST语言结合来控制LED0~LED78个LED灯顺序点亮实现简单的流水灯效果。

图1实验模块电路图程序图2LD语言程序图3ST语言程序程序控制逻辑对照图2、图3程序开始产生周期为1s的闪烁信号,并将闪烁信号赋值给SW1布尔变量。

SW1每一个上升沿COUNTER从0自加1,当COUNTER值达到8的时候复位COUNTER。

ST程序里面通过CASE条件判断COUNTER的值来控制8通道LED的状态。

(COUNTER的值与LED 状态对应参见下表1)COUNTER8通道LED状态0仅LED0亮1仅LED1亮2仅LED2亮3仅LED3亮4仅LED4亮5仅LED5亮6仅LED6亮7仅LED7亮LD 程序功能模块说明功能:产生指定周期的闪烁boolean 信号。

输入参数:RUN 为TRUE 输出闪烁信号到C ,为FALSE 终止输出闪烁信号到C 。

4017十路流水灯电路分析

4017十路流水灯电路分析

4017十路流水灯电路分析一、电路功能概述4017十路流水灯电路主要由555构成的多谐振荡器产生脉冲提供给由4017组成的十进制移位计数器,进而控制十路LED灯,通电后,LED灯从上往下逐个点亮,直到第十个LED灯,循环往复,且移动的速度可以调节。

该电路的设计依据来源于闹市中的店铺LED广告牌,具有一定的实用价值。

二、电路原理图三、原理图工作原理4017十路流水灯电路主要由多谐振荡器和移位计数器构成,由R1,RP1,C1,C2,555定时器集成电路等组成多谐振荡器产生脉冲信号,脉冲信号的频率有可变电阻RP1(电位器)控制,产生的脉冲送到4017的CP0端(14脚),以便产生上升沿,提供计数脉冲。

以4017为核心元件构成的计数分配电路,每接收一个上升沿,Q0-Q9移位一次。

1、十进制计数器/脉冲分配器CD4017十进制计数器/脉冲分配器CD4017是5位Johnson计数器,具有10 个译码输出端,CP0、CP1、RST输入端。

时钟输入端的斯密特触发器具有脉冲整形功能,对输入时钟脉冲上升和下降时间无限制。

RST 为低电平时,计数器在时钟上升沿计数;反之,计数功能无效。

RST 为高电平时,计数器清零。

Johnson 计数器,提供了快速操作、2 输入译码选通和无毛刺译码输出。

防锁选通,保证了正确的计数顺序。

译码输出一般为低电平,只有在对应时钟周期内保持高电平。

在每10 个时钟输入周期CO 信号完成一次进位,并用作多级计数链的下级脉动时钟。

真值表(功能表)2、集成时基555电路集成时基电路又称为集成定时器或555电路,是一种数字、模拟混合型的中规模集成电路,应用十分广泛。

它是一种产生时间延迟和多种脉冲信号的电路,由于内部电压标准使用了三个5K电阻,故取名555电路。

555定时器成本低,性能可靠,只需要外接几个电阻、电容,就可以实现多谐振荡器、单稳态触发器及施密特触发器等脉冲产生与变换电路。

它也常作为定时器广泛应用于仪器仪表、家用电器、电子测量及自动控制等方面。

流水灯电路图和程序

流水灯电路图和程序

流水灯电路图和程序#include <reg52.h>#include<instrins.h>#define uchar unsigned char#define uint unsigned intuchar code led[]={0xfe,0xfb,0xfd ,0xf7,0xef,0xbf,0xdf,0x7f};delay(uint z){uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}main( ){uint i;while(1){P2=led[];delay(500);_crol_(led,1);}}用arm7做一个流水灯的设计。

悬赏分:100 - 解决时间:2009-9-3 20:03试设计一个闪烁流水灯控制器,该控制器可以控制8个灯顺序亮灭,当按钮K按下1次后,每次顺序点亮一个灯。

而且每个点亮的灯在闪烁3次后,才能灭,周而复始,直到按钮K 二次按下。

(用状态机设计)要用PROTEL99画好电路图。

还要写好程序。

画图的也只能发到我的邮箱里面吧。

邮箱:。

谢谢各位。

提问者:woxinruozai - 五级最佳答案从原理图可以看出,如果我们想让接在P1.0口的LED1亮起来,那么我们只要把P1.0口的电平变为低电平就可以了;相反,如果要接在P1.0口的LED1熄灭,就要把P1.0口的电平变为高电平就可以;同理,接在P1.1~P1.7口的其他7个LED的点亮和熄灭方法方法同LED1。

因此,要实现流水灯功能,我们只要将LED2~LED8依次点亮、熄灭,依始类推,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高、返回到开始、程序结束。

彩灯流水电路(流水灯)的设计

彩灯流水电路(流水灯)的设计

彩灯流水电路(流水灯)的设计对于彩灯流水电路的设计,我们一般采用LED流水灯的形式。

LED流水灯的原理是通过输入一个时钟信号,来控制LED灯的亮灭顺序,从而实现LED灯的流水效果。

下面就以一个8位LED流水灯电路为例,来分步骤介绍如何进行彩灯流水电路的设计。

1. 材料与元器件的准备该8位LED流水灯电路所需要的材料与元器件如下:(1)芯片:AT89C51(2)时钟:11.0592MHz(3)LED数码管:8款(4)电阻:九个330欧姆电阻(5)电容:两个22pF陶瓷电容(6)稳压管:7805(7)热熔胶枪(8)面包板2. 电路原理图设计接下来,我们需要根据电路的设计要求,来进行电路原理图的设计。

如下图所示,该电路原理图包含了AT89C51芯片、时钟、稳压管、电容以及LED数码管等元器件。

其中,AT89C51芯片作为电路的主控制芯片,时钟则用来控制电路的工作频率。

LED数码管则是用来实现LED灯的罗列效果。

3. 电路焊接装配电路原理图完成后,进入电路焊接与装配环节。

首先,我们需要将元器件逐一地焊接在面包板上。

这里,我们需要注意焊接的顺序和脚位。

接着,将电路连线固定在面包板上,然后接上电源线,即可启动LED数码管。

4. 代码编写最后,我们需要编写AT89C51芯片的代码。

该代码用来控制LED数码管的流水效果。

该代码的编写需要考虑以下几个方面:(1)如何将LED数码管控制程序放入芯片中?(3)如何实现不同的流水显示模式?(4)如何使用时钟来控制LED数码管的刷新速度?经过以上步骤的设计后,我们便可成功地制作出一款功能完善的彩灯流水电路产品。

如需实现更高级别的彩灯效果,还需不断探究和创新。

第2讲(二)流水灯程序设计

第2讲(二)流水灯程序设计

的第 0 为赋值 0,其他位赋值 1,即 1111 1110,也就是 0xfe 了。它实现了点亮第一个 LED
灯。
上面的方法虽然容易想到,但是程序也太长了吧,有没有好一点的方法呢?有的,下面我们 用 C51 即单片机 C 语言提供的一个函数来实现流水灯。
步骤四:其他方法实现流水灯。
我们先直接改写程序,然后再进行解释。 #include<reg52.h> #include<intrins.h> //循环移位函数定义在该头文件中,要想使用该函数必须先包含此头文件
第 3 页,共 7 页
为单片机知识普及而努力!
邢台学院嵌入式系统实验室
到这里你是不是觉得上面那么多位定义很麻烦,其实还有一种对 P0 口整体赋值的方法,被
称为总线方法。例如上面的程序可以改写为: #include<reg52.h> void main() {
P0 = 0xaa; //利用总线方法给端口赋值 } 其中,语句“P0 = 0xaa;”中的 0xaa 是十六进制数,C 语言中十六进制数都以 0x 开头。十 六进制中用 0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f 来表示十进制中的 0 到 15, 其中 a 表示 10,即二进制的 1010,那么 0xaa 就表示 1010 1010,这八位数从右到左分别对 应 P0 口的 0 到 7 位,如下图:
//进行空循环,来消耗 CPU 周期,达到延时的效果
led1 = 1; for(i=1000;i>0;i--)
for(j=100;j>0;j--); }
可以看出,是我们加入了循环函数来让 CPU 进行其他操作的,这样便实现了一个 LED 灯的
闪烁效果。但是同样的双重 for 循环语句我们却写了两遍,显得很臃肿,我们可以将 for 循

开关控制流水灯实验报告 源程序

开关控制流水灯实验报告   源程序

附件:一、软件设计:源程序/* 开关控制流水灯.c LED 高低电平交替闪烁*///==声明区=======================================#include <reg51.h> //定义8051 寄存器的头文件#define SW P0 //定义开关端口P0口#define LED1 P1#define LED2 P2#define LED3 P3void delay(int); //声明延迟函数unsigned char i; //定义一个无符号整型变量i //==主函数=======================================void main() //主函数开始{ i=0; //初始化变量i 值SW=0xff; //初始化开关处于高电平while(1){ switch(SW){ case 0xff: LED1=SW;LED2=SW;LED3=SW; break;delay(200);case 0xfe: LED1=SW;LED2=SW+1;LED3=SW-1; break;delay(200);case 0xfd: LED1=SW;LED2=SW+1;LED3=SW-1; break;delay(200);case 0xfb: LED1=SW;LED2=SW+1;LED3=SW-1; break;delay(200);case 0xf7: LED1=SW;LED2=SW+1;LED3=SW-1; break;delay(200);case 0xef: LED1=SW;LED2=SW+1;LED3=SW-1; break;delay(200);case 0xdf: LED1=SW;LED2=SW+1;LED3=SW-1; break;delay(200);case 0xbf: LED1=SW;LED2=SW+1;LED3=SW-1; break;delay(200);case 0x7f: LED1=SW;LED2=SW+1;LED3=SW-1; break;delay(200);}}} //主函数结束//==延迟函数=====================================void delay(int x) //延迟函数的开始,x=延迟次数{int i; //声明整型变量ifor(i=0;i<x;i++); //计数次数} //延迟函数结束二、硬件设计:1、按开关顺序一个接一个闭合时实验现象:2、第一个开关始终闭合,其他的开关一次闭合时实验现象:。

心形花样LED流水灯(带程序)

心形花样LED流水灯(带程序)

心形花样LED 流水灯(带程序)1000146073713使用89C52做的,原理图如下:总共有32个LED灯,4个I/O全部用上了。

我在这里不加有LED保护电阻,用200的也可以晶振用12M的或11.0592M也行,C1,C2用30PF。

PCB图如下:作品效果录像:/programs/view/z0bjKg_3Cd4/程序是用C语言写的;如下:#include<reg52.h>#include <intrins.h>#define uint unsigned int#define uchar unsigned charuchar code table[]={0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00}; // 逐个点亮0~7 uchar code table1[]={0x7f,0x3f,0x1f,0x0f,0x07,0x03,0x01,0x00}; // 逐个点亮7~0 uchar code table2[]={0x01,0x03,0x07,0x0f,0x1f,0x3f,0x7f,0xff}; // 逐个灭0~7 uchar code table3[]={0x80,0xc0,0xe0,0xf0,0xf8,0xfc,0xfe,0xff}; // 逐个灭7~0/***********************************************************/void delay(uint t); //延时void zg(uint t,uchar a);//两边逐个亮void qs(uint t,uchar a);//全部闪烁void zgxh(uint t,uchar a); // 逆时针逐个点亮//void zgxh1(uint t,uchar a); // 顺时针逐个点亮void djs(uint t,uchar a); //对角闪void lbzgm(uint t,uchar a);//两边逐个灭//void sszgm(uint t,uchar a); // 顺时针逐个灭void nszgm(uint t,uchar a); // 逆时针逐个灭void sztl(uint t,uchar a);//顺时逐个同步亮void nztl(uint t,uchar a);//逆时逐个同步亮void sztm(uint t,uchar a);//顺时逐个同步灭void nztm(uint t,uchar a);//逆时逐个同步灭void hwzjl(uint t,uchar a); //横往中间亮void hwzjm(uint t,uchar a); //横往中间灭//void swzjl(uint t,uchar a); //竖往中间亮//void swzjm(uint t,uchar a); //竖往中间灭void nzdl(uint t,uchar a); //逆时逐段亮void nzdgl(uint t,uchar a); //逆时逐段一个点亮void jgs(uint t,uchar a); //间隔闪/**********************************************************/void zg(uint t,uchar a)//两边逐个亮{uchar i,j;for(j=0;j<a;j++){P0=P1=P2=P3=0xff;P0=0x7f;delay(t);for(i=0;i<7;i++){P0=table1[i+1];P2=table1[i];delay(t);}P2=0x00;P1=0xfe;delay(t);for(i=0;i<7;i++){P1=table[i+1];P3=table1[i];delay(t);}P3=0x00;delay(t);}}void qs(uint t,uchar a) //全部闪烁{uchar j;for(j=0;j<a;j++){P0=P1=P2=P3=0xff;delay(t);P0=P1=P2=P3=0x00;delay(t);}}void zgxh(uint t,uchar a) // 逆时针逐个点亮{uchar i,j;for (j=0;j<a;j++){P0=P1=P2=P3=0xff;for (i=0;i<8;i++){P0=table1[i];delay(t);}for(i=0;i<8;i++){P1=table[i];delay(t);for(i=0;i<8;i++){P3=table[i];delay(t);}for(i=0;i<8;i++){P2=table[i];delay(t);}}}void nszgm(uint t,uchar a) // 逆时针逐个灭{uchar i,j;for(j=0;j<a;j++){P0=P1=P2=P3=0x00;for (i=0;i<8;i++){P0=table3[i];delay(t);}for (i=0;i<8;i++){P1=table2[i];delay(t);}for (i=0;i<8;i++){P3=table2[i];delay(t);}for (i=0;i<8;i++){P2=table2[i];delay(t);}}}/*void zgxh1(uint t,uchar a) // 顺时针逐个点亮{for (j=0;j<a;j++){P0=P1=P2=P3=0xff;for (i=0;i<8;i++){P2=table1[i];delay(t);}for(i=0;i<8;i++){P3=table1[i];delay(t);}for(i=0;i<8;i++){P1=table1[i];delay(t);}for(i=0;i<8;i++){P0=table[i];delay(t);}}}*//*void sszgm(uint t,uchar a) // 顺时针逐个灭{uchar i,j;for(j=0;j<a;j++){P0=P1=P2=P3=0x00;for (i=0;i<8;i++){P2=table3[i];delay(t);}for (i=0;i<8;i++){P3=table3[i];delay(t);}for (i=0;i<8;i++){P1=table3[i];delay(t);}for (i=0;i<8;i++){P0=table2[i];delay(t);}}}*/void djs(uint t,uchar a) //对角闪{uchar j;for(j=0;j<a;j++){P0=P1=P2=P3=0xff;P0=P3=0x00;delay(t);P0=P1=P2=P3=0xff;P1=P2=0x00;delay(t);}}void lbzgm(uint t,uchar a)//两边逐个灭{uchar i,j;for (j=0;j<a;j++){P0=P2=0x00;P3=0x01;delay(t);for(i=7;i>1;i--){P1=table[i-1];P3=table1[i-2];delay(t);}P1=0xfe;P3=0xff;delay(t);P1=0xff;P2=0x01;delay(t);for(i=7;i>1;i--){P0=table1[i-1];P2=table1[i-2];delay(t);}P0=0x7f;P2=0xff;delay(t);P0=0xff;delay(t);}}void sztl(uint t,uchar a)//顺时逐个同步亮{uchar i,j;for(j=0;j<a;j++){P0=P1=P2=P3=0xff;for(i=0;i<8;i++){P0=table[i];P1=P2=P3=table1[i];delay(t);}}}void nztl(uint t,uchar a)//逆时逐个同步亮{uchar i,j;for(j=0;j<a;j++){P0=P1=P2=P3=0xff;for(i=0;i<8;i++){P0=table1[i];P1=P2=P3=table[i];delay(t);}}}void sztm(uint t,uchar a)//顺时逐个同步灭{uchar i,j;for(j=0;j<a;j++){P0=P1=P2=P3=0x00;for(i=0;i<8;i++){P0=table2[i];P1=P2=P3=table3[i];delay(t);}}}void nztm(uint t,uchar a)//逆时逐个同步灭{uchar i,j;for(j=0;j<a;j++){P0=P1=P2=P3=0xff;for(i=0;i<8;i++){P0=table3[i];P1=P2=P3=table2[i];delay(t);}}}void hwzjl(uint t,uchar a) //横往中间亮{uchar i,j;for (j=0;j<a;j++){P0=P1=P2=P3=0xff;for(i=0;i<8;i++){P0=P2=P1=table1[i];P3=table[i];delay(t);}}}void hwzjm(uint t,uchar a) //横往中间灭{uchar i,j;for (j=0;j<a;j++){P0=P1=P2=P3=0x00;for(i=0;i<8;i++){P0=P2=P1=table3[i];P3=table2[i];delay(t);}}}/*void swzjl(uint t,uchar a) //竖往中间亮{uchar i,j;for (j=0;j<a;j++){P0=P1=P2=P3=0xff;for(i=0;i<8;i++){P0=P2=P1=table[i];P3=table1[i];delay(t);}}}void swzjm(uint t,uchar a) //竖往中间灭{uchar i,j;for (j=0;j<a;j++){P0=P1=P2=P3=0x00;for(i=0;i<8;i++){P0=P2=P1=table2[i];P3=table3[i];delay(t);}}}*/void nzdl(uint t,uchar a) //逆时逐段亮{uchar i,j;for (j=0;j<a;j++){P0=P1=P2=P3=0xff;for(i=0;i<8;i++){P0=table1[i];delay(t);}P0=0xff;for(i=0;i<8;i++){P1=table[i];delay(t);}P1=0xff;for(i=0;i<8;i++){P3=table[i];delay(t);}P3=0xff;for(i=0;i<8;i++){P2=table[i];delay(t);}P2=0xff;}}void nzdgl(uint t,uchar a) //逆时逐段一个点亮{uchar i,j,k,l;for (j=0;j<a;j++){k=table1[0];P0=k;l=table[0];P1=P2=P3=l;delay(t);for(i=0;i<8;i++){k=_crol_(k,-1);P0=k;l=_crol_(l,1);P1=P2=P3=l;delay(t);}}}void jgs(uint t,uchar a) //间隔闪{uchar j;for (j=0;j<a;j++){P0=0x55;P1=P2=P3=0xaa;delay(t);P0=0xaa;P1=P2=P3=0x55;delay(t);}}void main(){uchar i;while(1){zg(100,1); //两边逐个亮lbzgm(100,1); //两边逐个灭jgs(300,10);djs(100,20); //对角闪////////////////////////////////////////////P1=P2=P3=0xff;for(i=0;i<3;i++){P0=0x00;delay(800);P0=0xff;delay(800);}P0=0x00;for(i=0;i<3;i++){P1=0x00;delay(800);P1=0xff;delay(800);}for(i=0;i<3;i++){P3=0x00;delay(800);P3=0xff;delay(800);}P3=0x00;for(i=0;i<3;i++){P2=0x00;delay(800);P2=0xff;delay(800);}qs(500,3);/////////////////////////////////////////////for(i=0;i<6;i++){zgxh(50,1);nszgm(50,1);}djs(100,20); //对角闪for(i=0;i<3;i++){zg(100,1); //两边逐个亮lbzgm(100,1); //两边逐个灭}qs(200,10);djs(100,50);for(i=0;i<5;i++){sztl(200,1); //顺时逐个同步亮nztm(200,1);nztl(200,1);sztm(200,1); //顺时逐个同步灭}djs(300,10); //对角闪nzdgl(300,10); //逆时逐段一个点亮jgs(300,10); //间隔闪for(i=0;i<3;i++){nszgm(100,1);}/*for(i=0;i<5;i++){zgxh1(100,1);sszgm(100,1);}*/nzdl(200,3); //逆时逐段亮jgs(50,100); //间隔闪/*///////////////////////////////////////////////////// P0=P1=P2=P3=0xff;for (i=0;i<8;i++){P0=table1[i];delay(200);}for (i=0;i<8;i++){P1=table[i];delay(200);}for(i=0;i<3;i++){P0=P1=0x00;delay(200);P0=P1=0xff;delay(200);}for (i=0;i<8;i++){P2=table1[i];delay(200);}for (i=0;i<8;i++){P3=table1[i];delay(200);}for(i=0;i<3;i++)P2=P3=0x00;delay(200);P2=P3=0xff;delay(200);}*///////////////////////////////////////////////////nzdgl(50,40); //逆时逐段一个点亮for(i=0;i<4;i++){zg(100,1);qs(100,10);lbzgm(100,1);}// djs(50,100); //对角闪for(i=0;i<3;i++){zgxh(100,1);nszgm(100,1);}djs(1000,10);for(i=0;i<10;i++){hwzjl(200,1); //横往中间亮hwzjm(200,1); //横往中间灭}djs(300,10); //对角闪/* for(i=0;i<10;i++){swzjl(200,1); //竖往中间亮swzjm(200,1); //竖往中间灭}*/for(i=0;i<5;i++){zgxh(100,1);nszgm(100,1);}djs(100,20); //对角闪zg(300,1);lbzgm(300,1);/*for(i=0;i<5;i++)zgxh1(100,1);sszgm(100,1);}*/for(i=0;i<5;i++){sztl(200,1); //顺时逐个同步亮nztm(200,1);nztl(200,1);sztm(200,1); //顺时逐个同步灭}djs(500,20); //对角闪djs(100,30); //对角闪djs(50,50); //对角闪// djs(10,100); //对角闪delay(1000);}}void delay(uint t){uint x,y;for (x=t;x>0;x--){for (y=120;y>0;y--);}}因为89C52的容量有限,所以还有几个方式注释掉了。

12路流水灯控制电路

12路流水灯控制电路

一、概述随着人们生活环境的不断改善和美化,在许多场合可以看到彩色霓虹灯不断变化闪烁。

LED,低廉的造价以及控制简单等特点而得到了广泛的应用,用彩灯来装饰街道和城市灯由于其丰富的灯光色彩建筑物已经成为一种时尚。

但目前市场上各式样的LED灯控制器大多数用全硬件电路实现,电路结构复杂、功能单一,这样一旦制作成品只能按照固定的模式闪亮,不能根据不同场合、不同时间段的需要来调节亮灯时间、模式、闪烁频率等动态参数。

这种彩灯控制器结构往往有芯片过多、电路复杂、功率损耗大等缺点。

此外从功能效果上看,亮灯模式少而且样式单调,缺乏用户可操作性,影响亮灯效果。

因此有必要对现有彩灯控制器进行改进。

流水彩灯控制器在我们日常生活中有重要的应用,如广告牌的设计和节日彩灯的设计都能运用到它的原理。

本次设计的流水彩灯控制器是其中较简单的,但这是复杂设计的基础。

设计要求:1、在选择器件时,应考虑成本。

2、根据技术指标,通过分析计算确定电路和元器件参数。

3、画出电路原理图(元器件标准化,电路图规范化)。

技术指标:1、用中规模计数器设计该12路流水灯控制电路;2、要求每盏灯的点亮时间介于1s~1.2s之间;3、要求用555定时器设计时钟脉冲,12路流水灯采用12个发光二极管代替。

二、方案设计1 原理框图图1 12路流水灯设计原理图该电路主要由555定时器、74LS161计数器和74HC154译码器和LED 发光二极管。

由555定时器构成脉冲发生器,并由LED 发光二极管监视电路是否工作;将74SL161接成二进制计数器,74SL154的12个输出端依次与排成一排的12个LED 发光管相接。

161芯片的QC 、QD 端接与非门然后与161的LOAD 端相接;且161的LOAD 端通过非门与154芯片的G1与G2相接。

取74SL161的QD 、QC 、QB 、QA 接到74SL154的地址控制端D 、C 、B 、A , 12个发光二极管按一定方向循环亮灭。

(完整word版)项目二流水灯的制作与调试

(完整word版)项目二流水灯的制作与调试

随着电子技术的快速发展尤其是数字技术的突飞猛进,多功能流水灯凭着简易,高效,稳定等特点得到普遍的应用。

在各种娱乐场所、店铺门面装饰、家居装潢、 城市墙壁更是随 处可见,与此同时,还有一些城市采用不同的流水灯打造属于自己的城市文明, 塑造自己的 城市魅力。

目前,多功能流水灯的种类已有数十种, 如家居装饰灯、店铺招牌灯等等。

所以, 多功能流水灯的设计具有相当的代表性。

任务1认识电路1•电路工作原理图1所示为555+ 4017构成的自动脉冲分配器 电路原理图。

十进制计数/分频器 CD4017,其内部由计数器及译码器两部分组成,由译码输出实现对脉 冲信号的分配,整个输出时序就是 O0、01、02、…、09依次出现与时钟同步的高电平, 宽度等于时钟周期。

CD4017有10个输出端(Y0〜Y9 )和1个进位输出端 C0。

每输入10个计数脉冲,CO 就 可得到1个进位正脉冲,该进位输出信号可作为下一级的时钟信号。

CD4017有3个控制(MR 、CP0和~CP1) , MR 为清零端,当在 MR 端上加高电平或正脉冲 时其输出00为高电平,其余输出端(01〜09)均为低电平。

CP0和〜CPl 是2个时钟输入 端,若要用上升沿来计数,则信号由 CP0端输入;若要用下降沿来计数,则信号由〜 CPl 端输入。

设置2个时钟输入端,级联时比较方便,可驱动更多二极管发光。

由此可见,当CD4017有连续脉冲输入时,其对应的输出端依次变为高电平状态, 用作顺序脉冲发生器。

项目二流水灯的制作与调试故可直接图1叮咚门铃电路原理图CLK或CP端:轻触开关作为信号触发,上升沿•CR端:清零端,高电平清零•INH端:接低电平时,CLK端上升沿计数,输出高电平•接高电平时,保持•CO 端:进位输出端,没有进位时输出高电平(Q0~Q4),有进位时输出低电平(Q5~Q9).实物图图2所示为流水灯电路实物图。

图2流水灯电路实物图任务2元器件的识别与检测1•电路元器件的识别在电路的制作过程中,元器件的识别与检测是不可缺少的一个环节,读者在制作前可先对照表1逐一进行识别。

单片机流水灯实验电路图+仿真

单片机流水灯实验电路图+仿真
实验现象实物图如下图
八、实验中的问题
1.程序编译问题
初始编程时出现语法错误,后修正
2、循环显示出现问题,循环不能持续。修改程序延时,及数码移位程序片段。
2、在进行数码显示的时候,要对显示单元开辟8个显示缓冲区,每个显示缓冲区装有显示的不同数据即可
五、C语言源程序
#include <REG51.H>
#define uint unsigned int
#define uchar unsigned char
uchar code DIS_SEG7[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8};
for(cnt = 0; cnt < 8; cnt++) {//点亮数码管0-7
P2 = 0;
P0 = DIS_SEG7[DISP[cnt]];
P2 = ~DIS_BIT[cnt];
delay1ms(1);
}
ttt = DISP[0];
DISP[0] = DISP[1];
DISP[1] = DISP[2];
单片机实验
项目____拉幕式数码显示_______
学号___1204180217_____
专业__能源工程及其自动化__
班级____02____________
姓名___邵鹏程_________
一、实验目的
1,对单片机进一步了解熟悉
2,掌握数码管显示技术及编程
3,巩固理论知识及
二、实验内容
用51单片机8位控制数码管,在数码管上显示“01234567”,并能循环显示。
三、实验原理图
四、程序设计方法
1、动态数码显示技术;如何进行动态扫描,由于一次只能让一个数码管显示,因此,要显示8位的数据,必须经过让数码管一个一个轮流显示才可以,同时每个数码管显式的时间大约在1ms到4ms之间,所以为了保证正确显示,必须每隔1ms,就得刷新一个数码管。而这刷新时间我们采用单片机的定时/计数器来控制,每定时1ms对数码管刷新一次。

单片机编程入门:单片机流水灯程序

单片机编程入门:单片机流水灯程序

单片机编程入门:单片机流水灯程序今日就来教教大家怎么玩玩51单片机,当然了,首先有一个必要的条件就是你必需要会c语言,目前高校里面有开的关于微机原理的课的,上课的时候,老师还说:“你们要多学学汇编语言,对你们以后学习单片机有用”,而事实上后来才发觉c语言才是最重要的。

要想玩单片机,就必需要知道最重要的是什么,对于一块51单片机的开发板来说,最重要的就是要认仔细真的看它的原理图,原理图才是最重要的。

今日先说说最基本的,就是怎么玩流水灯,老样子,先看看原理图:可以看到,总共是八个LED灯,都是由单片机的P1口掌握的,并且可以知道当端口为低电平常,灯就会亮,大家肯定要留意这一点,目前市场上51的开发板还是有特别多的,你必需要知道你的板子上LED灯是高电平使能还是低电平使能。

像我这块就是低电平使能,写程序的话,我们可以用十六进制的代码写,任意一个十六进制的数都可以拆分成八位的二进制数,而计算机只识别二进制,这样我们可以直接掌握LED灯。

比如我现在写一个代码P1 = 0xfe,那么把它变为二进制后就是1111 1110 这样的话,正好对应八个LED灯,最终一位是零,那么也就是最终一个LED灯亮了,其余的则是全灭状态。

现在我们可以玩玩流水灯,看一下这个程序:看主函数main 里面的代码,P1 = 0xff 说明最开头是全灭状态,定义一个for循环,以八位为一个循环,当然也可以看到,最重要的便是P1 = P1》1这个代码,相当于说是把1111 1111 这个代码整体向右移位,比如说移位一次,那么就会变成0111 1111,那么就会有一个灯亮,移位两次,就会变成0011 1111,就会有两个灯亮,以此类推下去,等就会渐渐亮起来。

也就是流水灯咯。

大家可以自己随便修改,看看各种亮灯方式。

流水灯原理图

流水灯原理图

流水灯原理图
流水灯程序
其实流水灯程序就是你只要搞懂端口的高低电平是怎么一回事,置为1 即将该点即为高电平,置0即为低电平,低电平一般是0.3V,同时要知道发光二极管在满足一定电压的同时正常发光电流为10~15mA左右,低于该电流二极管发光亮度会很暗。

比如用一个5V 的电源驱动以个发光二极管其亮度会很亮,当串联一个300欧的电阻时,二极管两端的电压大概为2.3V, 此时电阻两端的电压为5.0-2.2=2.8V;电路中的电流为2.8V/300=9.3ma,接近于正常情况下的发光电流,当串联1K电阻时,则基本就不会光。

下图即为分别串联电阻为R=300,100,500.欧姆的情况下个发光二极管的亮度。

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

流水灯电路图和程序#include <reg52.h>#include<instrins.h>#define uchar unsigned char#define uint unsigned intuchar code led[]={0xfe,0xfb,0xfd ,0xf7,0xef,0xbf,0xdf,0x7f};delay(uint z){uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}main( ){uint i;while(1){P2=led[];delay(500);_crol_(led,1);}}用arm7做一个流水灯的设计。

悬赏分:100 - 解决时间:2009-9-3 20:03试设计一个闪烁流水灯控制器,该控制器可以控制8个灯顺序亮灭,当按钮K按下1次后,每次顺序点亮一个灯。

而且每个点亮的灯在闪烁3次后,才能灭,周而复始,直到按钮K 二次按下。

(用状态机设计)要用PROTEL99画好电路图。

还要写好程序。

画图的也只能发到我的邮箱里面吧。

邮箱:。

谢谢各位。

提问者:woxinruozai - 五级最佳答案从原理图可以看出,如果我们想让接在P1.0口的LED1亮起来,那么我们只要把P1.0口的电平变为低电平就可以了;相反,如果要接在P1.0口的LED1熄灭,就要把P1.0口的电平变为高电平就可以;同理,接在P1.1~P1.7口的其他7个LED的点亮和熄灭方法方法同LED1。

因此,要实现流水灯功能,我们只要将LED2~LED8依次点亮、熄灭,依始类推,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高、返回到开始、程序结束。

从上面中文表示看来实现单片机流水灯很简单,但是我们不能说P1.0你变低,它就变低了。

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

我们又怎样来使单片机按我们的意思去工作呢?为了让单片机工作,只能将程序写为二进制代码交给其执行;早期单片机开发人员就是使用人工编写的二进制代码交给单片机去工作的。

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

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

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

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

实现8个LED流水灯汇编语言源程序liu01.asm;----- 主程序开始-----START: 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,#255DJNZ R1,$DJNZ R0,D1RET ;子程序返回END ;程序结束在上面主程序中用到了五条汇编语言指令:CLR、ACALL、SETB、LJMP、END。

CLR:是将其后面指定的位清为0,程序中使对应端口输出低电平ACALL:是子程序调用指令,程序中调用了DELAY延时子程序SETB:是将其后面指定的位置成1,程序中使对应端口输出高电平AJMP:是无条件跳转指令,意思是:跳转到指定的标号处继续运行END:是程序结束的伪指令,意思是告诉编译器,程序到此结束。

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

在上面源程序中"ACALL DELAY"指令的作用是调用DELAY延时子程序。

为什么要使用这指令呢?如果不用该指令能够实现"流水"效果吗?答案是肯定的,一定要用该指令才能看到我们需要的"流水"效果。

如果不用该指令,则由于8个LED发光与熄灭的时间都很短,我们肉眼无法看到LED的熄灭与点亮,凭我们肉眼看到的是LED1~LED8都同时亮(半亮),而看不到“流水”效果的!注:初学者可以将上面源程序中所有"ACALL DELAY"指令行删除后再编译后烧写到单片机进行验证一下。

产生这种现象主要是因为单片机执行每条指令的时间很短,我们知道实验板上单片机的时钟高达11.0592MHz,在这个时钟信号(即晶体振荡信号)下,一个“机器周期”仅大约1.08uS(微秒)。

本程序中我们用到的SETB P.x和CLR P.x均属于单周期指令,也就是说,执行一句SETB P.x 用时仅1.08uS(微秒),CLR P.x 也是1.08uS(微秒);也就是点亮和熄灭时间都为1.08uS(微秒),在如此高速的流水速度下,8个LED发光与熄灭的时间都很短,当然凭我们的肉眼看不到“流水”效果了!这里需要说明的是,按汇编语法要求,所编制的程序(下称源程序)之格式和书写要求必须依下列原则:1、源程序必须为纯文本格式文件,如用Windows“附件”中的“记事本”编写的文本文件或用UltraEdit文本编辑器编辑;2、源程序的扩展名应是*.ASM;3、一行只能写一条语句,以回车作为本句的结束,每一语句行长度应少于80个字符(即40个汉字)。

4、每行的格式应为:标号:命令参数;注释。

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

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

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

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

在宏汇编ASM51中标号的长度不受限制,但标号中不能包含‘:'或其它的一些特殊符号,也不能用汉字,可以用数字作标号,但必须用字母开头。

当标号作参数用(如标号作转移地址),在命令后面出现时,必须舍去‘:'(如上面程序中的AJMP START中的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和其他端口在单片机中也是一个寄存器。

相关文档
最新文档