单片机控制LED流水灯从中间向两边.docx
文本预览下载声明
单片机控制LED流水灯从中间向两边,从两边向中间这个就是把先奇数亮再偶数亮,循环三次;一个灯上下循环三次;两个分别从两边往中间流动三次;再从中间往两边流动三次;不过这个程序实现的应该是这样的先奇数亮再偶数亮,循环三次;一个灯上下循环三次;两个分别从两边往中间流动;再从中间往两边流动;#include reg52.h#include intrins.h#define uint unsigned int#define uchar unsigned char void delay();void main(){ uchar temp,temp1,temp2,a,b; P3=0xff; while(1){ for(b=3;b0;b--) { temp=0xaa; P1=temp; delay();temp=0x55; P1=temp;delay(); }for(a=3;a0;a--) { temp=0xfe;for(b=7;b0;b--){ P1=temp;temp=_crol_(temp,1);delay(); P1=temp;delay(); } } temp1=0xfe; temp2=0x7f; for(a=8;a0;a--) { temp=temp1temp2; P1=temp;delay(); temp1=_crol_(temp1,1); temp2=_cror_(temp2,1); }}}void delay(){ uinta,b;for(a=100;a0;a--)for(b=600;b0;b--);}程序实现的第2种方法:下面是单片机12群里的朋友木信大侠提出的,实现单片机led流水灯从中间向两边,从两边向中间的效果,下面的程序就是实现思路,这个是直接调用,应该明白吧,数组那其实也可以改一下,如采用一维数组,在多次调用;也可以采用二维数组。主要看个人喜好.-----------------------------------------------------#include reg52.h unsigned char code TABLE[]={ 0xFF,0xE7,0xC3,0x81,0x00, //从中间向两侧点亮0xFF,0xE7,0xC3,0x81,0x00, 0xFF,0xE7,0xC3,0x81,0x00, 0xFF,0x7E,0x3C,0x18,0x00, //从两侧向中间点亮0xFF,0x7E,0x3C,0x18,0x00, 0xFF,0x7E,0x3C,0x18,0x00}; unsigned char i; DELAY(){ unsignedint s; for(s=0;s30000;s++); }main(){ while(1) { if(TABLE[i]!=0x01) { P1=TABLE[i]; i++;DELAY(); }else { i=0; } } }汇编程序如下:; 花样流水灯(8个发光二极管以各种形式循环点亮); 功能:流水灯(8个发光二极管循环以1S间隔以各种形式循环点亮) ORG 0000H ;伪指令,指定程序从0000H开始存放 LJMP MAIN ;跳转指令,程序跳转至MAIN处执行 ORG 0030H ;伪指令,指定程序从0030H开始存放MAIN: MOV SP, #60H ;给堆栈指针赋初值 MOV P1,#0FFH ;给P1口赋值 MOV DPTR,#TABLE;查表LIGHT: MOV R4,#42 ;设置循环次数LOOP: MOV A,#42 ;给A赋初值 SUBB A,R4 ;将A的值与R4的值相减,结果存在A中 MOVC A,@A+DPTR ;将A+DPTR的值所对应的TABLE中的值赋给A MOV P1,A ;将A的值赋给P1口 LCALL DEL1S ;调用1S延时子程序 DJNZ R4,LOOP ;判断R4是否为0,不为0跳转,为0顺序执行 LJMP LIGHT ;跳转指令,跳转至LIGHT处继续执行;1S延时子程序(11.0592MHz晶振,误差0微秒)DEL1S: MOV R5, #089HDL1S0: MOV R6, #0A4HDL1S1:
显示全部