流水灯的几种实现方法

  • 一、暴力法
  • 二、数组法
  • 三、循环左移法

一、暴力法

直接对P1寄存器的每一位进行重命名,然后点亮第一个——>延时——>熄灭第一个、点亮第二个——>延时——>熄灭第二个、点亮第三个——>延时…


//暴力法流水灯#include <reg52.h>
#define uint unsigned int
void delay_ms(uint);
sbit led1=P1^0; //位操作
sbit led2=P1^1;
sbit led3=P1^2;
sbit led4=P1^3;
sbit led5=P1^4;
sbit led6=P1^5;
sbit led7=P1^6;
sbit led8=P1^7;
void main()
{while(1)//流水灯的实现{led1=0;delay_ms(1000);led1=1;led2=0;delay_ms(1000);led2=1;led3=0;delay_ms(1000);led3=1;led4=0;delay_ms(1000);led4=1;led5=0;delay_ms(1000);led5=1;led6=0;delay_ms(1000);led6=1;led7=0;delay_ms(1000);led7=1;led8=0;delay_ms(1000);led8=1;  }
}void delay_ms(uint ms) //带参数延时函数
{uint i,j;for(i=ms;i>0;i--)for(j=110;j>0;j--);
}

二、数组法

对上图,分别点亮第一个、第二个…得到P1寄存器的状态,用16进制表示为:0xfe、0xfd、0xfb、0xf7、0xef、0xdf、0xbf、0x7f(上图二进制,下面是高位,从下往上读),将这八个状态值放数组中,利用循环,依次给P1赋值,实现流水灯。

代码如下:

