单片机交流
直播中

石玉兰

7年用户 1399经验值
私信 关注
[问答]

一种基于51单片机的流水灯实验

怎样去编写基于51单片机的流水灯实验代码?

回帖(1)

贾绰

2021-10-18 10:09:04
  【C语言】51单片机 流水灯
  基础知识
  
  举例说明:
  A=1 1 0 0 1 1 0 0
  B=1 1 1 1 0 0 0 0
  A&B=1 1 0 0 0 0 0 0
  A|B=1 1 1 1 1 1 0 0
  ~A=0 0 1 1 0 0 1 1
  A^B=0 0 1 1 1 1 0 0
  循环左移_crol_和循环右移_cror_:
  单片机有一个库文件已经写好了移位函数,储存在#include《intrins.h》库文件里。
  变量=crol(变量名,移动位数)
  P0= 0xfe; // 1111 1110
  P0=crol(P0,1);
  此时,P0=0xfd;//1111 1101
  七道题目的实现效果
  完整代码
  #include 《reg51.h》 //51单片机头文件
  #include 《intrins.h》 //包含循环移位指令的头文件
  #define uchar unsigned char //宏定义 unsigned char 为 uchar
  #define uint unsigned int //宏定义 unsigned int 为 uint
  ***it k1 = P3 ^ 2;
  ***it k2 = P3 ^ 3;
  ***it k3 = P3 ^ 4;
  ***it k4 = P3 ^ 5;
  void delay_us(uint us) //延时子程序
  {
  uint a; //声明变量a取值为0-65535
  for(a=0;a《us;a++);
  }
  void start_1() //第一题
  {
  uchar a,b;
  b=0xfe; //1111 1110
  for(a=0;a《7;a++) //从右到左
  {
  P0 = b;
  delay_us(50000);
  b=_crol_(b,1);
  }
  for(a=0;a《7;a++) //从左到右
  {
  P0 = b;
  delay_us(50000);
  b=_cror_(b,1);
  }
  }
  void start_2() //第二题
  {
  uchar a,b;
  b=0xfe; //1111 1110
  for(a=0;a《7;a++) //从右到左
  {
  P0 = 0xe7 & b; //1110 0111 & b
  delay_us(50000);
  b=_crol_(b,1);
  }
  for(a=0;a《7;a++) //从左到右
  {
  P0 = 0xe7 & b; //1110 0111 & b
  delay_us(50000);
  b=_cror_(b,1);
  }
  }
  void start_3() //第三题
  {
  uchar a,b,c;
  b=0x7f; //0111 1111
  c=0xfe; //1111 1110
  for(a=0;a《3;a++) //从两边到中间
  {
  P0 = b & c;
  delay_us(50000);
  b=_cror_(b,1);
  c=_crol_(c,1);
  }
  for(a=0;a《3;a++) //从中间到两边
  {
  P0 = b & c;
  delay_us(50000);
  b=_crol_(b,1);
  c=_cror_(c,1);
  }
  }
  void start_4() //第四题
  {
  uchar a;
  for(a=0;a《8;a++) //从左到右依次亮起
  {
  P0 = 0x7f 》》 a; //0111 1111 》》 a
  delay_us(50000);
  }
  for(a=0;a《8;a++) //从右到左依次灭掉
  {
  P0 = ~(0xff《《a); //1111 1111 《《 a 按位取反
  delay_us(50000);
  }
  }
  void start_5() //第五题
  {
  uchar a,b,c,d;
  c=0xff; //1111 1111
  for(i=0;i《9;i++)
  {
  b=0xfe; //1111 1110
  for(a=0;a《8;a++)
  {
  P0= b & c;
  delay_us(50000);
  b=_cror_(b,1);
  }
  c=c《《1;
  }
  }
  void start_6() //第六题
  {
  uchar a,b,c,d,e;
  b=0xfe; //1111 1110
  for(d=0;d《9;d++)
  {
  if(e》0)
  {
  b=_cror_(b,1);
  }
  a=0xfe; //1111 1110
  for(e=0;e《d+1;e++)
  {
  P0= c;
  delay_us(50000);
  a=_cror_(a,1);
  c= a & b;
  }
  }
  }
  void start_7() //第七题
  {
  uint a=0;
  uint b=500;
  uchar c=0x00; //0000 0000
  uchar d=0xff; //1111 1111
  while(b)
  {
  P0= c;
  delay_us(b--);
  P0= d;
  delay_us(a++);
  }
  while(a)
  {
  P0= c;
  delay_us(b++);
  P0= d;
  delay_us(a--);
  }
  }
  void main()
  {
  if(k1==0)
  {
  start_1();
  start_2();
  start_3();
  start_4();
  start_5();
  start_6();
  start_7();
  }
  }
举报

更多回帖

发帖
×
20
完善资料,
赚取积分