制作流水灯,一共有三种方式,分别是左右移位,延时,与定时器(计数器)方式

其中移位方式较为简便,常与简单的延时一同使用在各类工程中。除此之外,也可以直接操作寄存器改变灯的亮度。

延时方式通过改变占空比控制灯的亮度变化,也就是我们常说的pwm改变灯的亮度,但这种方式不适用于工程领域,需要进一步的优化,在我们这里只是讨论流水灯的制作方式,所以暂时不予考虑。

另外对于呼吸灯来说,也可以利用gpio的方式进行实现

定时器(计数器)方式适用于一些对时间精度要求很高的场合,其中可以使用12MHZ或11.0592MHZ晶振,12MHZ更适用于定时,11.0592MHZ则更适用于通信领域。


首先,我们用移位方式来完成花式流水灯的制作,利用proteus软件进行仿真,代码如下:

#include "reg52.h"
#include <intrins.h>
void delay(unsigned int n)
{unsigned int i=0,j=0;for(i=0;i<n;i++){for(j=0;j<120;j++);}
}
void led()
{unsigned int i;unsigned int j;unsigned int n;unsigned int m;P0=0x00;delay(1000);P0=0xff;delay(1000);for(j=0;j<2;j++){for(i=0;i<8;i++){P0=~(0x01<<i);delay(500);}for(i=0;i<8;i++){P0=~(0x80>>i);delay(500);}delay(1000);}for(j=0;j<2;j++){for(i=0;i<8;i++){P0=(0xfe<<i);delay(500);}for(i=0;i<8;i++){P0=~(0x7f>>i);delay(500);}delay(1000);}for(j=0;j<2;j++){n=0x01;m=0x80;for(i=0;i<4;i++){P0=~(n|m);delay(500);delay(500);n=n<<1;m=m>>1;}n=0x10;m=0x08;for(i=0;i<4;i++){P0=~(n|m);delay(500);delay(500);n=n>>1;m=m<<1;}delay(1000);}for(j=0;j<2;j++){n=0x01;m=0x80;for(i=0;i<4;i++){P0=~(n|m);delay(500);delay(500);n=(n|0x01)<<1;m=(m|0x80)>>1;}n=0x08;m=0x10;for(i=0;i<4;i++){P0=~(n|m);delay(500);delay(500);n=(n|0x08)>>1;m=(m|0x10)<<1;}delay(1000);}delay(3000);}
void main()
{while(1){led();}
}

视频可以在我知乎的同名文章中看到:

51单片机制作花式流水灯的三种方式总结与仿真运行 - 知乎 (zhihu.com)

我们可以看出它的效果先是从前到后,然后从后到前,之后叠加点亮,灯先是扩散向两边点亮,然后再聚集回到中间的灯。


之后是延时使用pwm方式,这种方式通过改变占空比改变灯的亮度,也就是我们所说的呼吸灯。程序如下:

#include "reg52.h"
#define uchar unsigned char
#define uint unsigned int
void delay(uint ms)
{uint i,j;for(i=ms;i>0;i++)for(j=114;j>0;j--);
}
void PWM(uchar k)
{uchar n;for(n=0;n<10;n++){P0=0xff;delay(k);P0=0x00;delay(10-k);}
}
void main()
{uchar t;while(1){for(t=1;t<10;t++)PWM(t);for(t=9;t>0;t--)PWM(t); }
}

这种方式,以100ms作为周期,改变灯的亮度,灯由暗变亮,又由亮变暗

不过proteus貌似仿真不了呼吸灯。。。所以这个暂时没有视频,之后快递邮到会把花式流水灯融合在其他项目里


最后是最精确的定时器方式,代码如下:

其中最大的定时时长是65.536ms,每次定时都是50ms

之所以清零取反两次,是因为每次都要保证50ms的间隔,如果只在开头取反,开头第一次与之后每次的间隔时间是不同的,这在定时计数等应用环境中是不允许出现的现象。

流水灯间隔的时间,为20*50ms=1000ms,也就是1s

