51的_呼吸灯_跑马灯_按键亮灯_的原理与实现

51之旅的第一步,亮灯。但我们不仅仅只是亮一个灯就够了,我们亮就要亮出花样出来,接下来我来说几种常见的形式。

(一)按键亮灯

最终所要实现的效果:当按下A键对应A灯亮,按下B键对应B灯亮,按下C键对应C灯亮,按下D键对应D灯亮。

就选四个键,多了自己写,原理都一样。

原理支撑:对于嵌入的LED,低电平亮,高电平灭(这个大部分这样,实际情况不放心可以自己测一下,分别给个高低的电平看看那个亮)。对于独立按键来说,当按键按下,按键所接对应引脚变为低电平。

接线:LED:L1接P1.0,L2接P1.1,L3接P1.2,L4接P1.3。按键:K1接P0.0,K2接P0.1,K3接P0.2,K4接P0.3。

好了,原理跟接线都完成了,接下来思路就是:当K1按下时,P0.0变成低电平,此时P1.0应变位低电平,L1亮。即实现了按下K1时L1亮。此时问题就转化成了判断P0.0是否为低电平,实现很简单,没错,用个if语句足以。

sbit p00 = P0^0;
if(p00 == 0){
}

这里需注意一点,为了减少误触的风险,应当设置防抖动。所以最后一个完整过程的代码实现应为:

sbit p00 = P0^0;
sbit p10 = P1^0;
if(p00 == 0){
    delay_ms(10);
    if(p00 == 0){
        p10 = 0;
    }
}

注意,上面的delay代表延时,这个函数得自己写。
带上头文件,最后得完完整整得程序应为:

#include 

sbit p00 = P0^0;
sbit p10 = P1^0;

void delay_ms(unsigned int n)
{
 int i,y;
 for(i=n;i>0;i--)
  for(y=114;y>0;y--);
}

void main()
{
	while(1)
	{
	if(p00 == 0){
	    delay_ms(10);
	    if(p00 == 0){
	        p10 = 0;
	    }
	}
	}
}

四个的话,改变引脚重复四次就可以了。我就不多说了。

接下来,进行下一个,跑马灯。

(二)跑马灯

最终效果:当第一个灯亮,其余灯灭,接着第二个灯亮,同时第一个灯灭,接下来是第三个····当最后一个灯亮完,重复整个过程,再来一遍。

原理支撑:灯亮的原理同上,emmm,好像只要说这个就行。

接线:讲L1-L8对应接在P1.0-P1.7上。

实现上述过程,主要是通过位运算来完成。通过左移右移来实现灯灭灯亮。
在这之前介绍一种用法:

P1 = 0xfe

上面代表着,将P1的第一位置为0,也就是P1.0为0,其余位置为1。

有了上面的基础,这我也不多说,大概差不多,我直接给出完整的程序:

#include 

void delay_ms(unsigned int n)
{
 int i,y;
 for(i=n;i>0;i--)
  for(y=114;y>0;y--);
}

void main(void)
{
 while(1)
 {
  P1 = 0xfe;
  delay_ms(1000);
  while(P1 != 0xf7)
  {
   P1 <<= 1;
   P1 |= 0x01;
   delay_ms(1000);
  }
  P1 = 0x7f;
  delay_ms(1000);
  while(P1 != 0xef)
  {
   P1 >>= 1;
   P1 |= 0x80;
   delay_ms(1000);
  }
 }
}

ok,跑马灯咋也完成了,接下来进行最后一项,呼吸灯。

(三)呼吸灯

最终效果:实现灯的由暗到亮并且由亮到暗的逐渐变化。

原理:emmm,我们采用for循环的方式来进行呼吸灯的实现。两个for循环,总的循环次数不变。假设,总的循环次数为500,当亮为500时,暗为0;当亮为200时,暗为300;当亮为0时,暗为500。如果开始是从亮为0开始循环,即实现的是由暗到亮,如果从亮为500开始,即实现的是由亮到暗。然后你想象一下,两者一结合,是不是就是一个从暗到亮然后亮到暗的完整过程,然后不断重复此过程,好了,恭喜你,呼吸灯你完成了。

接线:我们只实现一个灯的呼吸灯,所以我们只接一个脚就可以了。将L1接在P1.0上。

感觉差不多,原理中应该说的很详细了,接下来接触程序:

#include 

sbit p10 = P1^0;

void main(void)
{
 int time = 200;
 int i,j=0;
 while(1)
 {
  p10 = 0;
  for(i=0;i<time-j;i++);
  p10 = 1;
  for(i=0;i<j;i++);
  j++;
  if(j == time)
  {
   while(j>0)
   {
    p10 = 0;
    for(i=0;i<time-j;i++);
    p10 = 1;
    for(i=0;i<j;i++);
    j--;
   }
  }
 }
}

上面的time是做一次呼吸灯要的时间,不可过长,也不可过短,这个自己改几个值试一下,找到最佳的值。导致这个原因是,晶振的不同。

好了,呼吸灯现在你也完成了。到这基本也结束了。
怎么样,是不是很开森。到这,这个LED基本你也完溜了。
接下来,自己去找一些更好玩的玩法。

你可能感兴趣的:(51单片机)