51单片机——LED流水灯

51单片机——LED流水灯

一、查表法实现流水灯

查看开发板的原理图,知道了控制LED2~LED7的端口为P0口,所以可以通过对P0口赋值控制发光二极管的亮灭。比如,用十六进制表示P0的值,P0=0xfe,即LED2发光,其他LED熄灭。要实现流水灯的话,让发光二极管从LED2到LED7顺序发光就可以了,也就是说,P0口的值依次为0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,简简单单。

 

而查表法就是把P0口要表示的值做成数组,再利用'code'将其存入ROM中,使用时,让P0口等于数组中的某个值。

程序如下:

#include <reg52.h>

sbit ADDR0=P1^0;  
sbit ADDR1=P1^1;
sbit ADDR2=P1^2;
sbit ADDR3=P1^3;
sbit ENLED=P1^4;

void delay(unsigned char x);
unsigned char code aa[]=//P0口查表
{0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};

void main()
{
	unsigned i;
	
	ADDR0=0;  //按原理图端口初始化
	ADDR1=1;
	ADDR2=1;
	ADDR3=1;
	ENLED=0;
	while(1)
	{		
		for(i=0;i<8;i++)
		{
			P0=aa[i];
			delay(250);
		}
	}
}

void delay(unsigned char x)
{
	unsigned n;
	while(--x)
		for(n=0;n<250;n++);
}

二、循环法

用查表法实现流水灯时,发现对P0口赋值是由规律的,即0的位置在左移,如果让0左移到最高位后,重新从最低为开始左移,也可以实现流水灯。介就是循环法,也是蛮简单的,可以加入一个叫'intrins.h'的头文件来做。

程序如下:

#include <reg52.h>
#include <intrins.h>

sbit ADDR0=P1^0;  
sbit ADDR1=P1^1;
sbit ADDR2=P1^2;
sbit ADDR3=P1^3;
sbit ENLED=P1^4;

void delay(unsigned char x);

void main()
{
	unsigned char i,a=0xfe;
	
	ADDR0=0;  //按原理图端口初始化
	ADDR1=1;
	ADDR2=1;
	ADDR3=1;
	ENLED=0;
	while(1)
	{		
		for(i=0;i<8;i++)
		{
			P0=a;
			a=_crol_(a,1);			
			delay(250);
		}
	}
}

void delay(unsigned char x)
{
	unsigned n;
	while(--x)
		for(n=0;n<250;n++);
}


 

以下是51单片机流水灯查表法实现多种流水灯运行方式汇编语言程序。 ```assembly ;---------------------------------- ; 功能:多种流水灯运行方式 ; 作者:CSDN开发的ChitGPT ;---------------------------------- ORG 0000H ;------------------------- ; 变量定义 ;------------------------- ORG 0030H DB 0FFH, 0FEH, 0FDH, 0FBH, 0F7H, 0EFH, 0DFH, 0BFH, 07FH, 0FEH, 0FDH, 0FBH, 0F7H, 0EFH, 0DFH, 0BFH, 07FH, 0FEH, 0FDH, 0FBH, 0F7H, 0EFH, 0DFH, 0BFH, 07FH, 0FEH, 0FDH, 0FBH, 0F7H, 0EFH, 0DFH, 0BFH, 07FH DB 01H, 02H, 04H, 08H, 10H, 20H, 40H, 80H DB 80H, 40H, 20H, 10H, 08H, 04H, 02H, 01H DB 01H, 03H, 07H, 0FH, 1FH, 3FH, 7FH, 0FFH DB 0FFH, 7FH, 3FH, 1FH, 0FH, 07H, 03H, 01H DB 01H, 05H, 15H, 55H, 15H, 05H, 01H DB 81H, 41H, 21H, 11H, 21H, 41H, 81H DB 01H, 04H, 10H, 40H, 10H, 04H, 01H DB 81H, 24H, 81H DB 00H DB 00H DB 00H DB 00H DB 00H DB 00H DB 00H DB 00H DB 00H DB 00H DB 00H DB 00H DB 00H DB 00H DB 00H DB 00H DB 00H DB 00H DB 00H DB 00H DB 00H DB 00H DB 00H DB 00H DB 00H DB 00H DB 00H DB 00H DB 00H DB 00H DB 00H DB 00H DB 00H DB 00H DB 00H DB 00H DB 00H DB 00H DB 00H DB 00H DB 00H DB 00H DB 00H DB 00H DB 00H DB 00H DB 00H DB 00H DB 00H DB 00H DB 00H DB 00H DB 00H DB 00H DB 00H DB 00H DB 00H DB 00H DB 00H DB 00H DB 00H DB 00H DB 00H DB 00H DB 00H DB 00H DB 00H ;------------------------- ; 程序代码 ;------------------------- ORG 0000H MOV P0, #0FFH ;P0口全部输出低电平 MOV DPTR, #0030H ;将表格数据存储区的首地址送入DPTR MAIN: MOV R0, #08H ;R0计数器初始化 LOOP: MOV A, @DPTR ;将表格中的数据读出 INC DPTR ;指向下一个数据 MOV P0, A ;将数据送入P0口 ACALL DELAY ;延时一段时间 DJNZ R0, LOOP ;计数器减一 SJMP MAIN ;一轮结束,回到循环开始 DELAY: MOV R1, #255 ;R1计数器初始化 MOV R2, #255 ;R2计数器初始化 DJNZ R1, $ ;第一层循环 DJNZ R2, $-1 ;第二层循环 RET END ``` 其中,表格数据存储区的首地址为0030H,包含了多种流水灯运行方式对应的数据。程序通过循环读取表格中的数据,并将数据送入P0口,实现多种流水灯运行方式。DELAY子程序用于延时一段时间,以控制流水灯的速度。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值