上一节说了单片机点亮一个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);
}
}
}