您的位置:首页 > 编程语言

如何用多种代码实现51单片机流水灯

2017-12-18 12:16 260 查看
用51单片机实现流水灯的方法有多种:普通电灯法,位移法,数组法。其次模拟电路的电流图也与点一盏LED相似。具体如下:

一   首先是最简单的代码:

#include <reg52.h>    //头文件

sbit led0=P0^0;       

sbit led1=P0^1;      // 定义八盏灯,并规定每个灯的io接口

sbit led2=P0^2;

sbit led3=P0^3;

sbit led4=P0^4;

sbit led5=P0^5;

sbit led6=P0^6;

sbit led7=P0^7;

void delay(void)    // 声明延迟函数

{

   unsigned char a,b;  //定义两个变量a,b

   for(a=0;a<200;a++)

   for(b=0;b<200;b++);   //这是两个for循环嵌套。用分号来区分。

   }                     // 每当a循环一次,b都要循环200次。同时200也是灯闪烁的时间。

  

void main()           //主函数

{

    led0=0;    //点亮第一个灯泡

 delay();    // 延时函数

 led0=1;    //熄灭灯泡

 delay();   //延时     通过这一系列过程实现闪烁

  

 led1=0;  

 delay();    

 led1=1;    

 delay();

  

 led2=0;    

 delay();  

 led2=1;    

 delay();

  

 led3=0;   

 delay();    

 led3=1;   

 delay();

  

 led4=0;    

 delay();   

 led4=1;    

 delay();

  

 led5=0;    

 delay();   

 led5=1;    

 delay();

  

 led6=0;    

 delay();

 led6=1;   

 delay();

  

 led7=0;   

 delay();           但是该方法存在弊端:需要一个个的定义变量。如果需要同时让许多灯点亮的话则不大方便。代码过于繁琐。因此可以使用其他两种方法

 led7=1;    

 delay();

 

 led8=0;   

 delay();    

 led8=1;    

 delay(); 

}

二  使用数组的方法点亮十六盏流水灯

#include <reg52.h>
unsigned char table[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0xff};  //宏函数    定义数组,这里的数组均是可以使其亮的顺序。因为

void delay(void)                                                                                     要使十六盏灯亮,所以需要在后面加上0xff(11111111)即全灭

{                                                                                                             如果不是需要十六盏则不需要加上最后一个数组。

   unsigned char a,b;            //声明函数,声明灯的闪烁情况,与上一个代码相同。

   for(a=0;a<200;a++)

   for(b=0;b<200;b++);            // for 语句循环嵌套

   }
void main()

{

 unsigned char i;

 while(1)         // while语句是为了使使循环持续进行

 {

 for(i=0;i<9;i++)   //定义一个i,

 {

 P0=table[i];    // i取值为数组中的值。依次点亮前八盏灯

  delay();    // 延迟

 }

 {

 for(i=0;i<9;i++)   // 继续赋值,继续点亮后8盏灯

 {

 P2=table[i];

  delay();

 }

}

 }

}
三 用位移的方法点亮八盏LED灯

#include "reg52.h"     // 此文件中定义了单片机的一些特殊功能寄存器

#include<intrins.h>   // 因此要用到左右移函数,所以加入这个头文件
typedef unsigned int u16;   // 对数据类型进行声明定义 

typedef unsigned char u8;
#define led P2    //将p2口定义为led 后面就可以用led代替p2口
delay延时函数,i=1,大约延时10us.
void main()

{

 u8 i;

 led=0xfe;

 delay(50000); //´óÔ¼ÑÓʱ450ms 

 while(1)

 { 

/*  for(i=0;i<8;i++)

  {

   P2=~(0x01<<i);  //将1右移一位,然后将结果取反赋值到P2

   delay(50000); //

  }

*/  

  for(i=0;i<;i++)  //左移一位

  {

   led=_crol_(led,1);

   delay(50000); // 

  }

  for(i=0;i<7;i++) //将led右移一位

  {

   led=_cror_(led,1);

   delay(50000); //大约延时450ms

  } 

 }  

}
最后用protues模拟点亮八盏流水灯:



可见电路原理与点亮一个LED的情况相似
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