【51单片机入门】实现流水灯的原理及四种方法(详细易上手型)

初学单片机,流水灯的实现是必不可少的,下面将介绍流水灯的原理及使用STC-ISP软件延时计算器生成的延时代码实现流水灯的四种方法,最后介绍如何将延时函数模块化。

目录

 一、流水灯原理 

二、循环

三、移位运算符

四、库函数

五、数组

         六、延时函数模块化

  1、Delay.h

  2、Delay.c

  3、 main.c


 一、流水灯原理 

LED灯原理图
流水灯原理图

LED的阳极串联一个电阻,然后连接电源VCC,而LED的阴极连接到单片机的P2口,当引脚(P2口)输出高电平即正极(5V)时,LED不亮;当引脚输出低电平即负极(0V)时,LED亮。通过高低变换把电压输出到引脚,从而将LED以流水灯的形式表现出来。

51单片机使用的是TTL电平,规定高电平为5V,低电平为0V。

在写代码时一般用1表示高电平,用0表示低电平。

二、循环

#include <REGX51.H>
#include <INTRINS.H>

void Delay(unsigned int xms)		//@11.0592MHz
{
	unsigned char i, j;
	while(xms--)
	{
	_nop_();
	i = 2;
	j = 199;
	do
	   {
		while (--j);
	   } while (--i);
	}
}  //延时代码

void main()
{
	while(1)
	{
	    P2 = 0xFE;//1111 1110
		    Delay(500);
		P2 = 0xFD;//1111 1101
			Delay(500);
		P2 = 0xFB;//1111 1011
			Delay(500);
		P2 = 0xF7;//1111 0111
			Delay(500);
		P2 = 0xEF;//1110 1111
			Delay(100);
		P2 = 0xDF;//1101 1111
			Delay(100);
		P2 = 0xBF;//1011 1111
			Delay(100);
		P2 = 0x7F;//0111 1111
			Delay(100);
	}
		
}

通过调节Delay中的数字来控制每个LED灯的延时时间。

三、移位运算符

#include <REGX51.H>
#include <intrins.h> 
void Delay(unsigned int xms)		//@11.0592MHz
{
	unsigned char i, j;
	while(xms--)
	{
	_nop_();
	i = 2;
	j = 199;
	do
	{
		while (--j);
	} while (--i);
	}
}  //延时代码

void main()
{
    unsigned char k=0;
	P2 = 0x01;
	while(1)
	{
		
		P2 = ~(0x01<<k);//0000 0001~1111 1110
		Delay(500);
		k++;
		if(k == 8)
		{
		k = 0;
		}
	}
}
<< 左移 各二进位全部左移若干位,高位丢弃,低位补0
>> 右移 各二进位全部右移若干位,对无符号数,高位补0,有符号数,各编译器处理方法不一样,有的补符号位(算术右移),有的补0(逻辑右移)
注意:移位运算符的操作数不能为负数,如 Num >> -1 错误

四、库函数

#include <REGX51.H>
#include <INTRINS.H>
void Delay(unsigned int xms)		//@11.0592MHz
{
	unsigned char i, j;
	while(xms--)
	{
	_nop_();
	i = 2;
	j = 199;
	do
	{
		while (--j);
	} while (--i);
	}
}  //延时代码

void main()
{
	P2 = 0xFE;
	while(1)
	{
		Delay(500);
		P2 = _crol_ (P2, 1);
	}
}
 _crol_ (a , b) 将a进行b位的左位移
 向左循环时,从左边出去会从右边重新补入
_cror_ (c , d) 将c进行d位的右位移
向右循环时,从右边出去会从左边重新补入

五、数组

#include <REGX51.H>
#include <INTRINS.H>

void Delay(unsigned int xms)		//@11.0592MHz
{
	unsigned char i, j;
	while(xms--)
	{
	_nop_();
	i = 2;
	j = 199;
	do
	{
		while (--j);
	} while (--i);
	}
}  //延时代码

unsigned char led[] = {0xFE, 0xFD, 0xFB, 0xF7, 0xEF, 0xDF, 0xBF, 0x7F};
void main()
{
	unsigned char i;
	while(1)
	{
			for(i = 0; i < 8; i++)
		{
			P2 = led[i];
			Delay(500);
		}
	}
}

 六、延时函数模块化

模块化编程:把各个模块的代码放在不同的.c文件里,在.h文件里提供外部可调用函数的声明,其他.c文件想使用其中的代码时,只需要#include “XXX.h”文件即可。使用模块化编程可极大的提高代码的可阅读性、可维护性、可移植性等。

以上一段代码为例:

 1、Delay.h

#ifndef __DELAY_H__
#define __DELAY_H__

void Delay(unsigned int xms);

#endif

 2、Delay.c

void Delay(unsigned int xms)		
{
	unsigned char i, j;
	while(xms--)
	{
	i = 2;
	j = 199;
		do
		{
			while (--j);
		} while (--i);
	}
}

 3、 main.c

#include <REGX51.H>
#include <INTRINS.H>
#include "Delay.h"

void main()
{
	P2 = 0xFE;
	while(1)
	{
		Delay(500);
		P2 = _crol_ (P2, 1);
	}
}

文章为个人总结,技术

有限,如有错漏还要麻烦各位看官指正。

物联沃分享整理
物联沃-IOTWORD物联网 » 【51单片机入门】实现流水灯的原理及四种方法(详细易上手型)

发表评论