单片机流水灯所有程序
51单片机流水灯程序

51单片机流水灯程序51单片机是一种广泛使用的微控制器,具有丰富的IO端口和定时器资源。
流水灯程序是51单片机入门的基础示例之一,通过多个LED灯按照一定顺序逐个亮起或熄灭,形成流水灯的效果。
下面详细介绍51单片机流水灯程序的编写。
一、硬件连接要实现流水灯效果,需要将多个LED灯连接到51单片机的IO端口上。
一般使用P1端口作为输出端口控制LED灯的亮灭,P2端口作为输出口控制LED灯亮起的顺序。
具体连接方式如下:•将LED灯的阳极通过限流电阻连接到VCC。
•将每个LED灯的阴极通过限流电阻连接到P1端口。
•将P2端口的每个引脚依次连接到每个LED灯的阴极。
二、程序实现#include <reg52.h> //包含51单片机头文件#define LED P1 //定义LED为P1端口#define ORDER P2 //定义顺序控制为P2端口void delay(unsigned int t); //延时函数声明void main(){unsigned char i;while(1) //循环控制流水灯效果{for(i=0; i<8; i++) //控制8个LED灯{LED = 0x01<<i; //将第i个LED灯置亮delay(10000); //延时一段时间,使LED灯亮起后延时熄灭LED = 0x01>>(i+1); //将第i个LED灯置灭}}}void delay(unsigned int t) //延时函数定义{unsigned int i, j;for(i=0; i<t; i++){for(j=0; j<1275; j++);}}该程序首先定义了LED和ORDER两个变量,分别对应P1和P2端口的输出口。
在主函数中,使用一个while循环控制流水灯效果。
在循环内部,使用一个for循环控制8个LED灯的状态。
在每次循环中,先将第i个LED灯置亮,延时一段时间后将其置灭,然后进入下一个循环。
51单片机经典流水灯汇编程序

