项目一彩灯控制器 任务1-3流水灯控制器

使用单片机P1.0口连接8个LED,通过C语言编程实现流水灯效果,0.1秒间隔依次亮灭。文章探讨了两种控制方法:通用算法计算控制字和预定义控制字列表,并介绍了循环移位操作符在简化代码中的应用。
摘要由CSDN通过智能技术生成

P1.0口接8个LED,编程实现8个灯依次亮灭并循环,间隔0.1秒

8706d5a31bae49e7a4e79e15562a4260.png

常规方法:

/*************************
项目名称:项目一彩灯控制器
任务名称:任务1-3流水灯控制器
任务描述:P1.0口接8个LED,编程实现8个灯依次亮灭并循环,间隔0.1秒
*************************/
#include<reg51.h>
void delay(int i)
{
	int j,k;
	for(k=0;k<i;k++)
		for(j=0;j<100;j++);
}
/*******************************/
void main()
{
	while(1)
	{
		P1=0xfe;//1111 1110,D1亮
		delay(1000);//延时1秒
		
		P1=0xfd;//1111 1101,D2亮
		delay(1000);//延时1秒
		
		P1=0xfb;//1111 1011,D3亮
		delay(1000);//延时1秒
		
		P1=0xf7;//1111 0111,D4亮
		delay(1000);//延时1秒
		
		P1=0xef;//1110 1111,D5亮
		delay(1000);//延时1秒
		
		P1=0xdf;//1101 1111,D6亮
		delay(1000);//延时1秒
		
		P1=0xbf;//1011 1111,D7亮
		delay(1000);//延时1秒
		
		P1=0x7f;//0111 1111,D8亮
		delay(1000);//延时1秒
	}
}

 

循环结构当中控制字每次不相同解决方法:

1.找到一个通用算法,每循环一次,计算一次,得到新控制字。

2.将找到控制字列表,每次循环调用不同数组。

上述代码为第一个解决方法,以下代码为第二个解决办法。

3231b62a36e34c1fb98957953183c169.png

#include<reg51.h>
int led[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//流水灯控制字列表
void delay(int i)
{
	int j,k;
	for(k=0;k<i;k++)
		for(j=0;j<100;j++);
}
/*******************************/
void main()
{
	int i;
	while(1)
	{
		for(i=0;i<8;i++)
		{
		P1=led[i];//0111 1111,D1亮
		delay(100);//延时0.1秒
	}
	}
}

 

以下方法引入一个循环运算符

_cror_(a,1)    ------->循环右移

_crol_(a,1)    ------->循环左移

此为闭环右移,首尾相接。

6b484cf80cac4c858ca815ac99764e84.png

 

#include<reg51.h>
#include<intrins.h>
void delay(int i)
{
	int j,k;
	for(k=0;k<i;k++)
		for(j=0;j<100;j++);
}
/*******************************/
void main()
{
	int i,j;
	while(1)
	{
		for(i=0,j=0x7f;i<8;i++)
		{
		P1=j;//控制字
		delay(1000);//延时0.1秒
		j=_cror_(j,1);//将控制字循环右移一位
	}
	}
}

 

循环左移:_crol_(a,1) 

#include<reg51.h>
#include<intrins.h>
void delay(int i)
{
	int j,k;
	for(k=0;k<i;k++)
		for(j=0;j<100;j++);
}
/*******************************/
void main()
{
	int i,j;
	while(1)
	{
		for(i=0,j=0x7f;i<8;i++)
		{
		P1=j;//控制字
		delay(1000);//延时0.1秒
		j=_crol_(j,1);//将控制字循环左移一位,将最后一个R换成L
	}
	}
}

 

或者修改for条件,实现循环左移:

#include<reg51.h>
int led[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//流水灯控制字列表
void delay(int i)
{
	int j,k;
	for(k=0;k<i;k++)
		for(j=0;j<100;j++);
}
/*******************************/
void main()
{
	int i;
	while(1)
	{
		for(i=7;i>-1;i--)//从右往左亮,从编号大到小
		{
		P1=led[i];//0111 1111,D1亮
		delay(100);//延时0.1秒
	}
	}
}

 

以下代码实现从两头到中间逐渐亮的过程:

#include<reg51.h>
//int led[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//流水灯控制字列表
int led[]={0xff,0x7e,0x3c,0x18,0x00};//全灭,头尾各一个亮,各两个,各三个,全亮。
void delay(int i)
{
	int j,k;
	for(k=0;k<i;k++)
		for(j=0;j<100;j++);
}
/*******************************/
void main()
{
	int i;
	while(1)
	{
		for(i=0;i<5;i++)
		{
		P1=led[i];//0111 1111,D1亮
		delay(100);//延时0.1秒
	}
	}
}

 

以下代码实现led灯累加点亮并循环

>>开环右移运算符,右移后补0

#include<reg51.h>
#include<intrins.h>
void delay(int i)
{
	int j,k;
	for(k=0;k<i;k++)
		for(j=0;j<100;j++);
}
/*******************************/
void main()
{
	int i,j;
	while(1)
	{
		for(i=0,j=0xff;i<9;i++)
		{
		P1=j;//控制字
		delay(100);//延时0.1秒
		j=j>>1;//将控制字开环右移,右移后补0,累加点亮并循环
	}
	}
}

 综上所述,有规则变换时用算法更简便,无规则时列表更好。

 

 

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

快乐的甲方

你的鼓励是我博文创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值