单片机控制LED流水灯从中间向两边

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
0xFF,0xE7,0xC3,0x81,0x00,
0xFF,0x7E,0x3C,0x18,0x00, //从两侧向中间点亮
0xFF,0x7E,0x3C,0x18,0x00,
0xFF,0x7E,0x3C,0x18,0x00
};
unsigned char i;
DELAY()
{
unsigned int s;
#include< intrins.h>
#define uint unsigned int
#define uchar unsigned char
voiddelay();
void main()
{ uchar temp,temp1,temp2,a,b;
P3=0xff;
while(1)
{ for(b=3;b>0;b--)
for(b=600;b>0;b--);
}
程序实现的第2种方法:下面是http://www.51hei.com单片机12群里的朋友木信大侠提出的,实现单片机led流水灯从中间向两边,从两边向中间的效果,下面的程序就是实现思路,这个是直接调用,应该明白吧,数组那其实也可以改一下,如采用一维数组,在多次调用;也可以采用二维数组。主要看个人喜好.
}
}
temp1=0xfe;
temp2=0x7f;
for(a=8;a>0;a--)
{ຫໍສະໝຸດ Baidu
temp=temp1&temp2;
P1=temp;
delay();
temp1=_crol_(temp1,1);
temp2=_cror_(temp2,1);
}
}
}
void delay()
{ uint a,b;
for(a=100;a>0;a--)
单片机控制LED流水灯从中间向两边,从两边向中间
这个就是把先奇数亮再偶数亮,循环三次;一个灯上下循环三次;两个分别从两边往中间流动三次;再从中间往两边流动三次;不过这个程序实现的应该是这样的先奇数亮再偶数亮,循环三次;一个灯上下循环三次;两个分别从两边往中间流动;再从中间往两边流动;
#include< reg52.h>
{ temp=0xaa;
P1=temp;
delay();
temp=0x55;
P1=temp;
delay();
}
for(a=3;a>0;a--)
{ temp=0xfe;
for(b=7;b>0;b--)
{ P1=temp;
temp=_crol_(temp,1);
delay();
P1=temp;
delay();
-----------------------------------------------------
#include< reg52.h>
unsigned char code TABLE[]={
0xFF,0xE7,0xC3,0x81,0x00, //从中间向两侧点亮
0xFF,0xE7,0xC3,0x81,0x00,
for(s=0;s<30000;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: MOV R7, #013H DJNZ R7, $ DJNZ R6, DL1S1DJNZ R5, DL1S0 RETTABLE: ;定义表格数据DB 0FFH ;全灭DB 0FEH 0FDH 0FBH 0F7H 0EFH 0DFH 0BFH 07FH ;依次逐个点亮DB 0FEH 0FCH 0F8H 0F0H 0E0H 0C0H 080H 000H ;依次逐个叠加DB 080H 0C0H 0E0H 0F0H 0F8H 0FCH 0FEH 0FFH ;依次逐个递减DB 07EH 0BDH 0DBH 0E7H 0E7H 0DBH 0BDH 07EH ;两边靠拢后分开DB 07EH 03CH 018H 000H 000H 018H 03CH 07EH ;两边叠加后递减DB 000H ;全亮END ;程序结束指令C语言程序如下:/*该实验是花样流水灯(8个发光二极管以各种方式循环点亮),功能是花样流水灯(8个发光二极管以1S间隔以各种方式循环点亮) */#include//包含reg.52文件#define uint unsigned int//宏定义#define uchar unsigned char//宏定义void delay(uint z);//声明延时函数uint a;//定义循环用变量uchar code table[]={0xff,//全灭0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,//依次逐个点亮0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00,//依次逐个叠加0x80,0xc0,0xe0,0xf0,0xf8,0xfc,0xfe,0xff,//依次逐个递减0x7e,0xbd,0xdb,0xe7,0xe7,0xdb,0xbd,0x7e,//两边靠拢后分开0x7e,0x3c,0x18,0x00,0x00,0x18,0x3c,0x7e,//两边叠加后递减0x00,//全亮};//定义循环用数据表格/*亮的现象:先是全灭,然后依次逐个点亮,然后依次逐个叠加,然后依次逐个递减,然后两边靠拢后分开,然后两边叠加后递减,最后全亮。循环!*/void main()//main函数{ a=0;//给a赋初值while(1)//while循环{ P1=table[a];//将a所在的table中的值赋给P1口delay(1000);//1S延时子程序a++;//a的值加一if(a==42)//测试a是否等于42 a=0;//给a赋值}} void delay(uint z)//1ms延时子程序,通过z值改变延时时间{ uint x,y; for(x=z;x>0;x--)for(y=110;y>0;y--);}
相关文档
最新文档