51单片机经典流水灯汇编程序(共8页)单片机流水灯汇编程序设计流水灯汇编程序8只LED为共阳极连接,即单片机输出端为低电平时即可点亮LED。
;用最直接的方式实现流水灯ORG 0000H START:MOV P1,#01111111B ;最下面的LED点亮 LCALL DELAY ;延时1秒 MOV P1,#B ;最下面第二个的L ED点亮 LCALL DELAY ;延时1秒 MOV P1,#B ;最下面第三个的LED点亮(以下省略) LCALL DELAY MOV P1,#B LC ALL DELAY MOV P1,#B LCALL DELAY MOV P1,#B LCALL DELAY MOV P1,#B LCALL DELAY MOV P1,#B LCALL DELA Y MOV P1,#B ;完成第一次循环点亮,延时约秒 AJMP START ;反复循环;延时子程序,12M晶振延时约250毫秒DELAY: ;大约值:2us*256*256*2=260ms,也可以认为为250msPUSH PSW ;现场保护指令(有时可以不加)MOV R4,#2 L3: MOV R2 ,#00HL1: MOV R3 ,#00HL2: DJNZ R3 ,L2 ;最内层循环:(256次)2个周期指令(R3减一,如果比1大,则转向L 2) DJNZ R2 ,L1 ; 中层循环:256次 DJNZ R4 ,L3 ;外层循环:2次 POP PSW RET END--本页仅作为文档封面,使用时请直接删除即可----内页可以根据需求调整合适字体及大小--51单片机汇编程序集(二)2008年12月12日星期五 10:27辛普生积分程序内部RAM数据排序程序(升序)外部RAM数据排序程序(升序)外部RAM浮点数排序程序(升序)BCD小数转换为二进制小数(2位)BCD小数转换为二进制小数(N位)BCD整数转换为二进制整数(1位)BCD 整数转换为二进制整数(2位)BCD整数转换为二进制整数(3位)BCD整数转换为二进制整数(N位)二进制小数(2位)转换为十进制小数(分离BCD码)二进制小数(M位)转换为十进制小数(分离BCD码)二进制整数(2位)转换为十进制整数(分离BCD码)二进制整数(2位)转换为十进制整数(组合BCD码)二进制整数(3位)转换为十进制整数(分离BCD码)二进制整数(3位)转换为十进制整数(组合BCD码)二进制整数(M位)转换为十进制整数(组合BCD码)三字节无符号除法程序(R2R3R4/R7)=(R2)R3R4 余数R7;二进制整数(2位)转换为十进制整数(分离BCD码);入口: R3,R4;占用资源: ACC,R2,NDIV31;堆栈需求: 5字节;出口: R0,NCNTIBTD21 : MOV NCNT,#00HMOV R2,#00HIBD211 : MOV R7,#0AHLCALL NDIV31MOV A,R7MOV@R0,AINC R0INC NCNTMOV A,R3ORL A,R4JNZ IBD211MOV A,R0CLR CSUBB A,NCNTMOV R0,ARET;二进制整数(2位)转换为十进制整数(组合BCD码);入口: R3,R4;占用资源: ACC,B,R7;堆栈需求: 3字节;出口: R0IBTD22 : MOV A,R0PUSH AMOV R7,#03HCLR AIBD221 : MOV @R0,AINC R0DJNZ R7,IBD221POP AMOVR0,AMOV R7,#10HIBD222 : PUSH ACLR CMOV A,R4RLC AMOV R4,AMOV A,R3RLC AMOV R3,AMOVB,#03HIBD223 : MOV A,@R0ADDC A,@R0DA AMOV @R0,AINC R0DJNZ B,IBD223POP AMOV R0,ADJNZR7,IBD222RET;二进制整数(3位)转换为十进制整数(分离BCD码);入口: R2,R3,R4;占用资源: ACC,R2,NDIV31;堆栈需求: 5字节;出口: R0,NCNTIBTD31 : CLR AMOV NCNT,AIBD311 : MOV R7,#0AHLCALL NDIV31MOV A,R7MOV @R0,AINCR0INC NCNTMOV A,R2ORL A,R3ORL A,R4JNZ IBD311MOV A,R0CLR CSUBB A,NCNTMOV R0,ARET;二进制整数(3位)转换为十进制整数(组合BCD码);入口: R2,R3,R4;占用资源: ACC,B,R7;堆栈需求: 3字节;出口: R0IBTD32 : MOV A,R0PUSH AMOV R7,#04HCLR AIBD321 : MOV @R0,AINC R0DJNZ R7,IBD321POP AMOVR0,AMOV R7,#18HIBD322 : PUSH ACLR CMOV A,R4RLC AMOV R4,AMOV A,R3RLC AMOV R3,AMOV A,R2RLC AMOV R2,AMOV B,#04HIBD323 : MOV A,@R0ADDC A,@R0DA AMOV @R0,AINC R0DJNZ B,IBD323POP AMOVR0,ADJNZ R7,IBD322RET第七个试验:流水灯数字显示综合练习----51单片机汇编语言试验教程收藏该程序运行结果为个位数码管轮流现实0,1,2,3,4,5,6,7,8然后十位数码管轮流现实0,1,2,3,4,5,6,7,8反复循环,, ,, ,, ,, 依次点亮然后轮流点亮小喇叭不停发出滴答声:注意该程序配套为我站的倚天版开发套件:如果是标准版:因他的数码管接法不同。
五种编程方式实现流水灯的单片机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.中断编程方式:中断编程方式是一种基于中断事件的编程方式,通过在特定的中断事件触发时改变灯光状态来实现流水灯效果。
C51单片机实现呼吸灯和花样流水灯程序

