LED的流水灯实验

版权声明:资源共阅,资源共享。 https://blog.csdn.net/Ammon_Zhang/article/details/77853615

上一节说了单片机点亮一个LED的方法,包括LED的原理,电路的几种结构,单片机对IO的操作,下面是单片机点亮流水灯的几种方法!


三种方式分别是:

1. 通过位操作实现

2.通过位移实现

3.通过循环位移实现



所有的程序都是配合硬件使用的,下面是大家购买的电路板上面的硬件LED结构。



第一种是比较简单直观的方法但也是最复杂的一种方法,占用单片机可怜的内存空间比较多,一般很少采用。

#include<reg52.h>
sbit LED0 = P1^0;
sbit LED1 = P1^1;
sbit LED2 = P1^2;
sbit LED3 = P1^3;
sbit LED4 = P1^4;
sbit LED5 = P1^5;
sbit LED6 = P1^6;
sbit LED7 = P1^7;
 void delayms(unsigned int xms) 
{
   unsigned int i,j;
   for(i=xms;i>0;i--)
     for(j=120;j>0;j--);//使用12MHZ晶振
 }
void main()
{
    P1=0x00;
    while(1)
    {
       LED0 = 1;
       delayms(100);
      LED0 = 0;
      
     LED1 = 1;
     delayms(100):
     LDE1 = 0;
     
     LED2 = 1;
     delayms(100):
     LDE2 = 0;

     LED3 = 1;
     delayms(100):
     LDE3 = 0;

     LED4 = 1;
     delayms(100):
     LDE4 = 0;

     LED5 = 1;
     delayms(100):
     LDE5 = 0;

     LED6 = 1;
     delayms(100):
     LDE6 = 0;

     LED7 = 1;
     delayms(100):
     LDE7 = 0;
   }

 }

第二种通过位移来实现

#include <reg52.h>
void delayms(unsigned int xms)
{
    unsigned int i,j;
    for(i=xms;i>0;i--)
         for(j=120;j>0;j--);
}
void main()
{
    P1=0x00;
    while(1)
    {          
       P1 = 0x01;
       delayms(400);
       i=0;
       for(;i<8;i++)
       {
            P1<<=1;
            delayms(400);
       }
       
    }
}

第三种方法要调用包含在单片机库文件<intrins.h>中的一个函数了

/*--------------------------------------------------------------------------
INTRINS.H

Intrinsic functions for C51.
Copyright (c) 1988-2004 Keil Elektronik GmbH and Keil Software, Inc.
All rights reserved.
--------------------------------------------------------------------------*/

#ifndef __INTRINS_H__
#define __INTRINS_H__

extern void          _nop_     (void);
extern bit           _testbit_ (bit);
extern unsigned char _cror_    (unsigned char, unsigned char);
extern unsigned int  _iror_    (unsigned int,  unsigned char);
extern unsigned long _lror_    (unsigned long, unsigned char);
extern unsigned char _crol_    (unsigned char, unsigned char);
extern unsigned int  _irol_    (unsigned int,  unsigned char);
extern unsigned long _lrol_    (unsigned long, unsigned char);
extern unsigned char _chkfloat_(float);
extern void          _push_    (unsigned char _sfr);
extern void          _pop_     (unsigned char _sfr);

#endif

在它的库中有上面的这些函数,我们一般用的最多的是_cror_ 循环右移       _crol_循环左移

具体的实现方法如下:

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

typedef unsigned char uchar;

void delay_Xms(uchar i)
{
	uchar x;
	while(i--)
	{
		for(x=116;x>0;x--);
	}
}

void main()
{	
	uchar k;
	P1=0x00;
	while(1)
	{
		P1=0x01;
		for(k=0;k<8;k++)
		{
			delay_Xms(6000);
			P1=_crol_(P1,1);
		}
	}
}


猜你喜欢

转载自blog.csdn.net/Ammon_Zhang/article/details/77853615