流水灯程序
(完整版)51单片机流水灯程序
1.第一个发光管以间隔200ms 闪烁。
2.8 个发光管由上至下间隔1s 流动,其中每个管亮500ms, 灭500ms 。
3.8 个发光管来回流动,第个管亮100ms 。
4.用8 个发光管演示出8 位二进制数累加过程。
5.8 个发光管间隔200ms 由上至下,再由下至上,再重复一次,然后全部熄灭再以300ms 间隔全部闪烁 5 次。
重复此过程。
6.间隔300ms 第一次一个管亮流动一次,第二次两个管亮流动,依次到8 个管亮,然后重复整个过程。
7.间隔300ms 先奇数亮再偶数亮,循环三次;一个灯上下循环三次;两个分别从两边往中间流动三次;再从中间往两边流动三次;8 个全部闪烁 3 次;关闭发光管,程序停止。
1#include<reg52.h>#define uint unsigned intsbit led 仁P"0;void delay();void main(){while(1){led1=0;delay();led1=1;delay();}}void delay(){uint x,y;for(x=200;x>0;x--) for(y=100;y>0;y--);}#include<reg52.h> #include<intrins.h> #define uint unsigned int #define uchar unsigned char sbit p P1A0; uchar a;void delay(); void main() {a=0xfe;P1=a;while(1){ a=_crol_(a,1); delay();P1=a; delay();}}void delay(){uint b; for(b=55000;b>0;b--);}3#include<reg52.h>#include <intrins.h>#define uint unsigned int #define uchar unsigned char void delay() {uint x,y; for(x=100;x>0;x--) for(y=110;y>0;y--);}void main() {uchar a,i;while(1)a=0xfe; for(i=0;i<8;i++){P1=a; delay(100); a=_crol_(a,1);}a=0x7f; for(i=0;i<8;i++){P1=a; delay(100); a=_cror_(a,1);4#include<reg52.h>#include <intrins.h> #define uint unsigned int #define uchar unsigned char void delay(uint a) { uint x,y; for(x=a;x>0;x--) for(y=110;y>0;y--);}void main() {uchar b;while(1){b++;P1=~b; delay(200);5#include<reg52.h>#include <intrins.h> #define uint unsigned int #define uchar unsigned char void main() { uchar a,i,j;while(1){ for(j=0;j<2;j++){a=0xfe; for(i=0;i<8;i++){P1=a;delay(200); a=_crol_(a,1);}a=0x7f; for(i=0;i<8;i++){P1=a; delay(200); a=_cror_(a,1);}}P1=0xff; for(j=0;j<10;j++) {delay(300);P1=~P1;}}}void delay(){uint x,y; for(x=200;x>0;x--) for(y=110;y>0;y--); 6 #include<reg52.h> #include <intrins.h> #define uint unsigned int #define uchar unsigned char void delay(){uint x,y; for(x=300;x>0;x--) for(y=110;y>0;y--);} void main(){uchar a,i,j; while(1) {a=0xfe; for(j=0;j<8;j++) { for(i=0;i<8-j;i++) {P1=a; delay(200); a=_crol_(a,1);} a=_crol_(a,j); P1=0xff; a=a<<1;}} }7#include<reg52.h> #include <intrins.h> #define uint unsigned int #define uchar unsigned char void delay(uint z){uint x,y; for(x=z;x>0;x--)for(y=110;y>0;y--);}void main(){uchar a,i,j;for(j=0;j<3;j++){P1=0x55;delay(300);P1=0xaa; delay(300);}for(j=0;j<3;j++){a=0xfe;for(i=0;i<8;i++){P1=a;delay(300); a=_crol_(a,1);}}P1=0xff; for(j=0;j<3;j++){P1=0x7e;delay(300);P1=0xbd; delay(300);P1=0xdb; delay(300);P1=0xe7; delay(300);}P1=0xff;for(j=0;j<3;j++){P1=0xe7;delay(300);P1=0xdb;delay(300);P1=0xbd;delay(300);P1=0x7e;delay(300);}P1=0xff; for(j=0;j<6;j++) {P1=~P1; delay(300);}P1=0xff;while(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 ;设置堆栈起始地址为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端口的每个位来实现的,因此程序显得有点复杂,下面我们利用循环移位指令,采用循环程序结构进行编程。
五种编程方式实现流水灯的单片机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.中断编程方式:中断编程方式是一种基于中断事件的编程方式,通过在特定的中断事件触发时改变灯光状态来实现流水灯效果。
8个流水灯程序
i = 10000; // SW Delay
do i--;
while(i != 0);
break;
}
}
P2DIR=BIT0;//P1.0显示按键起作用
P2OUT=BIT0+BIT3;//P2IN低电平跳转
P2REN=BIT3;//上拉电阻,缺了好像不能用
while(i != 0);
P1OUT ^= 0X20; // Toggle P1.5 using exclusive-OR
i = 10000; // SW Delay
do i--;
while(i != 0);
break;
}
}
while(i != 0);
P1OUT ^= 0X04; // Toggle P1.2 using exclusive-OR
i = 10000; // SW Delay
do i--;
while(i != 0);
P1OUT ^= 0X08; // Toggle P1.3 using exclusive-OR
while(i != 0);
P1OUT ^= 0X04; // Toggle P1.2 using exclusive-OR
i = 10000; // SW Delay
do i--;
while(i != 0);
break;
}
}
{
P1DIR |= 0X01; // Set P1.0 to output direction
P1DIR |= 0X02;
P1DIR |= 0X04;
P1DIR |= 0X08;
P1DIR |= 0X10;
流水灯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.欧姆的情况下个发光二极管的亮度。
(注:专业文档是经验性极强的领域,无法思考和涵盖全面,素材和资料部分来自网络,供参考。
可复制、编制,期待你的好评与关注)。
单片机流水灯c语言实现
//------------------------------------------------
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
uchar code DSY_CODE []=
red_a=1;yellow_a=1;green_a=0;
red_b=0;yellow_b=1;green_b=1;
delayMs(2000);
Operation_Type=2;
break;
case 2://东西向黄灯开始闪烁,绿灯关闭
delayMs(300);
yellow_a=!yellow_a; green_a=1;
while(x--)
{
for(i=0;i<120;i++);
}
}
//---------------------------------------------
//交通灯切换子程序
void Traffic_Light()
{
switch (Operation_Type)
{
case 1://东西向绿灯亮与南北向红灯亮
{
uchar i;
P2=0x01;//P2端口初始化
while(1)//死循环
{
for(i=0;i<7;i++)//i自加1,当i=7时执行第二个for语句
{
P2=_crol_(P2,1);//P2端口循环左移1位
delayMs(150);
}
for(i=0;i<7;i++)
51流水灯程序-
1.第一个发光管以间隔200ms闪烁2.8个发光管由上至下间隔1s流动,其中每个管亮500ms,灭500ms,亮时蜂鸣器响,灭时关闭蜂鸣器,一直重复下去。
3.8个发光管来回流动,第个管亮100ms,流动时让蜂鸣器发出“滴滴”声。
4.用8个发光管演示出8位二进制数累加过程。
5.8个发光管间隔200ms由上至下,再由下至上,再重复一次,然后全部熄灭再以300ms间隔全部闪烁5次。
重复此过程。
6.间隔300ms第一次一个管亮流动一次,第二次两个管亮流动,依次到8个管亮,然后重复整个过程。
7.间隔300ms先奇数亮再偶数亮,循环三次;一个灯上下循环三次;两个分别从两边往中间流动三次;再从中间往两边流动三次;8个全部闪烁3次;关闭发光管,程序停止。
#include<reg52.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned intuchar temp,a;uint i,j;sbit beep=P2^3;void delay(int);void main(){while(1){for(i=0;i<10;i++){P1=0xfe;delay(150);P1=0xff;delay(150);}temp=0xfe;for(i=0;i<16;i++){P1=temp;beep=0;delay(380);P1=0xff;temp=_crol_(temp,1);beep=1;delay(380);}for(j=0;j<2;j++){temp=0xfe;for(i=0;i<8;i++){P1=temp;beep=0;delay(80);temp=_crol_(temp,1);P1=0xff;beep=1;delay(80);}temp=0xbf;for(i=0;i<7;i++){P1=temp;beep=0;delay(80);temp=_cror_(temp,1);P1=0xff;beep=1;delay(80);}}a=0x00;for(i=0;i<256;i++){P1=~a;a++;delay(500);}for(i=0;i<2;i++){temp=0xfe;for(i=0;i<8;i++){P1=temp;delay(150);temp=_crol_(temp,1);P1=0xff;delay(150);}temp=0xbf;for(i=0;i<7;i++){P1=temp;delay(150);temp=_cror_(temp,1);P1=0xff;delay(150);}}P1=0xff;for(i=0;i<10;i++){P1=~P1;delay(170);}temp=0xfe;j=0;for(i=0;i<8;i++){j++;P1=temp;delay(150);temp=_crol_(temp,a);P1=0xff;delay(150);}temp=0xfe; //赋初值for(j=0;j<8;j++){for(i=0;i<8-j;i++) //左移{P1=temp; //点亮小灯delay(150); //延时200毫秒temp=_crol_(temp,1); //将a变量循环左移一位}temp=_crol_(temp,j); //补齐,方便下面的左移一位P1=0xff; //全部关闭temp=temp<<1; //左移一位让多一个灯点亮}for(i=0;i<3;i++){P1=0xaa; //10101010delay(150);P1=~P1;delay(150);}for(j=0;j<3;j++){temp=0xfe;for(i=0;i<8;i++){P1=temp;delay(100);temp=_crol_(temp,1);}temp=0xbf;for(i=0;i<7;i++){P1=temp;delay(100);temp=_cror_(temp,1);}}for(j=0;j<3;j++){temp=0xfe;a=0x7f;for(i=0;i<5;i++){P1=temp&a;delay(100);temp=_crol_(temp,1); a=_cror_(a,1);}}for(j=0;j<3;j++){temp=0xef;a=0xf7;for(i=0;i<5;i++){P1=temp&a;delay(100);temp=_crol_(temp,1); a=_cror_(a,1);}}for(j=0;j<3;j++) {P1=0x00;delay(380);P1=0xff;delay(380);}}}void delay(int z){int x,y;for(x=100;x>0;x--)for(y=z;y>0;y--);}。
LED流水灯设计
LED流水灯设计流水灯(also known as running lights)是一种常见的LED灯设计,它由一系列LED灯组成,可以连续地亮起和熄灭,就像水流般流动。
流水灯设计常见于节日装饰、舞台演出和彩灯效果等场合,具有独特的美观效果。
下面将介绍流水灯的原理、设计步骤以及相关应用。
一、流水灯原理流水灯的原理基于LED灯的亮灭控制和串并联电路的设计。
LED灯的亮灭控制是通过直流电源及驱动电路实现的,而流水灯的流动效果则是通过不同的亮灭顺序实现的。
具体原理如下:1.LED灯亮灭控制:LED灯是一种直流电源下的电子元件,在正向电流的作用下,LED灯发光;而在反向电流下,LED灯熄灭。
通过控制LED灯的电流流向,可以实现其亮灭控制。
2.串并联电路:将多个LED灯连接在一起时,可以采用串联或并联的方式。
串联时,LED灯依次连接在电路中,电流在各个LED灯之间流动;并联时,LED灯同时连接在电路中,电流在各个LED灯之间分流。
流水灯设计通常采用串联电路,通过控制电流流向的方式,实现LED灯的亮灭顺序。
二、设计步骤流水灯的设计步骤包括电路设计和程序编写两个方面。
具体步骤如下:1.电路设计:首先确定流水灯的LED灯数量和排列方式,然后根据输入电压和LED灯额定电压选择适当的电阻,用于限流并防止过电流。
接下来,根据串联电路的特性,设计LED灯的串联方式和连接顺序。
最后,根据电路设计,连接LED灯和电阻。
2. 程序编写:使用相应的开发工具,编写控制LED灯亮灭顺序的程序。
程序可以通过控制IO口电平的高低实现LED灯的亮灭控制。
流水灯设计中常用的控制方式有定时控制和状态机控制。
定时控制是通过设定每个LED灯的亮灭时间来实现,例如每隔100ms亮灭一个LED灯;状态机控制是通过设置多个状态,根据当前状态判断下一个LED灯的亮灭顺序。
三、相关应用流水灯设计在日常生活和各种场合都有广泛的应用1.节日装饰:流水灯常用于节日装饰,如圣诞节、新年等,给人们带来欢乐和节日气氛。
51流水灯程序,
1.第一个发光管以间隔200ms闪烁2.8个发光管由上至下间隔1s流动,其中每个管亮500ms,灭500ms,亮时蜂鸣器响,灭时关闭蜂鸣器,一直重复下去。
3.8个发光管来回流动,第个管亮100ms,流动时让蜂鸣器发出“滴滴”声。
4.用8个发光管演示出8位二进制数累加过程。
5.8个发光管间隔200ms由上至下,再由下至上,再重复一次,然后全部熄灭再以300ms间隔全部闪烁5次。
重复此过程。
6.间隔300ms第一次一个管亮流动一次,第二次两个管亮流动,依次到8个管亮,然后重复整个过程。
7.间隔300ms先奇数亮再偶数亮,循环三次;一个灯上下循环三次;两个分别从两边往中间流动三次;再从中间往两边流动三次;8个全部闪烁3次;关闭发光管,程序停止。
#include<>#include<>#define uchar unsigned char#define uint unsigned intuchar temp,a;uint i,j;sbit beep=P2^3;void delay(int);void main(){while(1){for(i=0;i<10;i++){P1=0xfe;delay(150);P1=0xff;delay(150);}temp=0xfe;for(i=0;i<16;i++){P1=temp;beep=0;delay(380);P1=0xff;temp=_crol_(temp,1);beep=1;delay(380);}for(j=0;j<2;j++){temp=0xfe;for(i=0;i<8;i++){P1=temp;beep=0;delay(80);temp=_crol_(temp,1);P1=0xff;beep=1;delay(80);}temp=0xbf;for(i=0;i<7;i++){P1=temp;beep=0;delay(80);temp=_cror_(temp,1);P1=0xff;beep=1;delay(80);}}a=0x00;for(i=0;i<256;i++){P1=~a;a++;delay(500);}for(i=0;i<2;i++){temp=0xfe;for(i=0;i<8;i++){P1=temp;delay(150);temp=_crol_(temp,1);P1=0xff;delay(150);}temp=0xbf;for(i=0;i<7;i++){P1=temp;delay(150);temp=_cror_(temp,1);P1=0xff;delay(150);}}P1=0xff;for(i=0;i<10;i++){P1=~P1;delay(170);}temp=0xfe;j=0;for(i=0;i<8;i++){j++;P1=temp;delay(150);temp=_crol_(temp,a);P1=0xff;delay(150);}temp=0xfe; //赋初值for(j=0;j<8;j++){for(i=0;i<8-j;i++) //左移{P1=temp; //点亮小灯delay(150); //延时200毫秒temp=_crol_(temp,1); //将a变量循环左移一位}temp=_crol_(temp,j); //补齐,方便下面的左移一位P1=0xff; //全部关闭temp=temp<<1; //左移一位让多一个灯点亮}for(i=0;i<3;i++){P1=0xaa; //delay(150);P1=~P1;delay(150);}for(j=0;j<3;j++){temp=0xfe;for(i=0;i<8;i++){P1=temp;delay(100);temp=_crol_(temp,1);}temp=0xbf;for(i=0;i<7;i++){P1=temp;delay(100);temp=_cror_(temp,1);}}for(j=0;j<3;j++){temp=0xfe;a=0x7f;for(i=0;i<5;i++){P1=temp&a;delay(100);temp=_crol_(temp,1);a=_cror_(a,1);}}for(j=0;j<3;j++){temp=0xef;a=0xf7;for(i=0;i<5;i++){P1=temp&a;delay(100);temp=_crol_(temp,1);a=_cror_(a,1);}}for(j=0;j<3;j++){P1=0x00;delay(380);P1=0xff;delay(380);}}}void delay(int z){int x,y;for(x=100;x>0;x--)for(y=z;y>0;y--);}。
C51单片机(32路流水灯C语言程序)
C51单片机(32路流水灯C语言程序)#include <reg52.h>void delay(int t){ //时间延迟子函数unsigned int i,j;for(j=0;j<30;j++)for(i=0;i<t;i++);}void putOne(int n,char a){ //定义变量函数unsigned int m = n%8, k = n/8, b;if(k==0) b=P0; if(k==1) b=P1; if(k==2) b=P2; if(k==3) b=P3; if(a) b = b & (~(1<<m));else b = b | (1<<m) ;if(k==0) P0=b; if(k==1) P1=b; if(k==2) P2=b; if(k==3) P3=b; }void liu(int n1,int n2){ //流水灯子程序int i;for(i=n1; i<=n2; i++ ) {putOne(i,1);delay(2000);putOne(i,0);}}main(){ //流水灯主程序while(1){P0 = P1 = P2 =P3 = 0;liu(0, 31 ); putOne(31,1);liu(0, 30 ); putOne(30,1);liu(0, 29 ); putOne(29,1);liu(0, 28 ); putOne(28,1);liu(0, 27 ); putOne(27,1);liu(0, 26 ); putOne(26,1);liu(0, 25 ); putOne(25, 1);liu(0, 24 ); putOne(24,1);liu(0, 23 ); putOne(23,1);liu(0, 22 ); putOne(22,1);liu(0, 21 ); putOne(21,1);liu(0, 20 ); putOne(20,1);liu(0, 19 ); putOne(19,1);liu(0, 18 ); putOne(18, 1);liu(0, 17 ); putOne(17,1);liu(0, 16 ); putOne(16,1);liu(0, 15 ); putOne(15,1);liu(0,14 ); putOne(14,1);liu(0, 13 ); putOne(13,1);liu(0, 12 ); putOne(12,1);liu(0, 11 ); putOne(11, 1);liu(0, 10 ); putOne(10,1);liu(0, 9 ); putOne(9,1);liu(0, 8 ); putOne(8,1);liu(0, 7 ); putOne(7,1);liu(0, 6 ); putOne(6,1);liu(0, 5 ); putOne(5,1);liu(0, 4 ); putOne(4, 1);liu(0, 3 ); putOne(3,1);liu(0, 2 ); putOne(2,1);liu(0, 1 ); putOne(1,1);liu(0, 0 ); putOne(0,1);P0 = P1 = P2 =P3 =0; delay(2000);P0 = P1 = P2 =P3 =255; delay(2000); P0 = P1 = P2 =P3 =0; delay(2000);}如主函数改成:main() //流水灯主程序{unsigned int k;while(1){P0 = P1 = P2 =P3 = 0;for(k=31;k>-1;k--){liu(0, k); putOne(k,1);}P0 = P1 = P2 =P3 =0; delay(2000);P0 = P1 = P2 =P3 =255; delay(2000);P0 = P1 = P2 =P3 =0; delay(2000);}}这样就可以代替你的主程序了/local/changchun/huochezhan-sq-jiudian-tg?sp=1。
各种流水灯程序
while(1)
{
D1=0;
a=25000;
while(--a);
D1=1;
a=25000;
while(--a);
}
}
Lesson2.2: 8个发光管由上至下间隔1s流动,其中每个管亮500ms,灭500ms,亮时蜂鸣器响,灭时关闭蜂鸣器,一直重复下去。
#include<reg52.h>
{
P1=0x00;
delay(300);
P1=0xff;
delay(300);
}
P1=0xff;
while(1);
}
#include<reg52.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit beep=P2^3;
uchar temp;
int i,j=3;
void delay(uint z)
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
void delay(uint);
uchar temp;
sbit beep=P2^3;
void main()
{
temp=0xfe;
beep=1;
P1=temp;
delay(500);
temp=_cror_(temp,1);
流水灯(汇编+c)
流水灯实验(C语言和汇编)程序A:(汇编)ORG 0000HSTART:MOV P1,#01111111B ;最下面的LED点亮LCALL DELAYMOV P1,#10111111B ;最下面第二个的LED点亮LCALL DELAYMOV P1,#11011111B ;最下面第三个的LED点亮(以下省略)LCALL DELAYMOV P1,#11101111BLCALL DELAYMOV P1,#11110111BLCALL DELAYMOV P1,#11111011BLCALL DELAYMOV P1,#11111101BLCALL DELAYMOV P1,#11111110BLCALL DELAYMOV P1,#11111111B ;完成第一次循环点亮,延时约0.25秒AJMP START ;反复循环;延时子程序,12M晶振延时约250毫秒DELAY:MOV R4,#2L3: MOV R2 ,#250L1: MOV R3 ,#250L2: DJNZ R3 ,L2DJNZ R2 ,L1DJNZ R4 ,L3RETEND程序B:(汇编)org 00h ;程序上电从00h开始ajmp main ;跳转到主程序org 0030h ;主程序起始地址main:mov a,#0feh ;给A赋值成11111110loop:mov p1,a ;将A送到P1口,发光二极管低电平点亮lcall delay ;调用延时子程序rl a ;累加器A循环左移一位ajmp loop ;重新送P1显示delay:mov r3,#20 ;最外层循环二十次d1:mov r4,#80 ;次外层循环八十次d2:mov r5,#250 ;最内层循环250次djnz r5,$ ;总共延时2us*250*80*20=0.8Sdjnz r4,d2djnz r3,d1retend程序C:(C语言)#include<reg51.h>#include <intrins.h>void delayms(unsigned char ms) // 延时子程序{unsigned char i;while(ms--){for(i = 0; i < 120; i++);}}main(){unsigned char LED;LED = 0xfe;P1 = LED;while(1){delayms(200);LED = LED>>1; //循环右移1位,点亮下一个LEDP1 = LED;}}[本站(中国单片机网),摘自/jiaocheng/yuanchuang/2006 07/1235.html]。
单片机-流水灯的程序
void main() {
Led = 0xfe; while(1) { P2 = Led;
for(i=1;i<800;i++) for(j=1;j<800;j++); Led = Led << 1; if(P2 == 0x00 ) {Led = 0xfe; } } }
方法四:利用移位操作实现流水灯(8位二极管循环点亮)
假设机器字长为8位,变量a的值为16,将a左移二位,即 a=a<<2: 左移前 0001 0000
左移后 0100 0000
由此看出,左移一位相当于该数乘2,左移二位相当于乘4 ,即22,但这要以该数左移之后不“溢出”为前提。所谓“溢出 ”指该数已超过机器字长所能容纳的范围,如该例若继续左移二 位,该数为16× 24=256,超出了字长8位的表示范围(257),
void main() { while(1) {
led1=0; delay(120);
led2=0; delay(120);
led3=0; delay(120);
led4=0; delay(120);
led5=0 ; delay(120);
led6=0; delay(120);
led7=0; delay(120);
即产生了溢出。
二、按位右移
按位右移是将一个运算量的各位依次右移若干位, 低位被移出,高位对无符号数补0,对有符号数要按最 高符号位自身填补。
右移一位相当于该数除以2,但有可能带来误差。假设机器 字长为8位,变量a值为15,将a右移二位,即a=a>>2:
右移前 0000 1111
右移后 0000 0011
单片机-流水灯的程序
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#include<reg52.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
uchar temp,num,temp1;
void delay(uint);
void DelayMs(unsigned char t);
void DelayUs2x(unsigned char t);
sbit buzzy=P2^0;
sbit key=P2^1;
int catch=0;
unsigned char code seg[]={0x7f,0xbf,0xdf,0xef,
0xf7,0xfb,0xfd,0xfe,
0xff,0xff,0x00,0x00,
0x55,0x55,0xaa,0xaa
};
//crol 左cror 右
void main()
{
int i;
buzzy=1;
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
temp=0xfe;
temp1=0x7f;
while(1)
{
switch(catch)
{
case 0: {
for(num=0;num<8;num++)
{
P1=temp;
P0=temp1;
delay(150);
temp=_crol_(temp,1);
temp1=_cror_(temp1,1);
}
}break;
case 1: {
for(num=0;num<8;num++)
{
P1=temp1;
P0=temp;
delay(150);
temp=_crol_(temp,1);
temp1=_cror_(temp1,1);
}
}break;
case 2: {
temp=0xfc;
P1=temp;
P0=temp;
for(i=0;i<7;i++) //加入for循环,表明for循环大括号
//中的程序循环执行7次
{
delay(150); //调用延时程序;更改延时数字可
//以更改延时长度;用于改变闪烁频率
temp<<=1;
temp=temp|0x01; //也可以直接把temp换成P1
P1=temp; //之所以加入temp做中间变量,转换
P0=temp; //完成后直接赋值到端口,防止直接
//操作端口造成的短暂闪烁
}
temp=0x3f;
P1=temp;
P0=temp;
for(i=0;i<7;i++) //加入for循环,表明for循环大括号
//中的程序循环执行7次
{
delay(150); //调用延时程序;更改延时数字可以
//更改延时长度;用于改变闪烁频率
temp>>=1;
temp|=0x80; //等效于temp=temp|0x80
P1=temp;
P0=temp;
}
for(i=0;i<3;i++) //加入for循环,表明for循环大括号
//中的程序循环执行3次
P1=0xff;
P0=0xff;
delay(150);
P1=0x00;
P0=0x00;
delay(150);
}
}break;
case 3: {
temp=0xfc;
temp1=0x3f;
P1=temp;
P0=temp1;
for(i=0;i<7;i++) //加入for循环,表明for循环大括号
//中的程序循环执行7次
{
delay(150); //调用延时程序;更改延时数字可
//以更改延时长度;用于改变闪烁频率
temp<<=1;
temp=temp|0x01; //也可以直接把temp换成P1
temp1>>=1;
temp1|=0x80;
P1=temp; //之所以加入temp做中间变量,转换
P0=temp1; //完成后直接赋值到端口,防止直接
//操作端口造成的短暂闪烁
}
temp=0x3f;
temp1=0xfc;
P1=temp;
P0=temp1;
for(i=0;i<7;i++) //加入for循环,表明for循环大括号
//中的程序循环执行7次
{
delay(150); //调用延时程序;更改延时数字可以
//更改延时长度;用于改变闪烁频率
temp>>=1;
temp|=0x80; //等效于temp=temp|0x80
temp1<<=1;
temp1=temp1|0x01;
P1=temp;
P0=temp1;
for(i=0;i<3;i++) //加入for循环,表明for循环大括号
//中的程序循环执行3次
{
P1=0xff;
P0=0xff;
delay(150);
P1=0x00;
P0=0x00;
delay(150);
}
}break;
case 4: {
P1=0xFE; //第1个LED亮
P0=0XFE;
for(i=0;i<8;i++)
{
delay(150);
P1 <<=1;
P0 <<=1;
}
P1=0x7F; //第8个LED亮
P0=0x7F;
for(i=0;i<8;i++)
{
delay(150);
P1 >>=1;
P0 >>=1;
}
P1=0xFE; //第1个LED亮
P0=0xFE;
for(i=0;i<8;i++)
{
delay(150);
P1 <<=1;
P0 <<=1;
P1 |=0x01;
P0 |=0x01;
}
P1=0x7F; //第8个LED亮
P0=0x7F;
for(i=0;i<8;i++)
{
delay(150);
P1 >>=1;
P0 >>=1;
P1 |=0x80;
P0 |=0x80;
}
//下面通过查表方法获得花样参数
for(i=0;i<16;i++)//查表可以简单的显示各种花样实用性更强
{
delay(150);
P1=seg[i];
P0=seg[i];
}
}break;
}
}
}
void timer0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
if(!key) //如果检测到低电平,说明按键按下
{
DelayMs(10); //延时去抖,一般10-20ms
if(!key) //再次确认按键是否按下,没有按下则退出
{
while(!key)//如果确认按下按键等待按键释放,没有释放则一直等待
buzzy=0;
catch++;
if(catch==5)
catch=0;
}
}
else
buzzy=1;
}
void delay(uint z)
{
uint i,j;
for(i=z;i>0;i--)
for(j=110;j>0;j--);
}
void DelayUs2x(unsigned char t) {
while(--t);
}
void DelayMs(unsigned char t) {
while(t--)
{
//大致延时1mS
DelayUs2x(245);
DelayUs2x(245);
}
}。