C51单⽚机实现呼吸灯和花样流⽔灯程序1.⽤C51单⽚机实现花样流⽔灯,代码如下:#include <reg52.h>#define LED_A P1 //led灯所⽤的接⼝,是哪个⼝就写P⼏void delayms(){unsigned char x = 0; unsigned char i;unsigned char y = 0;while(y < 0.001) //定义led灯的切换的延时时间,越⼩越快。
{ //(y < 0.001);(x<100);(i<100)都可以修改x = 0;while(x<100){i = 0;while(i<100){i++;}x++;}y++;}}#define LED_NUM 8 //定义led灯的数量,可快速实现不同⽤途的修改;void main(){unsigned char k;unsigned char j;unsigned char LED_ALL[] = {0XFE,0XFD,0XFB,0XF7,0XEF,0XDF,0XBF,0X7F}; //led灯亮灭的⼗六进制数组;unsigned char LED_ALL_2[] = {0XFC,0XF3,0XCF,0X3F}; while(1) { for(k=0;k<3;k++) //第⼀个for实现奇偶灯交叉闪烁三次,想闪烁⼏次就修改(K<3)中的数值; { LED_A = 0xAA; delayms(); LED_A = 0x55; delayms(); } for(k=3;k>0;k--) //实现⼀个流⽔灯左右三次(从左到右再从右到左算⼀次); { for(j=0;j<LED_NUM;j++) { LED_A = LED_ALL[j]; delayms(); } for(j=6;j>0;j--) { LED_A = LED_ALL[j]; delayms(); } } for(k=0;k<3;k++) //实现前四个灯亮后四个灯灭,交叉闪烁3次,修改次数同上; { LED_A = 0xf0; delayms(); LED_A = 0xf; delayms(); } for(k=3;k>0;k--) //实现两个灯依次流⽔3次; { for(j=0;j<4;j++) { LED_A = LED_ALL_2[j]; delayms(); } for(j=2;j>0;j--) { LED_A = LED_ALL_2[j]; delayms(); } } }}2.实现第⼀个灯呼吸,由暗变亮,再由亮变暗,程序如下;#include <reg52.h>sbit LED1 = P3^0;void delay(unsigned int a) //定义⼀个延时函数{ while(--a);}void main(){ unsigned int t,circle=800; //定义变量,circle=800为led灯呼吸的间隔长短,数值越⼩,间隔越短。
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;
单片机流水灯程序

流水灯程序来回显示,并且显示时还会发出蜂咛声!P1口接八个发光二极管,接一个蜂咛器!一.汇编语言mov r7,#8main:mov r0,#8 ;一个循环需要移动8位mov p1,#01111111b ;初始为P0.7灯点亮loop: clr p2.3acall ds1ms ;延时,以便人眼可以观察到setb p2.3acall ds1msmov a,p1 ;读P0口当前显示的数据送到Arr a ;将A中的数据循环右移1位mov p1,a ;再将A中右移过的数据送到P0djnz r0,loopdjnz r7,main ;移动不够8位,跳到LOOP处循环,ljmp rel ;流动1遍跳转到MAIN处循环流。
;---显示延时----------ds1ms: mov r1,#1ds1lo: mov r2,#200ds2lo: mov r3,#200djnz r3,$djnz r2,ds2lodjnz r1,ds1loret ;延时返回rel:end二.C语言#include<reg52.h>unsigned char i;unsigned char temp;unsigned char a,b;void delay(void) //延时子程序{unsigned char m,n,s;for(m=20;m>0;m--)for(n=20;n>0;n--)for(s=248;s>0;s--);}void main(void) //主程序{while(1) //循环条件永远为真,以下程序一直执行下去。
{temp=0xfe;P1=temp; //直接对I/O口P1赋值,使P1.0输出低点平。
delay(); //延时for(i=1;i<8;i++) //实现广告灯的移动{a=temp<<i;b=temp>>(8-i);P1=a|b;delay();}for(i=1;i<8;i++) //实现广告灯的反方向移动{a=temp>>i;b=temp<<(8-i);P1=a|b;delay();}}}实验很简单!懂的朋友完全可以在此基础上开发!比如一个爱心的流水灯。
单片机流水灯所有程序

单片机流水灯所有程序#include#define uchar unsigned char //char是字符数组#define unit unsigned intuchar num;sbit led1=P1^0;void main(){TMOD=0x01; // 打开工作方式寄存器,选择工作方式1(0000 0001)TH0=(65536-45872)/256;TL0=(65536-45872)%256;EA=1; //开总中断ET0=1; //开定时器0中断TR0=1; //启动定时器0while(1); //程序停止在这里等待中断发生}void T0_time()interrupt 1{TH1=(65536-45872)/256; //装初值50msTL1=(65536-45872)%256;num++; //num每加一次判断是否到了20次if(num==20) // 20*50ms=1000ms=1s,间隔1s{num=0; //然后把num清0重新再计20次led1=~led1; //让发光管状态取反}}用定时器使1灯间隔1s闪烁#include#define uchar unsigned char#define unit unsigned intunit num ;#define ucha unsigned char#define uni unsigned intuni a ;uchar table[]={0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00}; // ucha table1[]={0x80,0xc0,0xe0,0xf0,0xf8,0xfc,0xfe,0xff};void delayms(unit);void main(){while(1){for(num=0;num<8;num++) //{P1=table[num];delayms(500);}for(a=8;a>0;a--) //改成for(a=0;a>8;a++){P1=table1[a];delayms(500);}}void delayms(unit xms){unit i,j;for(i=xms;i>0;i--)for(j=110;j>0;j--);}没有实现理想的流水灯,问题已解决,见下面程序#include#define uchar unsigned char#define unit unsigned intunit num ;uchar table[]={0xff,0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00}; void delayms(unit);void main(){while(1){for(num=0;num<9;num++){P1=table[num];delayms(500);}for(num=9;num>0;num--)P1=table[num];delayms(500);}}}void delayms(unit xms){unit i,j;for(i=xms;i>0;i--)for(j=110;j>0;j--);}用数组实现流水灯循环,依次点亮,然后依次熄灭#include#define uchar unsigned char //char是字符数组#define unit unsigned intunit num ;uchar table[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; // 改变数组void delayms(unit);void main(){while(1){for(num=0;num<8;num++) //for循环P1=table[num];delayms(500);}}}void delayms(unit xms){unit i,j;for(i=xms;i>0;i--) //延迟0.5s,下一灯亮 // 加for语句for(j=110;j>0;j--);}用数组实现流水灯#include#include //包含_crol_函数所在的头文件#define unit unsigned intunit i,j;#define uchar unsigned charuchar a;void delayms(unit);void main(){a=0xfe; //赋给a初值0xfe,即1111 1110,第一个灯亮while(1){P1=a;delayms(500);a=_crol_(a,1); //循环左移指令或 a=a<<1;8 7 6 5 4 3 2 1灯}}void delayms(unit xms) //自定义毫秒X{unit i,j;for(i=xms;i>0;i--) //延迟Xmsfor(j=110;j>0;j--);}用循环左移指令实现流水灯#include //头文件#define unit unsigned int //宏定义unit i,j; //定义i;jvoid delay1s();sbit led1=P1^0; //连接1灯的是锁存器的P10端口sbit led2=P1^1;sbit led3=P1^2;sbit led4=P1^3;sbit led5=P1^4;sbit led6=P1^5;sbit led7=P1^6;sbit led8=P1^7;void main(){while(1) //循环永不停止{led1=0;delay1s(); //1灯亮1Sled1=1; led2=0 ; //1灯灭,二灯亮delay1s();led2=1;led3=0 ;delay1s();led3=1;led4=0;delay1s();led4=1;led5=0;delay1s();led5=1;led6=0;delay1s();led6=1;led7=0;delay1s();led7=1;led8=0;delay1s();led8=1;led1=0;}}void delay1s(){unit i,j; //for(i=500;i>0;i--) //延迟0.5s,下一灯亮for(j=110;j>0;j--);}流水灯#include#define unit unsigned intunit i,j;void delay1s();sbit led=P1;sbit led1=P1^0;sbit led2=P1^1;sbit led3=P1^2;sbit led4=P1^3;sbit led5=P1^4;sbit led6=P1^5;sbit led7=P1^6;sbit led8=P1^7; void main(){while(1){led1=0;delay1s();led2=0 ;delay1s();led3=0 ;delay1s();led4=0;delay1s();led5=0;delay1s();led6=0;delay1s();led7=0;delay1s();led8=0;delay1s();led8=1; delay1s();led7=1; delay1s();led6=1; delay1s();led5=1; delay1s();led4=1; delay1s();led3=1; delay1s();led2=1; delay1s();led1=1; delay1s();P1=0;delay1s(); P1=0xff;delay1s();}}void delay1s(){unit i,j;for(i=500;i>0;i--)for(j=110;j>0;j--);}依次点亮,一亮二亮----全亮---依次熄灭---全灭------全亮#include#define unit unsigned intunit i,j;void delay1s();sbit led=P1;sbit led1=P1^0;sbit led2=P1^1;sbit led3=P1^2;sbit led4=P1^3;sbit led5=P1^4;sbit led6=P1^5;sbit led7=P1^6;sbit led8=P1^7;void main(){while(1){led1=0;delay1s(); //1灯亮1Sled1=1; led2=0 ; //1灯灭,二灯亮delay1s();led2=1;led3=0 ;delay1s();led3=1;led4=0;delay1s();led4=1;led5=0;delay1s();led5=1;led6=0;delay1s();led6=1;led7=0;delay1s();led7=1;led8=0;delay1s();led8=1;P1=0;delay1s();P1=0xff ;}}void delay1s(){unit i,j;for(i=500;i>0;i--)for(j=110;j>0;j--);} 依次亮,全亮,全灭,循环#include#define unit unsigned int unit i,j;void delay1s();sbit LED4=P1^3;sbit LED5=P1^4;sbit dula=P2^1;void main(){while(1){LED4=0;delay1s();LED4=1; LED5=0 ;delay1s();}}void delay1s(){unit i,j;for(i=500;i>0;i--)for(j=110;j>0;j--);}4闪5亮#includesbit LED2=P1^1;sbit dula=P2^6;void main(){ dula=1;LED2=0;dula=0;} 二灯亮#includesbit LED4=P1^3;sbit LED5=P1^4;sbit dula=P2^1;#define unit unsigned intvoid main(){ while (1){ LED4=0;for(i=1000;i>0;i--)for(j=110;j>0;j--);LED4=1;LED5=0;for(i=1000;i>0;i--)for(j=110;j>0;j--);}dula=1;LED4=0;dula=0;}4闪5亮#include#define unit unsigned int sbit led1=P1^0;void delays(unit);void main(){while(1){led1=0;delay1s();delay1s();}}void delay1s(){unit i,j; //使用局部变量可节约单片机内存for(i=500;i>0;i--)for(j=110;j>0;j--);}#includesbit led=P1^0;unsigned int a;void main() //主函数{while(1){a=51000;led=0;while(a--);led=1;a=51000;while(a--);}}用while函数实现延迟,延迟0.5s#include#define unit unsigned intsbit led1=P1^0;unit i,j;void main (){ while (1){ led1=0;for(i=1000;i>0;i--)for(j=110;j>0;j--);led1=1;for(i=1000;i>0;i--)for(j=110;j>0;j--);}}一灯亮,延迟1s,灭。
用单片机设计流水灯的方法和程序编写

S51增强型单片机实验板上有8个高亮度发光二极管(见图1所示),可以用来做单片机流水灯、跑马灯。
等实验,电路原理图见下图3。
图3单片机流水灯设计方法从原理图可以看出,如果我们想让接在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高、P 1.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流水灯实验写为汇编语言程序。
在上面主程序中用到了五条汇编语言指令:CLR、ACALL、SETB、LJMP、END。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#define unit unsigned int unit i,j;
void delay1s();
sbit led=P1;
sbit led仁PMO;
sbit led2=P1A1;
sbit led3=P1A2;
sbit led4=P1A3;
sbit led5=P1A4;
{
unit i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
用数组实现流水灯循环,依次点亮,然后依次熄灭
#include<reg52.h>
#define uchar unsigned char
//char是字符数组
#define unit unsigned int unit num;
头文件宏定义端口循环永不停止voiddelaymsunitxms用循环左移指令实现流水灯延迟05s下一灯亮led31
#include<reg52.h>
#define uchar unsigned char
//char是字符数组
#define unit unsigned int
uchar num;
sbit led仁PMO;
for(j=110;j>0;j--);
}流水灯
#include<reg52.h>
#define unit unsigned int unit i,j;
void delay1s();
sbit led=P1;
sbit led仁PMO;
sbit led2=P1A1;
sbit led3=P1A2;
sbit led4=P1A3;
delay1s(); led4=1;led5=O;
delay1s(); led5=1;led6=O;
delay1s(); led6=1;led7=O;
delay1s(); led7=1;led8=O;
delay1s(); led8=1; P1=O; delay1s(); P1=Oxff ;
}
}
void delay1s()
包含_crol_函数所在的头文件
赋给a初值Oxfe,即
循环左移指令或a=a<<1;8
void delayms(unit xms)//{
unit i,j;
for(i=xms;i>0;i--)//
for(j=110;j>0;j--);
}用循环左移指令实现流水灯
led3=1;led4=0; delay1s();
led1=~led1;//让发光管状态取反
}
}
用定时器使1灯间隔1s闪烁
#include<reg52.h>
#define uchar unsigned char
#define unit unsigned int
unit num;
#define ucha unsigned char
#define uni unsigned int
{
unit i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}没有实现理想的流水灯,问题已解决,见下面程序
#include<reg52.h>
#define uchar unsigned char
#define unit unsigned int
unit num;
uchar table[]={0xff,0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00};
{
unit i,j;
for(i=500;i>0;i--)
for(j=110;j>0;j--)<reg52.h> #define unit unsigned int unit i,j;
led4=1;led5=0; delay1s();
led5=1;led6=0; delay1s();
led6=1;led7=0; delay1s();
led7=1;led8=0; delay1s();
led8=1;led1=0;
}
}
void delay1s()
{
unit i,j;//for(i=500;i>0;i--)//
delay1s();
led6=0;
delay1s();
led7=0;
delay1s();
led8=0;
delay1s();led8=1;
delay1s();led7=1;
delay1s();led6=1;
delay1s();led5=1;
delay1s();led4=1;
delay1s();led3=1;
}
}
void delayms(unit xms)
{
unit i,j;
for(i=xms;i>0;i--)//
加for语句for(j=110;j>0;j--);
}
用数组实现流水灯
延迟0.5s,下一灯亮//
#include<reg52.h>
#include<intrins.h>//#define unit unsigned int unit i,j;
uni a;
uchar table[]={0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00};//????uchatable1[]={0x80,0xc0,0xe0,0xf0,0xf8,0xfc,0xfe,0xff};
void delayms(unit);
void main()
void main()
{
TMOD=OxO1; //打开工作方式寄存器,选择工作方式THO=(65536-45872)/256;
TLO=(65536-45872)%6;
EA=1; //开总中断
ETO=1; //开定时器O中断
TRO=1; //启动定时器O
while(1);//程序停止在这里等待中断发生
sbit led5=P1A4;
sbit led6=P1A5;
sbit led7=P1A6;
sbit led8=P1A7;
void main()
{
while(1)
{led1=O;
delay1s();
led2=0;
delay1s();
led3=0;
delay1s();
led4=0;
delay1s();
led5=0;
void delayms(unit);
void main()
{
while(1)
{
for(num=0;num<9;num)
{
P1=table[num];
delayms(500);
}
for(num=9;num>0;num--)
{
P1=table[num];
delayms(500);
}
}
}
void delayms(unit xms)
uchar table[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};变数组
void delayms(unit);
void main()
{while(1){for(num=0;num<8;num)//for{
P1=table[num]; delayms(500);
delay1s();led2=1;
delay1s();led1=1; delay1s();
P1=0;delay1s();
P1=0xff;delay1s();
}
}
void delay1s()
{
unit i,j;
for(i=500;i>0;i--)for(j=110;j>0;j--);
}
依次点亮,一亮二亮 全亮---依次熄灭---全灭
{
while(1)
{
for(num=0;num<8;num) //????
{
P1=table[num];
delayms(500);
}
for(a=8;a>0;a--) //改成for(a=0;a>8;a)
{
P1=table1[a];
delayms(500);
}
}
}
void delayms(unit xms)
#define uchar unsigned char uchar a;
void delayms(unit);
void main()
{
a=0xfe;//
1111 1110,第一个灯亮
while(1)
{
P1=a;
delayms(500);
a=_crol_(a,1);//
7 6 5 4 3 2 1灯
}
}
sbit led6=P1A5;
sbit led7=P1A6;
sbit led8=P1A7;
void main()
{
while(1)
{led1=O;
delay1s();//1
led1=1; led2=O ;//1
delay1s();
led2=1;led3=O ;
delay1s(); led3=1;led4=O;
}
void TO_time()interrupt 1
{
TH1=(65536-45872)/256; //装初值5Oms
TL1=(65536-45872)%6;