小言_互联网的博客

C51流水灯【text01】

253人阅读  评论(0)

单片机51的流水灯
不死心的我尝试了硬件,作为一个硬件特别菜的我,我只能说,我真的尽力了~~~~
好了,马上开始我的表演

这个是我的单片机板子,相当精致了,是吧,这个是我们实训室的师兄做的,skr~
马上严肃,首先为了让灯亮,你要想一个问题,他为什么会亮,这是受高低电频的影响呀,所以我使用了一个我自认为最简单的方法来做这个实验,大家都会十六进制的算法吧【此处默认都会】

算法是这个算法的,比较好懂吧,那我们直接上程序

unsigned char code MovinglightArray[] = {0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};

这句代码的意思就是找个数组,把流水灯运动时所有的亮灭的过程放在这个数组里,比方说,这里的0xfe,它不就是二进制的11111110吗?所以这里它是从右手这边开始亮,然后依此想左开始亮,如果不信的小伙伴可以自己尝试算一下。
这里我得说一句,共阴和共阳也是不一样的,比如他们完全相反,一个是0是亮,一个是1是亮,大家因板而异,不要强求
我们将它做成一个数组,有没有一个冲动,想把它做成一个方法,在main方法里调用它?
无论各位有没有这个冲动,反正我有。申明一个方法,方法名字尽量和这个数组名字差不多,不然我怕大家会忘记这个方法是干嘛用的。

void Movinglight();

这个方法里应该有什么呢,当然是来回跑的循环呀

void Movinglight()
{
	while(1)
	{
			for(i = 0;i < 8;i++){
			P1 = MovinglightArray[i];
			delaySec(TIME);
			}
			}

OK,这是从左到右的跑,我们要实现来回跑,那我们只要再加一个for循环就okk了。

for (i=7;i>=0;i--){
				P1 = MovinglightArray[i];
			delaySec(TIME);
			}

最后使用main调用Movinglight()

int main()
{
	Movinglight();
	return 0;
}

这是整个思路的整理,我要上整个程序:

void delaySec(unsigned char n);
void Movinglight();
unsigned char code MovinglightArray[] = {0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
unsigned char i,n = 1;
int main()
{
	Movinglight();
	return 0;
}
void Movinglight()
{
	while(1)
	{
			for(i = 0;i < 8;i++){
			P1 = MovinglightArray[i];
			delaySec(TIME);
			}
		for (i=7;i>=0;i--){
				P1 = MovinglightArray[i];
			delaySec(TIME);
		}
	}
	void delaySec(unsigned char n)
{
	unsigned int i,j,l;
	for(l = 0;l < n;l++)
		for(i = 0;i < 1000;i++)
			for(j = 0;j < 114;j++);
			}

LED灯和P1连,就OK了


转载:https://blog.csdn.net/qq_44965498/article/details/101033429
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场