手动可调变速的流水灯程序
按键控制单片机改变流水灯速度
按键控制单片机改变流水灯速度/*程序效果:有三个按键,按下其中任意一个流水灯的速度改变*/#includereg52.h //52 系列单片机的头文件#define uchar unsigned char//宏定义#define uint unsigned intuchar count=40,flag=0; //定义刚开始的流水灯的速度,后一个为标志变量void main(){uchar i=0;//定义局部变量EA=1; //打开总中断ET0=1; //打开定时器TR0=1; //启动定时器TH0=(65536-50000)/256; //装初值TL0=(65536-50000)%256; P2=0xfe; //点亮第一个数码管,为下次循环做准备while(1){ if(flag) //flag 被置位{flag=0;//清零,为下次做准备P2=~P2; //取反P2=1;//左移一位P2=~P2; //取反i++;if(i==8) //移到第八个数码管,则从新装初值{i=0; P2=0xfe; } }P0=0xf0; //赋初值if((P00xf0)!=0xf0) //判断是否有按键按下{if(P0==0x70) //按下第一个按键count=60; //给count 从新赋值if(P0==0xb0) count=20; if(P0==0xd0) count=10;} }}void time0() interrupt 1 //定时器0{static uchar cnt; //定义静态变量TH0=(65536-50000)/256;TL0=(65536-50000)%256; cnt++; //计数if(cnt==count){ cnt=0; //清零flag=1; //置标志位}} tips:感谢大家的阅读,本文由我司收集整编。
仅供参阅!。
流水灯程序
图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 ;设置堆栈起始地址为60HCLR 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熄灭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熄灭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 ;程序结束3.2循环移位法在上个程序中我们是逐个控制P1端口的每个位来实现的,因此程序显得有点复杂,下面我们利用循环移位指令,采用循环程序结构进行编程。
16路流水灯8种流动方式程序
基于AT89C52的16路流水灯代码#include <REG52.H>unsigned char RunMode;/**********************************SystemFuction*************************************************/void Delay1ms(unsigned int count){unsigned int i,j;for(i=0;i<count;i++)for(j=0;j<120;j++);}unsigned char code LEDDisplayCode[] = { 0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8, //0~70x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E,0xFF};void Display(unsigned char Value){P3 = LEDDisplayCode[Value];}void LEDFlash(unsigned char Count){unsigned char i;bit Flag;for(i = 0; i<Count;i++){Flag = !Flag;if(Flag)Display(RunMode);elseDisplay(0x10);Delay1ms(100);}Display(RunMode);}unsigned char GetKey(void){unsigned char KeyTemp,CheckV alue,Key = 0x00;CheckValue = P2&0x32;if(CheckValue==0x32)return 0x00;Delay1ms(10);KeyTemp = P2&0x32;if(KeyTemp==CheckValue)return 0x00;if(!(CheckValue&0x02))Key|=0x01;if(!(CheckValue&0x10))Key|=0x02;if(!(CheckValue&0x20))Key|=0x04;return Key;}unsigned int TimerCount,SystemSpeed,SystemSpeedIndex;void InitialTimer2(void){T2CON = 0x00; //16 Bit Auto-Reload ModeTH2 = RCAP2H = 0xFC; //重装值,初始值TL2 = RCAP2L = 0x18;ET2=1; //定时器2 中断允许TR2 = 1; //定时器2 启动EA=1;}unsigned int code SpeedCode[]={ 1, 2, 3, 5, 8, 10, 14, 17, 20, 30,40, 50, 60, 70, 80, 90,100, 120, 140, 160,180, 200, 300, 400, 500, 600, 700, 800, 900,1000};//30void SetSpeed(unsigned char Speed){SystemSpeed =SpeedCode[Speed];}void LEDShow(unsigned int LEDStatus){P1 = ~(LEDStatus&0x00FF);P0 = ~((LEDStatus>>8)&0x00FF);}void InitialCPU(void){RunMode = 0x00;TimerCount = 0;SystemSpeedIndex = 10;P1 = 0x00;P0 = 0x00;P2 = 0xFF;P3 = 0x00;Delay1ms(500);P1 = 0xFF;P0 = 0xFF;P2 = 0xFF;P3 = 0xFF;SetSpeed(SystemSpeedIndex);Display(RunMode);}//Mode 0unsigned int LEDIndex = 0;bit LEDDirection = 1,LEDFlag = 1;void Mode_0(void){LEDShow(0x0001<<LEDIndex);LEDIndex = (LEDIndex+1)%16;}//Mode 1void Mode_1(void){LEDShow(0x8000>>LEDIndex);LEDIndex = (LEDIndex+1)%16;}//Mode 2void Mode_2(void){if(LEDDirection)LEDShow(0x0001<<LEDIndex);elseLEDShow(0x8000>>LEDIndex);if(LEDIndex==15)LEDDirection = !LEDDirection;LEDIndex = (LEDIndex+1)%16;}//Mode 3void Mode_3(void){ if(LEDDirection)LEDShow(~(0x0001<<LEDIndex));elseLEDShow(~(0x8000>>LEDIndex));if(LEDIndex==15)LEDDirection = !LEDDirection;LEDIndex = (LEDIndex+1)%16;}//Mode 4void Mode_4(void){if(LEDDirection){if(LEDFlag)LEDShow(0xFFFE<<LEDIndex);elseLEDShow(~(0x7FFF>>LEDIndex));}else{if(LEDFlag)LEDShow(0x7FFF>>LEDIndex);elseLEDShow(~(0xFFFE<<LEDIndex));}if(LEDIndex==15){LEDDirection = !LEDDirection;if(LEDDirection) LEDFlag = !LEDFlag;}LEDIndex = (LEDIndex+1)%16;}//Mode 5void Mode_5(void){if(LEDDirection)LEDShow(0x000F<<LEDIndex);elseLEDShow(0xF000>>LEDIndex);if(LEDIndex==15)LEDDirection = !LEDDirection;LEDIndex = (LEDIndex+1)%16;}//Mode 6void Mode_6(void){if(LEDDirection)LEDShow(~(0x000F<<LEDIndex));elseLEDShow(~(0xF000>>LEDIndex));if(LEDIndex==15)LEDDirection = !LEDDirection;LEDIndex = (LEDIndex+1)%16;}//Mode 7void Mode_7(void){if(LEDDirection)LEDShow(0x003F<<LEDIndex);elseLEDShow(0xFC00>>LEDIndex);if(LEDIndex==9)LEDDirection = !LEDDirection;LEDIndex = (LEDIndex+1)%10;}//Mode 8void Mode_8(void){LEDShow(++LEDIndex);}void TimerEventRun(void){if(RunMode==0x00){Mode_0();}else if(RunMode ==0x01){Mode_1();}else if(RunMode ==0x02){Mode_2();}else if(RunMode ==0x03){Mode_3();}else if(RunMode ==0x04){Mode_4();}else if(RunMode ==0x05){Mode_5();}else if(RunMode ==0x06){Mode_6();}else if(RunMode ==0x07){Mode_7();}else if(RunMode ==0x08){Mode_8();}}void Timer2(void) interrupt 5 using 3{TF2 = 0; //中断标志清除( Timer2 必须软件清标志!)if(++TimerCount>=SystemSpeed){TimerCount = 0;TimerEventRun();}}unsigned char MusicIndex = 0;void KeyDispose(unsigned char Key){if(Key&0x01){LEDDirection = 1;LEDIndex = 0;LEDFlag = 1;RunMode = (RunMode+1)%9;Display(RunMode);}if(Key&0x02){if(SystemSpeedIndex>0){--SystemSpeedIndex;SetSpeed(SystemSpeedIndex);}else{LEDFlash(6);}}if(Key&0x04){if(SystemSpeedIndex<28){++SystemSpeedIndex;SetSpeed(SystemSpeedIndex);}else{LEDFlash(6);}}}//***************************************************************************** ******main(){unsigned char Key;InitialCPU();InitialTimer2();while(1){Key = GetKey();if(Key!=0x00){KeyDispose(Key);}}}。
五种编程方式实现流水灯的单片机C程序
五种编程方式实现流水灯的单片机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端口的每个位来实现的,因此程序显得有点简单,下面我们采用循环移位指令,采纳循环程序结构进行编程。
多种方法写出的51单片机流水灯C语言程序
多种方法写出的51单片机流水灯C语言程序流水灯最原始下面是一个最基本的流水灯程序,使用了51单片机的寄存器编程方法。
include "reg51.h"sbit p0=P1^0;sbit p1=P1^1;sbit p2=P1^2;sbit p3=P1^3;sbit p4=P1^4;sbit p5=P1^5;sbit p6=P1^6;sbit p7=P1^7;void mdelay(unsigned int t){unsigned char n;for(;t>0;t--)for(n=0;n<125;n++)void main()while(1)P1=0;p0=1;mdelay(1000);p0=0;p1=1;mdelay(1000);p1=0;p2=1;流水灯位左移在流水灯的基础上,我们可以通过左移位的方式来实现流水灯的效果。
void main()unsigned char led = 0x01.// 初始化led为xxxxxxxxwhile(1)P1 = ~led。
// 取反输出,因为我们的电路是低电平亮灯mdelay(1000);led <<= 1.// 左移一位if(led == 0) // 如果led变为0了,说明已经左移到最后一位了,需要重新开始led = 0x01;流水灯移位函数为了方便实现流水灯的位移,我们可以封装一个移位函数。
void shift_left(unsigned char *led。
unsigned char n)for(unsigned char i=0.i<n。
i++)led <<= 1;if(*led == 0)led = 0x01;void main()unsigned char led = 0x01;while(1)P1 = ~led;mdelay(1000);shift_left(&led。
按键控制流水灯程序
最近有很多学弟来问我流水灯该怎么做,程序怎么写,现在在这里统一说下,很多时候没有时间让你们白跑一趟了,O(∩_∩)O~。
首先就说到单片机了,单片机对于你们来说是个新概念,可能以前都没听说过。
我想说的是它不是传统意义上的集成电路,只能按照特定的焊接来能工作,而是一块类似电脑CPU的芯片,对于一块正常的单片机,只要你提供合适的工作电源(4V都5.5V左右)、复位电路、起振电路它就可以工作了。
所有的输入输出口(以P开头的)都是可以灵活配置的,可以根据你焊接的硬件电路写程序,也可以根据你写的程序焊接硬件电路。
所以没有必要死板硬套。
前天没事写了一下,仿真了一下还可以用。
源码贴于下方供入门者参考,高手勿嘲笑,大家都是从流水灯程序写起的 (*^__^*) 嘻嘻……再就是我的51开发板不知道是谁借走了,很久没有用过51单片机了,所以下载程序的事就不要来找我了。
我把编译过后的代码也贴在下面,如果硬件和我做的一样的同学又不会写程序的就直接复制下面编译过后的代码,在电脑上新建一个文本文档(.txt)命名任意,将复制后的代码粘贴于记事本上,然后重命名,将".txt"改为“.hex”,保存,然后通过下载器下载到单片机里面去就可以用了。
不会的多去看一下教程。
以下仅供参考,不得一味模仿/****************************************************************************** *********************************源码:51单片机晶振频率12Mhz八位数码管采用共阳极接法(所有阳极接一起接Vcc,阴极接P0口)按键分别接P2.0 P2.1 P2.2(低电平有效)编译软件采用keil 4******************************************************************************* ************************************************************************/#include <reg52.h>#define uint unsigned int#define uchar unsigned charsbit key1 =P2^0; //按键1sbit key2 =P2^1; //按键2sbit key3 =P2^2; //按键3uchar flag1=0,flag2=0,flag3=0;void delay_ms(uint z){uint i,j;for(i=0;i<z;i++)for(j=0;j<110;j++);}void O_to_E() //1,3,5,7与2,4,6,8交替闪烁{P0=0Xaa;delay_ms(200);P0=~0Xaa;delay_ms(200);}void key_scan() //键盘扫描{if(!key1){delay_ms(10); //延时消抖if(!key1)flag1=1;}if(!key2){delay_ms(10); //延时消抖if(!key2)flag2=1;}if(!key3){delay_ms(10); //延时消抖if(!key3)flag3=1;}}void main(){uchar i;while(1){key_scan();if(flag1) //按键一按下?{for(i=0;i<8;i++) //从左至右亮,每次一盏{P0=~(0x80>>i);delay_ms(100);key_scan(); //按键扫描if(flag2||flag3){flag1= 0;break;} //如果有其它按键按下响应其它按键}}if(flag2) //按键一按下?{for(i=0;i<8;i++) //从右至左亮,每次一盏{P0=~(0x01<<i);delay_ms(100);key_scan();if(flag1||flag3){flag2= 0;break;}}}if(flag3){O_to_E(); //奇偶交替闪烁key_scan();if(flag1||flag2)flag3=0;}}}/****************************************************************************** *****************************************编译过后的文件注意:复制下面的代码(注意不要包含本句,注意不要改变格式):09015700010800010900010A0081:040123007F0A7E00D1:10012700E4FDFCC3ED9FEC9E5015E4FBFA0BBB000E:0F013700010AEB646E4A70F50DBD00010C80E407:010*********:100147007580AA7FC87E0012012775805502012796:0A00F400F4F5807F647E00120127FE:1000FE0020A00912012320A00375080120A10912D6:10010E00012320A10375090120A20912012320A2B7:05011E0003750A012237:10008F001200FE1200FEE5086021E4F97480A80159:10009F00088002C313D8FC1200F4E5097004E50AC6:1000AF006005E4F508800409B908E1E509601FE47B:1000BF00F97401A801088002C333D8FC1200F4E5DB:1000CF00087004E50A6003E4F50909B908E3E50AD5:1000DF0060B11201471200FEE5087004E50960A344:0500EF00E4F50A809E0B:03000000020003F8:0C000300787FE4F6D8FD75810A02004AFF:10000F0002008FE493A3F8E493A34003F68001F278:10001F0008DFF48029E493A3F85407240CC8C333F2:10002F00C4540F4420C8834004F456800146F6DFC1:10003F00E4800B0102040810204080900157E47EF9:10004F00019360BCA3FF543F30E509541FFEE493B6:10005F00A360010ECF54C025E060A840B8E493A37D:10006F00FAE493A3F8E493A3C8C582C8CAC583CAA8:10007F00F0A3C8C582C8CAC583CADFE9DEE780BE60:010********E:00000001FF结束(注意不要包含本句及上面的※号,注意不要改变格式!)。
流水灯C语言程序
流水灯C语言程序流水灯是一种常见的电子显示效果,通常用于展示灯光的流动效果。
在C语言中,我们可以通过控制单片机的IO口来实现流水灯的效果。
以下是一个标准格式的C语言程序,用于实现流水灯效果。
```c#include <stdio.h>#include <stdlib.h>#include <unistd.h>#define LED_COUNT 8 // 流水灯的数量#define DELAY_MS 500 // 每一个灯亮起的延迟时间(毫秒)int main() {int leds[LED_COUNT] = {0}; // 存储每一个灯的状态,0表示灭,1表示亮 int i, j;while (1) {// 灯往右挪移for (i = LED_COUNT - 1; i > 0; i--) {leds[i] = leds[i - 1];}leds[0] = 1;// 输出灯的状态for (i = 0; i < LED_COUNT; i++) {if (leds[i]) {printf("*"); // 亮的灯用*表示} else {printf(" "); // 灭的灯用空格表示}}printf("\n");// 延迟一段时间usleep(DELAY_MS * 1000);// 清空屏幕system("clear");}return 0;}```上述程序使用了C语言的基本语法和系统函数,实现了一个简单的流水灯效果。
程序中的`LED_COUNT`表示流水灯的数量,可以根据实际需求进行调整。
`DELAY_MS`表示每一个灯亮起的延迟时间,单位为毫秒。
在程序的主循环中,通过不断改变灯的状态和输出屏幕,实现了流水灯的效果。
首先,灯往右挪移,即将前一个灯的状态赋值给后一个灯,最后一个灯的状态设置为亮。
几种流水灯程序
几种流水灯程序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.设置模式的流水灯程序:将流水灯程序改进,使得应用于不同的场景,可以调节闪烁模式,如快速,慢速,长亮等,其代码如下:。
流水灯程序 简单又详细
流水灯原理图
流水灯程序
其实流水灯程序就是你只要搞懂端口的高低电平是怎么一回事,置为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.欧姆的情况下个发光二极管的亮度。
(注:专业文档是经验性极强的领域,无法思考和涵盖全面,素材和资料部分来自网络,供参考。
可复制、编制,期待你的好评与关注)。
流水灯程序设计与调试.ppt
10
重点: 1、学习P1口既作为输入,又作为输出的使用方法。 2、学习数据输入、输出程序的设计方法。
11
二、任务分析
1、硬件分析
❖ P1口为准双向I/O接口,输出单条指令完成,输入时应当先 向对应的端口锁存器写入1,然后读入数据。
12
2、软件说明
➢ 有两个操作数,如MOV A,30H指令,操作数之间以逗号 相隔;
➢ 有3个操作数,如 CJNE A,#00H,10H指令。
❖ 注释:对指令的解释说明,用以提高程序的可读性,注释前 必须加分号,注释换行时行前也要加分号。
步骤4:现象无误,请求教师检查、评价。 步骤5:编制项目报告并提交。
18
➢分支程序的基本形式 分支程序有三种基本形式,如图2-1所示。 分支程序的设计要点如下:
❖先建立可供条件转移指令测试的条件。 ❖选用合适的条件转移指令。 ❖在转移的目的地址处设定标号。
19
条件满足? Y
A
(a)单分支
N
条件满足?
Single Chip Microcomputer
情
境
主要内容
1
➢流水灯程序设计与调试
彩
➢转弯灯程序设计与调试
灯
控
➢交通灯程序设计与调试
制
器
1
1.3.1 流水灯程序设计与调试
一、任务说明 1、要求 ❖ P1口作为输出口。P1.0至P1.7接8个发光二极管。要求编写
程序实现如下功能:8个发光二极管依次亮灭并循环,延时 0.1秒(已知fosc=12MHz)。 2、重点 1、学习P1口作为输出口的使用方法。 2、学习延时程序的设计方法。
ANL A,Rn ; A (A)∧Rn ANL A,@Ri ; A (A)∧(Ri) ANL A,#data ; A (A)∧#data ANL direct,A ;(direct) (direct)∧(A) ANL direct,#data ; (direct)(direct)∧#data 注意: 以上指令结果通常影响程序状态字寄存器PSW的P标志。 存储单元指定位清0的做法:按照需清0的位置填0,需保留的位置填1的原则构建 清0常数,然后利用ANL指令实现运算。 相近的指令:逻辑或指令ORL,逻辑异或指令XRL,清0指令CLR,取反指令CPL。 逻辑或可实现存储单元指定位置1,逻辑异或可实现存储单元指定位取反。
单片机-流水灯的程序
#include<reg51.h> sbit led1=P2^0; sbit led2=P2^1; sbit led3=P2^2; sbit led4=P2^3; sbit led5=P2^4; sbit led6=P2^5; sbit led7=P2^6; sbit led8=P2^7; void delay (unsigned char x);
其中void表示这 个函数执行完后 不返回任何数据。 ()内无任何东西, 所以这是个无参 数的函数。 Delayms是函数名。
1
2
3
4
5
6
2)带参数函数的用位定义实现流水灯(8位二极管循环点亮)
编程思路: a) 先点亮第一盏灯,延时点亮第二盏, 依次延时8盏灯全部点亮。 b) 当8盏灯全部点亮时,熄灭8盏灯。 c) 进入循环。
循环移动
循环左移 最高位移入最低位,其它依次向左移动一位。C语言中 没有专门的指令,通过移位指令和简单逻辑运算来实现循环左移,或直接利用C51库中自带的函数-crol-实现。
循环右移 最低位移入最高位,其它位依次向右移一位,C语言中没有专门的指令,通过移位指令与简单的逻辑运算可以实现循环右移,或专门利用C51库中自带函数-cror-实现
方法二:利用总线控制实现流水灯(8位二极管循环点亮)
相关知识 二进制和十六进制之间的相互转换
二进制
十六进制
二进制
十六进制
0000
0
0100
4
0001
1
0101
5
0010
2
0110
6
0011
3
0111
7
二进制
十六进制
二进制
五种编程方式实现流水灯的单片机C程序
五种编程方式实现流水灯的单片机C程序//功能:采用顺序结构实现的流水灯控制程序/*此方式中采用的是字操作(也称为总线操作)*/#include <reg51."h>void delay(unsigned char i);//延时函数声明void main()//主函数{while(1) {P1 = 0xfe;//点亮第1个发光二极管,0."000389sdelay(200);//延时P1 = 0xfd;//点亮第2个发光二极管,0."155403s,0."1558delay(200);//延时P1 = 0xfb;//点亮第3个发光二极管delay(200);//延时P1 = 0xf7;//点亮第4个发光二极管delay(200);//延时P1 = 0xef;//点亮第5个发光二极管delay(200);//延时P1 = 0xdf;//点亮第6个发光二极管delay(200);//延时P1 = 0xbf;//点亮第7个发光二极管delay(200);//延时P1 = 0x7f;//点亮第8个发光二极管delay(200);//延时}}//函数名:delay//函数功能:实现软件延时//形式参数:unsigned char i;//i控制空循环的外循环次数,共循环i*255次//返回值:无voiddelay(unsigned char i) //延时函数,无符号字符型变量i为形式参数{unsigned char j, k;//定义无符号字符型变量j和kfor(k = 0; k < i; k++)//双重for循环语句实现软件延时for(j = 0; j < 255; j++);}//功能:采用循环结构实现的流水灯控制程序//此方式中采用的移位,按位取反等操作是位操作#include <reg51."h>//包含头文件REG51."Hvoid delay(unsigned char i);//延时函数声明void main()//主函数{unsigned char i,w;while(1){w = 0x01;//信号灯显示字初值为01Hfor(i = 0; i < 8; i++){P1 = ~w;//显示字取反后,送P1口delay(200);//延时w <<= 1;//显示字左移一位}}}//函数名:delay//函数功能:实现软件延时//形式参数:unsigned char i;//i控制空循环的外循环次数,共循环i*255次//返回值:无voiddelay(unsigned char i) //延时函数,无符号字符型变量i为形式参数{unsigned char j,k;//定义无符号字符型变量j和kfor(k = 0; k < i; k++)//双重for循环语句实现软件延时for(j = 0; j < 255;j++);}/**************************************************************** *****///功能:采用位运算符编写的流水灯控制程序,显示效果为依次熄灭信号灯//此方式也是典型的顺序结构#include <reg51."h>void delay(unsigned char i);//延时函数声明void main()//主函数{while(1) {P1 = 0x00;//P1口全部清0,即点亮8个发光二极管delay(200);//延时P1 = P1 | 0x01;//熄灭第1个发光二极管delay(200);//延时P1 = P1 | 0x03;//熄灭第1、"2个发光二极管delay(200);//延时P1 = P1 | 0x07;//熄灭第1~3个发光二极管delay(200);//延时P1 = P1 | 0x0f;//熄灭第1~4个发光二极管delay(200);//延时P1 = P1 | 0x1f;//熄灭第1~5个发光二极管delay(200);//延时P1 = P1 | 0x3f;//熄灭第1~6个发光二极管delay(200);//延时P1 = P1 | 0x7f;//熄灭第1~7个发光二极管delay(200);//延时P1 = P1 | 0x7f;//熄灭所有发光二极管delay(200);//延时}}//函数名:delay//函数功能:实现软件延时//形式参数:unsigned char i;//i控制空循环的外循环次数,共循环i*255次//返回值:无voiddelay(unsigned char i) //延时函数,无符号字符型变量i为形式参数{unsigned char j, k;//定义无符号字符型变量j和kfor(k = 0; k < i; k++)//双重for循环语句实现软件延时for(j = 0; j < 255;j++);}/**********************************************************/ //功能:采用数组实现的流水灯控制程序//此方式也是典型的循环结构#include <reg51."h>//包含头文件REG51."Hvoid delay(unsigned char i);//延时函数声明void main()//主函数{unsigned char i;unsigned char display[] = {0xfe, 0xfd, 0xfb, 0xf7, 0xef, 0xdf, 0xbf, 0x7f};(1){for(i = 0; i < 8; i++){P1 = display[i];//显示字送P1口delay(200);//延时}}}//函数名:delay//函数功能:实现软件延时//形式参数:unsigned char i;//i控制空循环的外循环次数,共循环i*255次//返回值:无voiddelay(unsigned char i) //延时函数,无符号字符型变量i为形式参数{unsigned char j, k;//定义无符号字符型变量j和kfor(k = 0; k < i; k++)//双重for循环语句实现软件延时for(j = 0; j < 255; j++);}#include<reg52."h>#include <intrins.h>#define uint unsigned int#define uchar unsigned charvoid delay(uint z){uint x, y;for(x = z; x > 0; x--)for(y = 110; y > 0; y--);}void main(){uchar a, i, j;(1){for(j = 0; j<2; j++){a = 0xfe; for(i = 0; i<8; i++){P2 = a;delay(200);a = _crol_(a, 1); //11110}a = 0x7f; for(i = 0; i < 8; i++){P2 = a;delay(200);a = _cror_(a, 1);}}P2 = 0xff;for(j = 0; j < 10; j++)}}{}delay(300);P2 = ~P2;。
基本操作与流水灯
基本操作与流水灯基本操作是指对于特定设备或系统所需的最常见、必要的操作步骤。
在该主题下,我将以流水灯为例,详细介绍流水灯的基本操作。
流水灯是一种常见的电子实验器材,它通过一系列的LED灯组成,能够实现灯光顺序逐个闪烁的效果。
下面是使用流水灯的基本操作步骤:1.准备工作:首先,确保你已经了解并准备好所需的材料和工具。
通常,这包括流水灯电路板、LED灯、电阻、导线、电池等。
另外,你还需要一副焊接工具和计算机等设备。
2.接线:将流水灯电路板与其他组件连接起来。
首先,插入相应的LED灯和电阻到电路板上。
然后,使用导线将这些组件连接起来,在电路板上形成电路网络。
确保每个连接都牢固可靠,避免短路。
3.焊接:利用焊接工具将连接的导线和组件进行固定。
通过焊接,可以防止连接松动或接触不良的情况发生。
在焊接过程中,确保焊接点光洁且没有冷焊现象。
4.供电:将电池或其他电源连接到电路板上,为流水灯提供供电。
确保电路板上的电源接头正确连接,并在连接之前检查电源的电压和电流是否适配。
5.调试:在连接好电源后,观察流水灯是否正常工作。
如果发现灯不亮、亮度不均或灯光顺序错乱等问题,需要检查和调试整个电路。
可通过测量电流和电压、调整电阻、更换不良的灯等方法解决问题。
6.控制:如果你想对流水灯的闪烁方式进行调整,你可以添加一些控制电路。
例如,可以通过加入可调电阻或集成电路等方式来改变流水灯的亮度、频率或顺序等。
7.扩展:流水灯的操作可以进一步扩展,比如添加更多的灯、使用更复杂的编程控制、设计个性化的灯光效果等。
这需要一些专业的电子知识和技能,可以根据个人需求和能力进行扩展。
最后,使用流水灯时要注意安全。
避免触摸裸露的导线和元器件,以免触电或烧毁电路。
在操作过程中,确保周围环境通风良好,避免因长时间工作产生过热导致损坏。
严禁在高压下操作或使用不符合要求的电源。
总之,流水灯的基本操作包括准备工作、接线、焊接、供电、调试、控制和扩展等步骤。
(完整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逐一进行识别。
可控流水灯
使用汇编语言编写程序,设计一个用8051单片机控制的循环彩灯控制系统要求:1、能输出4种花型,并能由人工进行花型的切换。
可以使用按键,也可以使用拨动开关来实现切换,方法不限。
2、循环彩灯的循环速度可调。
3、按键要求:(1)启动/暂停。
按动一次启动,再按一次暂停。
是一个双态转换键。
(2)花型变化。
按一次,立即停止当前花型的显示,转换为下一种花型。
4种花型可以循环切换。
(3)速度+。
按键一次,速度略加快一点。
(4)速度-。
按键一次,速度略减慢一点。
4、在LED显示器上显示相应的花型号。
悬赏分:30 - 离问题结束还有14 天21 小时;==============================================================上次编写了一个“键控流水灯”,后来不断有网友来电,希望再编写些其它花样的。
做而论道也有了一些设想,正巧有这位网友提出的要求,和做而论道的构思暗合,故此连夜调出个程序,也算是答题吧。
用PROTEUS仿真的画面如下:图片链接:/%D7%F6%B6%F8%C2%DB%B5%C0/album/item/91d1fff221a004f50b46e0ef.html ;---------------------------------------------------控制程序如下:ORG 0000HJMP STARTORG 0003HJMP X0_INTORG 000BHJMP T0_INTORG 0013HJMP X1_INT;---------------------------------START:MOV TMOD, #51H ;/*01010001 T1计数,T0定时*/MOV TH0, #HIGH(65536 - 50000) ;50ms@12MHzMOV TL0, #LOW (65536 - 50000)MOV TH1, #0MOV TL1, #0SETB TR0SETB TR1SETB IT0SETB IT1MOV IE, #10000111BMOV IP, #00000101BMOV R7, #20MOV 30H, #20MOV 31H, #0MOV 32H, #0MOV P2, 31HINC P2SJMP $;---------------------------------T0_INT: ;50ms执行一次MOV TL0, #LOW (65536 - 50000) ;重新写入初始值MOV TH0, #HIGH(65536 - 50000) ;50ms@12MHz ;------------------JIA:JB P3.0, JIANDEC 30H ;加速MOV A, 30HJNZ XXX ;不能让它为0INC 30HXXX:; JNB P3.0, $;------------------JIAN:JB P3.1, XIANSHIINC 30HMOV A, 30HSUBB A, #80JC CCCMOV 30H, #80 CCC:; JNB P3.1, $;------------------ XIANSHI:DJNZ R7, T0_ENDMOV R7, 30HINC 32HANL 32H, #7;------------------MOV A, 31HANL A, #3RL ARL ARL AADD A, 32HMOV DPTR, #HUA_YMOVC A, @A+DPTRCPL AMOV P1, A;------------------T0_END:RETI;--------------------------------- X0_INT: ;设置花型INC 31HANL 31H, #3MOV P2, 31HINC P2RETI;--------------------------------- X1_INT: ;启动/停止CPL TR0RETI;---------------------------------HUA_Y:DB 0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01 DB 0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80 DB 0x81,0x42,0x24,0x18,0x81,0x42,0x24,0x18 DB 0x18,0x24,0x42,0x81,0x18,0x24,0x42,0x81 END。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
手动可调变速的流水灯程序
/*********** 2011.7 JQ--V0.1 宏晶公司STC 单片机开发板
************$ 程序作用:手动可调变速的流水灯的效果
$ 程序作者: JQ(QQ:489555226 Email:489555226@qq)
$ 程序版本: JQ--V0.1
$ 编制日期: 2011-07-01
$ 编译器:Keil C uVision2
$ 所用芯片:STC89C52,11.0592M 晶振
$ 程序开发板:JQ--V0.1 版本
$ 程序通俗易懂注释详细结构化模块是51 单片机初学爱好者的理想选择
******************** JQ--V0.1 宏晶公司STC 单片机开发板
**********************/
#include //52 单片机头文件定义
#define uchar unsigned char //数据类型uchar 的宏定义#define uint unsigned int //数据类型uint 的宏定义
#define led P0 //P0 口宏定义void init();uchar count,speed,num; //全局变量定义sbit key =P3 ;
void delay(uint k);
uchar code huayang[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,};//0xbf,0xdf,0xef,0xf7,0xfb,0x fd,0xfe,0x00,0xaa,0x55,0xaa,0x55,0xaa,0x55,0xaa,0x55,0x55,0x55,0x00}; //花样跑马灯数组定义随便改变数组里面的值就可以改变花样(该数组有27 个数值)
void main(void) //主函数{uchar i;init();while(1) //while 死循环{ for(i=0;ivoid init()。