#include <reg52.h>
#include <intrins.h>#define uchar unsigned char;
#define uint unsigned int;
int k=0;
char i,j,n,m;
void main()
{TMOD=0x01;TH0=(65536-50000)/256;TL0=(65536-50000)%256;TR0=1;P0=0x00;while(1){n=0x01;m=0x80;for(j=0;j<8;j++){P0=~n;while(k<20){while(TF0==0);TH0=(65536-50000)/256;TL0=(65536-50000)%256;TF0=0;//删除定时的语句k++;}k=0;n=n<<1;}for(j=0;j<8;j++){while(k<20){while(TF0==0);TH0=(65536-50000)/256;TL0=(65536-50000)%256;TF0=0;//删除定时的语句k++;}k=0;P0=~(0x80>>j);}}
}

效果其实就是流水灯,不过可以发现这次的间隔时间非常一致

51单片机制作花式流水灯的三种方式总结与仿真运行相关推荐

  1. 基于51单片机的八位流水灯(三种形式)

    写一下寒假做的51小项目. 基本项目 基于AT89C51的流水灯:流水灯共八个,可以实现交替闪烁,一起闪烁,左右流水灯等效果. 模式一:按动key1,实现1,3,5,7和2,4,6,8交替闪烁: 模式 ...

  2. 【51单片机】花式流水灯

    目录 任务要求: 1.按键 1.2.3.4 按下,使 8 个 LED 实现下面对应的模式 1. 2.        3.4,上电默认每种模式流水灯的流转时间间隔为 500ms. 1)模式1:按照L1. ...

  3. 用51单片机点亮流水灯

    用51单片机点亮流水灯的几种方法 1. 直接按位操作一个一个点亮 #include<reg51.h>//头文件 sbit LED0=P2^0; //位定义单片机接LED灯的端口 sbit ...

  4. 【DIY】多模式51单片机心形流水灯+呼吸灯+蜂鸣器音乐

    目录: 总体设计 1.基础硬件DIY设计 1)整体原理图 2)PCB电路 3)3D_PCB 2.单片机程序设计 1)呼吸灯[简易模拟PWM] 2)蜂鸣器音乐 3)几种简易流水灯方式 3.效果展示 1) ...

  5. 基于51单片机的花样流水灯设计

    文章目录 一.前言 二.模块介绍及原理说明 三.硬件连接 四.程序说明 五.效果演示 六.代码链接 一.前言 花样流水灯就是让LED灯按照一定规律进行各种变化,流水灯在生活中也随处可见,例如在建筑物的 ...

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

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

  7. 51单片机点亮流水灯

    51单片机点亮流水灯 51单片机点亮流水灯 首先介绍开发板easyboard上的LED灯 P1端口通过74HC573连接到LED灯,查询74HC573芯片手册,内部由8个D锁存器构成,当OE为低电平, ...

  8. 基于51单片机的花样流水灯设计(源码+仿真+设计报告)

    资料编号:113 采用51单片机的IO控制多个LED灯,实现多种模式的流水风,全套资料齐全:具体功能请看下方演示视频 113-基于51单片机的花样流水灯设计(源码+仿真+设计报告) 单片机最小系统介绍 ...

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

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

最新文章

  1. Python+Selenium 自动化-指定chrome驱动运行selenium实例演示,运行指定位置下的浏览器驱动
  2. win10组件服务计算机是红色的,KB4023057:Windows 10更新服务组件的更新
  3. 【❌❌vectorの奇技淫巧⭕⭕】C++ vector 如何正确处理动态申请内存的元素
  4. 关于JavaScript 数组 的一切
  5. python取两个列表的并集、交集、差集
  6. C# IntPtr类型和使用/unsafe选项编译程序
  7. 【Java】我的世界Java版外挂制作 [2] - 游戏内GUI
  8. kotlinx.serialization反序列化抽象类
  9. 百钱买小鸡/*公鸡5文钱1只,母鸡三文钱一只,小鸡一文钱三只。现在用100文钱共买了100只鸡,问这100只鸡中,公鸡,母鸡,小鸡各是多少只?
  10. 生活手机必备5款APP,一用就会上瘾,简直就是生活中的好帮手
  11. [项目记录]用vue-electron搭建pc网易云音乐程序(2)——搭建基本页面
  12. 为了追求梦想,真正的LabVIEW的编程大神离职了!
  13. 无线路由器打印机服务器设置,newifi新路由打印机服务器设置全教程
  14. UIdemo 制作一个简单的iPhone相册
  15. Omdia 表示,智能手机出货量下降 12.9%
  16. discuz论坛添加、更换返回顶部图标
  17. 计算机多系统启动光盘制作,多系统U盘启动盘制作方法图文介绍
  18. 如何在PowerPoint演示文稿中突出显示文本
  19. JS中的深拷贝与浅拷贝
  20. 树莓派怎么作为无线服务器,教大家用树莓派做一个无线路由器

热门文章

  1. CRC 的简介和应用(转载)
  2. Unity基础——动画编辑Animations、Animator
  3. 分支定价求解GAP问题
  4. flex与布局(基本网格布局、百分比布局、一侧固定一侧自适应、圣杯布局)
  5. 浙江大学求是科学班计算机,浙大校友网
  6. python-求阶乘算法
  7. 天地图引用及设置导航路线
  8. java事件适配器是接口吗,下列不属于java.event包中定义的事件适配器的是( )
  9. 中班音乐会跳舞的机器人_中班音乐《会跳舞的身体》
  10. 免费、开源、100页开发学习手册,学习GD32不可或缺的利器