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

用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的情况相似

  • 16
    点赞
  • 67
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值