查看: 2207  |  回复: 0
流水灯

主题

回复
发表于2018-12-15 17:30:29 | 显示全部楼层
1# 电梯直达
 制作流水灯,8个发光二极管LED0~LED7经限流电阻分别接至P1口的P1.0~P1.7引脚上,阳极共同接高电平。编写程序来控制发光二极管由上至下的反复循环流水点亮,每次点亮一个发光二极管。
参考程序:
#include <reg51.h>
#include <intrins.h> //包含移位函数_crol_(  )的头文件
#define uchar unsigned char  
#define uint unsigned int  
void  delay(uint i) //延时函数
{
uchar t;
  while (i--)
{
for(t=0;t<120;t++);
}
}
void  main(  ) //主程序
{
P1=0xfe; //向P1口送出点亮数据
    while (1)
   
delay( 500 );        //500为延时参数,可根据实际需要调整
P1=_crol_(P1,1) ;   // 函数_crol_(P1,1)把P1中的数据循环左移1位
    }
}

制作由上至下再由下至上反复循环点亮显示的流水灯,3种方法实现。
(1)数组的字节操作实现
    建立1个字符型数组,将控制8个LED显示的8位数据作为数组元素,依次送P1口。参考程序:
#include <reg51.h>
#define uchar unsigned char
uchar tab[ ]={ 0xfe , 0xfd , 0xfb , 0xf7 , 0xef , 0xdf , 0xbf , 0x7f , 0x7f , 0xbf , 0xdf , 0xef , 0xf7 ,  0xfb , 0xfd , 0xfe };  
                                     /*前8个数据为左移点亮 数据,后8个为右移点亮数据*/

void  delay(  )
{
uchar i,j;
    for(i=0; i<255; i++)
    for(j=0; j<255; j++);
}
void  main(  ) //主函数
{
uchar i;
  while (1)
  {
for(i=0;i<16; i++)
    {
P1=tab[i]; //向P1口送出点亮数据
    delay( ); //延时,即点亮一段时间
  }
  }
}

(2)移位运算符实现
     使用移位运算符“>>”、“<<”,把送P1口显示控制数据进行移位,从而实现发光二极管依次点亮。参考程序:
#include <reg51.h>
#define uchar unsigned char  
void  delay(  )
{
uchar i,j;
  for(i=0; i<255; i++)
  for(j=0; j<255; j++);
}
void  main(  ) //主函数
{
uchar i,temp;
    while (1) 
{
      temp=0x01; //左移初值赋给temp
for(i=0; i<8; i++)
{
                   P1=~temp; // temp中的数据取反后送P1口
      delay(  ); // 延时
      temp=temp<<1; // temp 中数据左移一位
}
temp=0x80; // 赋右移初值给temp
for(i=0; i<8; i++)
{
                   P1=~temp; // temp中的数据取反后送P1口 
      delay(  ); // 延时
      temp=temp>>1; // temp 中数据右移一位
}
  }
}

(3)用循环左、右移位函数实现
     使用C51提供的库函数,即循环左移n位函数和循环右移n位函数,控制发光二极管点亮。参考程序:
#include <reg51.h>
#include <intrins.h>     //包含循环左、右移位函数的头文件
#define uchar unsigned char
void  delay(  )
{
uchar i,j;
  for(i=0; i<255; i++)
for(j=0; j<255; j++);
}
void  main(  ) // 主函数
{
uchar i,temp;
  while (1)
  {
              temp=0xfe; // 初值为11111110
  for(i=0; i<7; i++)

 {
    P1=temp; // temp中的点亮数据送P1口,控制点亮显示
      delay(  ); // 延时
      temp=_crol_( temp,1) ; //  temp 数据循环左移1位
  }
for(i=0; i<7; i++)
{
P1=temp; // temp中的数据送P1口输出
  delay(  ); // 延时
  temp=_cror_( temp,1) ; //temp中数据循环右移1位
  }
   }
}



主题

回复
  • 温馨提示: 标题不合格、重复发帖、发布广告贴,将会被删除帖子或禁止发言。 详情请参考: 社区发帖规则
  • 您当前输入了 0 个文字。还可以输入 8000 个文字。 已添加复制上传图片功能,该功能目前仅支持chrome和火狐

禁言/删除

X
请选择禁言时长:
是否清除头像:
禁言/删除备注:
昵 称:
 
温馨提示:昵称只能设置一次,设置后无法修改。
只支持中文、英文和数字。

举报

X
请选择举报类型:
请输入详细内容:

顶部