#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
void delay_ms(uint );
uchar num;
uchar code table[]={//P1寄存器状态值
0xfe,0xfd,0xfb,0xf7,
0xef,0xdf,0xbf,0x7f};
void main()
{P1=0xff;
while(1)
{for(num=0;num<8;num++){P1=table[num];delay_ms(1000);P1=0xff;// delay_ms(50);}
}
}void delay_ms(uint ms) //带参数延时函数
{uint i,j;for(i=ms;i>0;i--)for(j=110;j>0;j--);
}

三、循环左移法

点亮第一个流水灯后P1寄存器的状态为:11111110,将其循环左移一位后:11111101,此时是点亮第二个LED灯时P1的状态,如此反复循环左移实现流水灯。
(循环左移实现正流水灯,循环右移实现倒流水灯)

实现循环左移的函数是_crol_(a,1),循环右移的函数为:cror(a,1),可以理解为cross left 和cross right 的缩写,其中a是寄存器P1的状态值,1表示左移/右移1位,把“1”改为“2”,则表示循环左移/右移2位。

这个函数是带返回值的函数,返回位移后的值,例如:
a=11111110;
a=_ crol_(a,1);
此时a=11111101

需要注意的是,使用循环移位时需要包含头文件:#include <intrins.h>

代码如下:


//使用循环左移实现流水灯
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
uchar a;
void delay_ms(uint);
void main()
{a=0xfe;while(1){P1=a;a=_crol_(a,1);delay_ms(1000);  }
}
void delay_ms(uint ms) //带参数延时函数
{uint i,j;for(i=ms;i>0;i--)for(j=110;j>0;j--);
}

51单片机(二)流水灯的几种实现方法相关推荐

  1. 简单51单片机c语言编程流水灯,51单片机如何实现流水灯?51单片机实现流水灯的三种方法详细分析...

    描述 首先,介绍下原理.下图为主控芯片和流水灯模块的原理图.流水灯模块接在单片机的P1口,由原理图可以知道,在P1口给一个低电平即可点亮LED灯.相反,如果要LED灯熄灭,就要把P1口的电平变为高电平 ...

  2. 51单片机循环流水灯源码

    51单片机循环流水灯源码 #include <reg52.h> #include <intrins.h> void delay(unsigned char a) {unsign ...

  3. 51单片机:流水灯蜂鸣器控制

    //51单片机:流水灯&蜂鸣器控制 //bglei@nuaa.edu.cn 2022/8/28<流水灯&蜂鸣器控制> #include<reg52.h> #in ...

  4. 51单片机流水灯的三种实现方法

    首先,介绍下原理.下图为主控芯片和流水灯模块的原理图.流水灯模块接在单片机的P1口,由原理图可以知道,在P1口给一个低电平即可点亮LED灯.相反,如果要LED灯熄灭,就要把P1口的电平变为高电平即可. ...

  5. 【单片机基础】stc89c52单片机实现流水灯的三种编程方式

    效果图 实现流水灯的第一种方式 /* 来回点亮LED的第一种方法 */ #include <reg52.h>//包含51一些特殊功能寄存器 #define uchar unsigned c ...

  6. 基于51单片机的流水灯设计

    三个按键:A按键启动.B按键控制不同流水速度(低中高).C按键 设计思路一(未用中断): 8个LED灯正极解电源,负极接单片机I/O口. 死循环:设置P2口为11111110,使用左移函数,循环七次. ...

  7. 51单片机LED流水灯、走马灯的实现

    目录 1. 硬件设计 2. 软件设计 流水灯: 跑马灯: 1. 硬件设计 流水灯的原理: 图中主要包括51单片机芯片和流水灯模块,流水灯模块接在了单片机的P2口,500欧电阻是用来保护电路的.由原理图 ...

  8. 流水灯c语言程序tm,51单片机LED流水灯课程设计任务书+论文

    郑州工程技术学院课程设计 设计题目:LED流水灯设计 学    院:机电与车辆工程学院 专    业:16电气自动化技术专业班 级普招二班 姓    名:王*&刘* 指导教师:李* 日    ...

  9. 51单片机花样流水灯

    目录 工作原理 51代码 总结 工作原理 许多单片机上面都有若干LED灯,在控制系统的控制下能够按照设定的顺序和时间点亮和熄灭,形成一定的视觉效果叫做跑马灯.其中若干个LED灯依次点亮,在视觉上感觉灯 ...

最新文章

  1. 在python中使用关键字define定义函数_python自定义函数def的应用详解
  2. rpm出现error: %preun( ) scriptlet failed, exit status 1问题
  3. java实现上传功能吗_Java实现文件上传功能
  4. python中的ord函数
  5. SyncStudy Poster
  6. 石头扫地机器人离线了怎么办_关于激光头故障,石头扫地机器人无限次复活记!...
  7. QT Creator常用快捷键
  8. 数据结构---简单插入排序
  9. libvirt- Virsh 所有命令详单
  10. php xdebug 中文手册,Xdebug文档(四)函数跟踪
  11. Madagascar的自定义浮点型函数--绝对值函数和最值函数
  12. gps 捕获 matlab,基于FFT的GPS信号快速捕获方法
  13. matlab简单分析短时傅里叶变换STFT
  14. jQuery实现回车绑定Tab事件
  15. 详解Haar特征与AdaBoost方法原理
  16. python入门区块链技术_区块链教程
  17. 模电——极性电容与非极性电容的异同
  18. 解决Chrome浏览器无法加载flash插件的问题
  19. 解决 3 errors and 0 warnings potentially fixable with the `--fix` option.问题
  20. 学计算机网络技术遇到问题,维护计算机网络教室的常见问题及解决方案

热门文章

  1. ChatGPT4已经来了,30秒做一个弹球游戏!
  2. chkdsk命令参数介绍
  3. 陈亮能否成为继阿甘、老王之后,另一个美团灵魂人物?
  4. PHP CURL 请求
  5. Jeff Dean万字总结!图解谷歌2022年AIGC、LLM、CV三大领域成就
  6. mysql 存储过程中的 prepare语句
  7. 内容定位,什么类型短视频更受欢迎
  8. mysql NDB的安装配置使用示例
  9. FOMO游戏代码解析
  10. 测试开发工程师到底是做什么的?你真的知道吗