几种流水灯的闪亮程序
- 格式:doc
- 大小:21.50 KB
- 文档页数:5
多种模式的LED流水灯设计1.实现的功能要求包含四种模式,分别是①从左到右点亮,②从右到左点亮,③从两边到中间点亮,④从中间到两边点亮。
要求四种模式依次切换,循环执行。
2.实现的HDL代码module led_run(clk,led,rst);input clk; //clk with low frequency like 1Hzinput rst; //system reset signaloutput [11:0] led; //denotes 12 leds,reg [11:0] led;reg [2:0] state; //state variable,internal signalsreg [5:0] count; //control signals of the state diagram,internal signalsalways @(posedge clk or posedge rst) //the state diagramif (rst)beginstate <= 3'b000;count <= 6'b000000;endelsecase(state)3'b000:begincount[3:0]<= 4'b0;count[5:4]<= count[5:4]+1'b1;case(count[5:4])2'b00: state <= 3'b001;2'b01: state <= 3'b010;2'b10: state <= 3'b011;2'b11: state <= 3'b100;endcaseend3'b001:begincount <= count + 1'b1;if(count[3:0] == 11)state <= 3'b000; end3'b010:begincount <= count + 1'b1;if(count[3:0] == 11)state <= 3'b000; end3'b011:begincount <= count + 1'b1;if(count[3:0] == 5)state <= 3'b000; end3'b100:begincount <= count + 1'b1;if(count[3:0] == 5)state <= 3'b000; enddefault:beginstate <= 3'b000;count <= 6'b000000;endendcasealways @(posedge clk or posedge rst) //the behavior of each stateif (rst)led <= 12'hFFF;elsecase(state)3'b000: led <= 12'hfff;3'b001: led <= led << 1;3'b010: led <= led >> 1;3'b011:beginled[11:6]<= led[11:6]>>1;led[5:0]<=led[5:0]<<1;end3'b100:beginled[11:6]<= led[11:6]<<1;led[5:0]<=led[5:0]>>1;enddefault: led<=12'hfff;endcaseendmodule3.实现的功能仿真截图经Modelsim_altera仿真后的结果如下图所示:(注led低电平为亮,高电平为灭)。
五种编程方式实现流水灯的单片机C程序流水灯是一种常见的灯光效果,常用于装饰和展示。
实现流水灯的程序可以使用多种不同的编程方式,包括传统的顺序编程、状态机编程、中断编程、调度器编程和面向对象编程。
下面分别介绍这五种方式实现流水灯的程序。
1.顺序编程方式:顺序编程是最常见的编程方式,也是最直接的方式。
下面是使用顺序编程方式实现流水灯的C程序:```c#include <reg52.h>void delay(unsigned int t)while(t--)for(int i=0; i<50; i++);}void mainunsigned char led = 0x80; // 初始灯光状态while(1)P0 = led; // 输出灯光状态delay(500); // 延时一段时间led >>= 1; // 右移一位,实现流水灯效果if(led == 0) // 到达最右边后重新开始led = 0x80;}}```2.状态机编程方式:状态机编程是一种基于状态的编程方式,通过定义不同的状态和状态转换来实现流水灯效果。
下面是使用状态机编程方式实现流水灯的C程序:```c#include <reg52.h>typedef enumState1,State2,State3,State4,State5} State;void delay(unsigned int t)while(t--)for(int i=0; i<50; i++);}void mainState state = State1; // 初始状态为State1 while(1)switch(state)case State1:P0=0x80;delay(500);state = State2;break;case State2:P0=0x40;delay(500);state = State3;break;case State3:P0=0x20;delay(500);state = State4;break;case State4:P0=0x10;delay(500);state = State5;break;case State5:P0=0x08;delay(500);state = State1;break;}}```3.中断编程方式:中断编程方式是一种基于中断事件的编程方式,通过在特定的中断事件触发时改变灯光状态来实现流水灯效果。
图1流水灯硬件原理图从原理图中可以看出,假如要让接在PLO 口的LEDI 亮起来,那么只要把 P1.0口的电平变为低电平就可以了;相反,假如要接在PLO 口的LEDl 熄灭,就 要把PLO 口的电平变为高电平洞理,接在P1.1~PL7 口的其他7个LED 的点 亮和熄灭的方法同LED1。
因此,要实现流水灯功能,我们只要将发光二极管 LED1-LED8依次点亮、熄灭,8只LED 灯便会一亮一暗的做流水灯了。
在此 我们还应留意一点,由于人眼的视觉暂留效应以及单片机执行每条指令的时间很 短,我们在掌握二极管亮灭的时候应当延时一段时间,否则我们就看不到“流水” 效果了。
3.软件编程单片机的应用系统由硬件和软件组成,上述硬件原理图搭建完成上电之后, 我们还不能看到流水灯循环点亮的现象,我们还需要告知单片机怎么来进行工PlO POO Pll POl PlJ POi PlJ P03 Pl* PO* P15 PO 5 Pl 3PO 4 P17 λ!SS>C51POT am PJO nττoPnP22 Il pn IO P” P25 I∑∖T> PY P27Xl X :XXD!XD KD ALEP TlPSHT∖n47Kx8VCCLEDl-M —LED)W LED)LED1 W * LEDS人KLEDj WLED7W-44LEDS-M作,即编写程序掌握单片机管脚电平的凹凸变化,来实现发光二极管的一亮一灭。
软件编程是单片机应用系统中的一个重要的组成部分,是单片机学习的重点和难点。
下面我们以最简洁的流水灯掌握功能即实现8个LED灯的循环点亮,来介绍实现流水灯掌握的几种软件编程方法。
3.1位控法这是一种比较笨但又最易理解的方法,采纳挨次程序结构,用位指令掌握Pl 口的每一个位输出凹凸电平,从而来掌握相应LED灯的亮灭。
程序如下:ORG OOOOH ;单片机上电后从0000H地址执行AJMPSTART ;跳转到主程序存放地址处ORG 0030H ;设置主程序开头地址START : MOV SP , #60H ;设置堆栈起始地址为60HCLRPl.0;PLO输出低电平,使LEDl点亮ACALL DELAY ;调用延时子程序SETB P1.0;P1.0输出高电平,使LEDl熄灭CLR Pl.l ;P1.1输出低电平,使LED2点亮ACALL DELAY ;调用延时子程序SETB Pl.l ;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 Pl.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 ;调用延时子程序CLR P1.7 ;P1.7输出低电平,使LED8点亮ACALL DELAY ;调用延时子程序SETB P1.7pl.7输出高电平,使LED8熄灭ACALL DELAY ;调用延时子程序START ;8个LED流了一遍后返回到标号START处再循环AJMPDELAY :;延时子程序MOV RO , #255 ;延时一段时间Dl : MOV Rl , #255DJNZRl , $DJNZ RO , DlRET ;子程序返回END ;程序结束3.2循环移位法在上个程序中我们是逐个掌握Pl端口的每个位来实现的,因此程序显得有点简单,下面我们采用循环移位指令,采纳循环程序结构进行编程。
三种流水灯设计实践报告学院:机械与电子工程学院班别:09电子信息工程3班课程:西门子PLC与工业网络技术指导老师:孙亚飞老师组员:罗龙标2号陈淼珊43号蒋家涛46号梁康祥51号一、第一种流水灯(脉冲定时器(SP))脉冲定时器方框图线圈图-(SP)-(1)脉冲定时器的时序功能图(2)脉冲定时器(SP)的工作原理由时序图可得,脉冲定时器的特点是在任何情况下只要起动输入端S有上升沿信号,定时器就被触发,并从TV预设时间值处重新开始定时,且定时器常开触点闭合,Q端输出1;在定时期间内,如果S端保持高电平1不变,则定时器运行到定时时间值结束,此时定时器常开触点释放,Q端由1变为0;如果定时期间,S端断开(由1变为0),则定时器停止运行,常开触点也随即释放,Q端输出为0。
从时序图看,定时器的运行在S端控制下呈现脉冲状,故称为脉冲定时器。
不论S端处于何种状态,只要复位端R的状态由0变为1,则定时器就被复位,Q端输出变为0,定时器常开触点断开。
(3)、流水灯的程序图(4)第一种流水灯仿真图(5)流水灯的工作原理当开关I0.0闭合的时候,脉冲定时器T0开始计时,在T0计时时间中,灯Q0.0开始工作,之后T0定时结束定时器常开触点释放,Q0.0停止工作,所以Q0.0常闭触点同时给T1一个上升沿,T1就开始计时,灯Q0.1开始工作、、、、、一直到Q0.3停止工作,Q0.3同时又给一个上升沿给T0,脉冲定时器T0又开始计时、、、、、以此循环,就可实现从Q0.0 到Q0.3 循环,再加上另外的灯,工作原理相同二、第二种流水灯(扩展脉冲定时器(SE))脉冲定时器方框图线圈图-(SE)- (1)扩展脉冲定时器的时序功能图(2)扩展脉冲定时器(SP)的工作原理由时序图可得,当起动输入端S有上升沿信号,定时器开始定时,定时期间定时器常开触点闭合,Q端输出高电平1,且保持到定时结束,之后变为0,常开触点断开;在定时期间内,即使S端变为0,定时器继续定时;如果在定时期间,S端重新触发定时器(即在定时期间S端又来一个上升沿信号),则定时器被重新起动,并从预设值开始定时。
STC单片机流水灯新花样程序
ORG 000H;设置起始地址
START:
MOV A,#0FFH;向A寄存器中载入十六进制数0FFH
D2: SUBB A,#1;A寄存器中数据减一
call DE ;调入延时程序(修改延时时间可以实现水滴效果)
MOV R1,A;将寄存器A中数据传送给R1
MOV P1,R1;输出(外接8个LED,共阳极接法,低电平有效)
DJNZ R1,D2;检测R2是否为零,否则跳到D2处继续执行
JMP START;无条件跳转至开始
DE: ;延时程序
mov R3,#50
L1: MOV R4,#50
L2: MOV R5,#50
DJNZ R5,$
DJNZ R4,L2
DJNZ R3,L1
RET
END
这是个非常优美的流水灯程序,8个LED接单片P1口,首先LED1闪烁慢慢移动至LED2变常亮,接着LED2常亮LED1闪烁移至LED3常亮,接着LED2灭,LED1闪烁移至LED2常亮,等LED1亮后,LED4亮,LED3.LED2灭,LED1闪烁····,一直到8个LED常亮后重新开始!(好美)修改延时时间可以实现水滴效果哦!
程序编写:蓝色梦幻2013年5月19日。
几种流水灯程序1. 基础流水灯程序:用来控制1个led灯,使其呈现流水灯的效果,代码如下: int led = 13; // 让led连接到电路的13号引脚void setup(){pinMode(led, OUTPUT); // 设置13号引脚的模式为输出}void loop(){digitalWrite(led, HIGH); // 让led灯亮起来delay(1000); // 等待1秒digitalWrite(led, LOW); // 让led灯熄灭int led1 = 13;int led2 = 12;int led3= 11;int led4 = 10;void setup (){pinMode (led1, OUTPUT);pinMode (led2, OUTPUT);pinMode (led3, OUTPUT);pinMode (led4, OUTPUT);}void loop (){digitalWrite (led1, HIGH);delay (500);digitalWrite (led1, LOW);digitalWrite (led2, HIGH);delay (500);digitalWrite (led2, LOW);digitalWrite (led3, HIGH);delay (500);digitalWrite (led3, LOW);digitalWrite (led4, HIGH);delay (500);digitalWrite (led4, LOW);delay (1000);}3.调节速度的流水灯程序:将第一个流水灯程序增加一个模拟变量,使得可以即时调节灯泡亮度以及闪烁速度,以及可以控制单个led灯或多个led灯,其代码如下:4.设置模式的流水灯程序:将流水灯程序改进,使得应用于不同的场景,可以调节闪烁模式,如快速,慢速,长亮等,其代码如下:。
各种流水灯程序Lesso2.1: 第一个发光管以间隔200ms闪烁(这是最原始的程序没有用延迟子函数)。
#include<reg52.h>sbit D1=P1^0;int a;void main(){while(1){D1=0;a=25000;while(--a);D1=1;a=25000;while(--a);}}Lesson2.2: 8个发光管由上至下间隔1s流动,其中每个管亮500ms,灭500ms,亮时蜂鸣器响,灭时关闭蜂鸣器,一直重复下去。
#include<reg52.h>#include<intrins.h>#define uint unsigned int#define uchar unsigned charvoid delay(uint);uchar temp;sbit beep=P2^3;void main(){temp=0xfe;while(1){P1=temp;beep=0;delay(500);P1=0xff;beep=1;delay(500);temp=_crol_(temp,1);}}void delay(uint z){uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}Lesson2.3:8个发光管来回流动,第个管亮100ms,流动时让蜂鸣器发出“滴滴”声。
#include<reg52.h>#include<intrins.h>#define uint unsigned int#define uchar unsigned charvoid delay(uint);uchar temp;int i,j;sbit beep=P2^3;void main(){temp=0xfe;while(1){for(i=7;i>0;i--) { beep=0;delay(100);beep=1;delay(100);beep=0;delay(100);beep=1;P1=temp;delay(500);temp=_crol_(temp,1); }for(i=7;i>0;i--) {beep=0;delay(100);beep=1;delay(100);beep=0;delay(100);beep=1;P1=temp;delay(500);temp=_cror_(temp,1);}}}void delay(uint z){uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}Lesson2.4:用8个发光管演示出8位二进制数累加过程。
流水灯闪亮程序
#include<reg52.h>
#include<intrins.h>
sbit led1=P1^0;
#define uchar unsigned char
#define uint unsigned int
void delay(uint ms);
void main(void)
{
uchar a;
a=0xfe;
while(1)
{
P1=a;
delay(500);
a=_crol_(a,1); //_crol_(a,1);循环左移_cror_(a,1); ;循环右移}
}
void delay(uint ms) //500
{
uint i, j; // uchar时间短uint时间较长
for (i=ms;i>0;i--)
for(j=100;j>0;j--);
}
流水灯程序
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
sbit key=P1^0;
sbit led9=P0^7;
uchar k;
//delay us
void Delay(uchar us) //5,7,9
{
while(--us);
}
//delay ms
void DelayMS(uint iMs)
{
uint i,j;
for(i=0;i<iMs;i++)
for(j=0;j<65;j++) Delay(1);
}
main()
{
uchar i;
i=0xff;
led9=1;
P2=i;
while(1)
{
key=1;
DelayMS(50);
if(key==0)
{
led9=0;
DelayMS(1000);
led9=1;
i=0x7f;
for(k=0;k<8;k++)
{
P2=i;
i=_cror_(i,1);
DelayMS(500);
}
i=0xfe;
for(k=0;k<8;k++)
{
P2=i;
i=_crol_(i,1);
DelayMS(500);
}
led9=0;
DelayMS(500);
P2=0;
led9=0;
DelayMS(3000);
P2=0xff;
led9=1;
}
}
}
流水灯程序
#include<reg51.h> //包含单片机寄存器的头文件
void delay(void)
{
unsigned int i,j; //unsigned char 时间较短,值域0~255 unsigned int 时间较长,值域0~65535
for(i=0;i<500;i++) // i为灭灯时间,j为亮灯时间;
for(j=0;j<500;j++) // i为灭灯时间,j为亮灯时间;
;
}
void main(void)
{
while(1)
{
P1=0xfe; //第一个灯亮
delay(); //调用延时函数
P1=0xfd; //第二个灯亮
delay(); //调用延时函数
P1=0xfb; //第三个灯亮
delay(); //调用延时函数
P1=0xf7; //第四个灯亮
delay(); //调用延时函数
P1=0xef; //第五个灯亮
delay(); //调用延时函数
P1=0xdf; //第六个灯亮
delay(); //调用延时函数
P1=0xbf; //第七个灯亮
delay(); //调用延时函数
P1=0x7f; //第八个灯亮
delay(); //调用延时函数
P1=0xff; //P1口全灭
delay(); //调用延时函数
P3=0xfe; //第一个灯亮
delay(); //调用延时函数
P3=0xfd; //第二个灯亮
delay(); //调用延时函数
P3=0xfb; //第三个灯亮
delay(); //调用延时函数
P3=0xf7; //第四个灯亮
delay(); //调用延时函数
P3=0xef; //第五个灯亮
delay(); //调用延时函数
P3=0xdf; //第六个灯亮
delay(); //调用延时函数
P3=0xbf; //第七个灯亮。