高级流水灯--水滴效果(渐变带拖尾效果)实现和讲解

合集下载

PS高级技巧教你制作逼真的水滴和水珠效果

PS高级技巧教你制作逼真的水滴和水珠效果

PS高级技巧教你制作逼真的水滴和水珠效果在Photoshop中,我们可以利用一些高级技巧来制作逼真的水滴和水珠效果。

这些效果可以为我们的设计和照片增添真实感和立体感。

本文将介绍一些方法和步骤,帮助你实现这些效果。

第一步,创建一个新的图层并选择适当的颜色。

首先,我们需要创建一个新的图层来制作水滴或水珠。

在工具栏中选择“新建图层”按钮,并确保其位于原始图层之上。

然后,选择一个合适的颜色作为你想要制作的水滴或水珠的颜色。

第二步,使用椭圆或圆形工具绘制基本形状。

在新创建的图层上,选择椭圆或圆形工具,根据你想要的水滴或水珠的形状和大小,在画布上绘制一个基本形状。

记住,水滴通常呈椭圆形,而水珠则更圆。

第三步,应用渐变和阴影效果。

使用渐变工具为水滴或水珠的形状添加高光和阴影效果。

选择渐变工具,在工具选项栏中选择“渐变”选项,并选择一个合适的渐变样式。

然后,从形状的底部向上拖动渐变工具,使形状的底部颜色较浅,逐渐变深。

这将营造出形状的立体感。

第四步,添加水滴或水珠的细节。

为了使水滴或水珠更逼真,我们可以添加一些细节。

使用钢笔工具或任何其他合适的选择工具,创建一些小的形状来表示水滴或水珠上的反射光。

这些小形状可以是椭圆形或圆形,根据需要调整大小和位置。

然后,使用渐变工具添加透明度,使这些小反射光看起来更自然。

第五步,在形状上添加水纹效果。

为了增添水滴或水珠的真实感,我们可以通过添加水纹效果来模拟水滴或水珠表面的纹理。

在形状的图层上,选择“滤镜”>“噪点”>“添加噪点”,调整参数以添加适量的噪点效果。

然后,选择“滤镜”>“模糊”>“高斯模糊”,调整参数以使噪点看起来更柔和。

第六步,调整整体效果。

最后,我们可以通过一些调整层和滤镜来进一步改善水滴或水珠的效果。

例如,我们可以添加适量的曲线调整层以调整亮度和对比度,或者使用“滤镜”>“模糊”>“径向模糊”来模拟水滴或水珠在焦点之外的模糊效果。

单片机流水灯与呼吸灯结合-滴水灯程序及详细教程(转载)

单片机流水灯与呼吸灯结合-滴水灯程序及详细教程(转载)

单片机流水灯与呼吸灯结合-滴水灯程序及详细教程(转载)TWAS手把手教你做呼吸灯-基于51单片机学习板内容比较简单,发这个贴主要是针对新手!什么是呼吸灯?顾名思义,灯光在微电脑控制之下完成由亮到暗的逐渐变化,感觉像是在呼吸。

用专业的话来说是通过控制PWM的占空比来完成对LED亮度的控制什么是PWM和占空比?脉冲宽度调制(Pulse Width Modulation,简称PWM),是利用微处理器的数字输出来对模拟电路进行控制的一种技术。

占空比:高电平在一个周期之内所占的时间比率。

呼吸灯原理当一颗LED在高速闪烁,闪烁的频率已经超过了人眼的感知的范围,那么我们看到这颗LED就是一直亮的,也就是视觉暂留现象(余晖效应)。

如果我们控制一次闪烁中亮和灭的时间(修改占空比),就可以控制亮度。

代码实现:/******************************************************** 程序名称:main.c* 程序功能:实现呼吸灯的主程序文件* 程序作者:TWAS* 创建时间:2015-1-22* 修改时间:* 程序版本:V0.1*******************************************************//* 包含的头文件 */#include <reg52.h>/* 寻址变量定义 */sbit LED_Drive = P3^5; /* 定义驱动LED的IO口,LED为共阳 *//******************************************************* 函数名称:main* 函数功能:主函数* 入口参数:NULL* 出口参数:NULL*******************************************************/int main(){unsigned char i;/* 初始化 */LED_Drive = 1;/* 主循环 */while(1){for(i = 0; i < 200; i++){/* 外边的for循环共循环200次,前面10次点亮LED,后面180次熄灭LED* 通过修改if后面的值,就可以改变占空比*/if(i < 10){LED_Drive = 0;}else{LED_Drive = 1;}}}return 0;}/******************************************* 程序结束*****************************************/可以明显看出我们所控制的LED比电源灯暗许多,既然我们会控制亮度,想实现呼吸灯也就变的简单了代码实现:(为了节约空间和界面简洁,只贴出主要实现的部分)int main(){unsigned char i;unsigned char ucNum = 0; /* 新增两个变量,ucNum 控制占空比*/bit bAdd = 1; /* bAdd选择是增大占空比还是减小占空比 *//* 初始化 */LED_Drive = 1;/* 主循环 */while(1){for(i = 0; i < 200; i++){/* 外边的for循环共循环200次,前面10次点亮LED,后面180次熄灭LED* 通过修改if后面的值,就可以改变占空比*/if(i < ucNum){LED_Drive = 0;}else{LED_Drive = 1;}}/* 选择是增大占空比还是减小占空比 */if (1 == bAdd){ucNum++;}else{ucNum--;}/* 当Num等于200也就是最大值时,bAdd置0,Num开始减小*/if (200 == ucNum){bAdd = 0;}/* 当Num等于200也就是最大值时,bAdd置1,Num开始增大*/else if (0 == ucNum){bAdd = 1;}}return 0;}由于图片看不到效果,这个地方就不贴图了,根据测试,我们的所需要的功能实现了!但是这时候有的人就有疑问了,这是很普通的LED,那如果是特殊一点的呢?比如我所用的学习板上面,16颗LED是用595驱动的,那呼吸灯又该如何实现呢?其实很简单,我们把驱动LED的函数封装一下,直接替换,其它不变就行了!代码实现:(为了节约空间和界面简洁,只贴出主要实现的部分)for(i = 0; i < 200; i++){/* 外边的for循环共循环200次,前面10次点亮LED,后面180次熄灭LED* 通过修改if后面的值,就可以改变占空比*/if(i < ucNum){DriveLED(0x0003); /* LED驱动,点亮D1和D2 */}else{DriveLED(0x0002); /* LED驱动,熄灭D1点亮D2 */}}当我把程序改成这样的时候,出了一点问题,不能呼吸,变成闪烁了!等等,先把LED驱动部分发一下:/******************************************************* 函数名称:SendData* 函数功能:74HC595数据的发送* 入口参数:unsigned int uiDataOne, unsigned int uiDataTwo * 出口参数:void*******************************************************/void SendData(unsigned char ucDataOne, unsigned char ucDataTwo){unsigned int i = 0;/* 将片选信号置为低电平 */HC595RCK = 0;/* 输入第一个数据:uiDataOne */for (i = 0; i < 8; i++){/* 给出脉冲信号,首先将CLK置为0 */HC595CLK = 0;if (0 != (ucDataOne & 0x80)){HC595DATA = 1;}else{HC595DATA = 0;}/* 给出脉冲信号,首先将CLK置为1 */HC595CLK = 1;/* 准备第二个数据 */ucDataOne = ucDataOne << 1;}/* 输入第二个数据:uiDataTwo */for (i = 0; i < 8; i++)/* 给出脉冲信号,首先将CLK置为0 */HC595CLK = 0;if (0 != (ucDataTwo & 0x80)){HC595DATA = 1;}else{HC595DATA = 0;}/* 给出脉冲信号,首先将CLK置为1 */HC595CLK = 1;/* 准备第二个数据 */ucDataTwo = ucDataTwo << 1;}/* 将片选信号置为高电平 */HC595RCK = 1;}/******************************************************** * 函数名称:DriveLED* 函数功能:595驱动程序是分两个数据发的,* 本函数把它合并成一个数据* 入口参数:uiData:16颗LED需要显示的数据* 出口参数:NULL*******************************************************/ void DriveLED(unsigned int uiData)SendData(uiData >> 8,uiData);}继续刚刚的问题,呼吸灯变成闪烁了,怎么回事呢?在程序逻辑上是没有问题的,我们只是更改了LED的驱动部分,看来就是LED驱动的问题了!先来Debug看一下,执行DriveLED这个函数,时间是接近400微妙,循环200次,就是差不多80毫秒,那么LED的闪烁频率为12.5HZ(都是大概的值,没有精确计算),还不足以形成视觉暂留现象。

如何用Photoshop制作水滴效果

如何用Photoshop制作水滴效果

如何用Photoshop制作水滴效果Photoshop是一款功能强大的图片处理软件,拥有众多工具和功能,让用户能够创造出令人惊叹的效果。

其中之一是制作水滴效果,通过逼真的光影效果,可以使图片看起来更加生动和立体。

下面将介绍一种简单的方法来制作水滴效果。

在使用Photoshop之前,确保已经打开一张需要添加水滴效果的图片。

我们将使用以下步骤来完成整个过程。

第一步,选择橢圆工具(Elliptical Marquee Tool)。

在工具栏中找到橢圆工具,或者按下键盘上的M键来快速切换到橢圆工具。

第二步,使用橢圆工具在图片上创造一个合适大小的圆形选择区域。

这个选择区域将会成为水滴的底部。

第三步,创建一个新的图层。

在菜单栏中选择“图层”(Layer)然后选择“新建”(New)来创建一个新图层。

确保将新图层放在原始图片的下方。

第四步,选择渐变工具(Gradient Tool)。

在工具栏中找到渐变工具,或者按下键盘上的G键来快速切换到渐变工具。

第五步,选择合适的渐变颜色。

点击渐变颜色栏,选择一个白色至透明的线性渐变。

第六步,稍微点击并拖动渐变工具在水滴底部的圆形选择区域上。

这会创建一个倒置的渐变,模拟水滴的透明度。

第七步,取消选择。

在菜单栏中选择“选择”(Select),然后选择“取消选择”(Deselect)来取消之前的选择。

第八步,调整水滴的形状。

使用自由变换工具(Free Transform Tool)来调整水滴的形状和大小。

点击菜单栏中的“编辑”(Edit),然后选择“自由变换”(Free Transform),或者按下键盘上的Ctrl+T快捷键。

通过拖动和调整控制点来达到想要的形状。

第九步,添加光晕效果。

选中水滴图层,然后点击图层样式(Layer Style)按钮,选择“内阴影”(Inner Shadow)。

调整阴影的大小、距离、角度和透明度,以使水滴看起来更加逼真。

第十步,调整光线效果。

选中水滴图层,然后点击图层样式按钮,选择“渐变叠加”(Gradient Overlay)。

如何使用Adobe Premiere Pro制作滴水效果

如何使用Adobe Premiere Pro制作滴水效果

如何使用Adobe Premiere Pro制作滴水效果在视频制作中,滴水效果是一种常用的特效,能够增加画面的趣味性和视觉效果。

Adobe Premiere Pro是一款专业的视频编辑软件,可以帮助我们实现各种特效。

下面将教您如何使用Adobe Premiere Pro制作滴水效果。

第一步:导入素材首先,打开Adobe Premiere Pro软件。

在项目面板中,将要使用的视频素材导入到软件中。

可以通过拖拽或点击菜单栏中的“文件-导入”命令来实现。

第二步:创建水滴效果在时间轴上找到您要添加滴水效果的视频素材,并将其拖拽到源监视器中。

接下来,点击源监视器右上角的“效果控制”面板,可以看到各种特效的选项。

第三步:调整特效参数接下来,在“效果控制”面板中,选择“效果-视频效果-填充/内支撑”特效。

然后,在“效果控制”面板中,点击“浏览”按钮,选择一张水滴图像作为填充。

在“填充/内支撑”特效的参数面板中,可以对水滴的大小、透明度、位置等进行调整。

通过改变这些参数,可以根据自己的需求来制作出理想的滴水效果。

第四步:调整关键帧如果想要制作一个动态的滴水效果,可以使用“关键帧”功能来控制水滴的运动。

选中时间轴上的视频素材,在左边的“效果控制”面板中点击“关键帧”按钮。

然后,在时间轴上选择一个关键帧位置,再次调整水滴的参数。

通过在不同位置添加关键帧并调整参数,可以实现水滴在视频中自由移动的效果。

可以根据需要添加多个关键帧来制作复杂的滴水动画。

第五步:渲染和导出当所有的调整都完成后,可以进行渲染,并导出制作完成的视频。

点击菜单栏中的“文件-导出”命令,选择合适的输出格式和设置,然后点击“导出”按钮即可。

总结:通过以上步骤,我们可以利用Adobe Premiere Pro软件制作出逼真的滴水效果。

除了滴水效果,Adobe Premiere Pro还可以实现许多其他的特效制作,例如转场效果、颜色调整等等。

掌握这些技巧可以帮助我们提高视频制作的质量和创意。

AE水滴渲染特效制作指南打造逼真的水滴效果

AE水滴渲染特效制作指南打造逼真的水滴效果

AE水滴渲染特效制作指南打造逼真的水滴效果AE水滴渲染特效制作指南——打造逼真的水滴效果Adobe After Effects(简称AE)是一款专业的动画制作软件,广泛应用于电影、电视、广告等领域。

在AE中,制作逼真的水滴效果可以为场景增添生动和立体感。

本文将为您详细介绍AE中水滴渲染的制作方法和技巧,帮助您打造出令人惊叹的水滴效果。

一、准备素材首先,我们需要准备好所需要的素材,包括背景图像、水滴图像和相关的效果素材。

背景图像应选取具有明亮、清晰的特点,以突出水滴的效果。

水滴图像可以通过拍摄实物水滴,或者通过网络下载高质量的水滴图片。

效果素材可以是一些涟漪、光泽等特效。

二、合成背景在AE中创建一个新的合成,将背景图像导入到合成中。

根据需要,可以调整图像的大小和位置,以使其与合成的尺寸和布局相匹配。

三、制作水滴1. 导入水滴图像将水滴图像导入到AE中,并将其拖放到背景图像所在的合成中。

根据需要,可以调整水滴图像的大小和位置。

可以使用AE中的“缩放”和“位置”属性来处理。

2. 添加透明度效果选中水滴图像的层,并在“效果控制”面板中找到“色彩校正”效果。

在“色彩校正”效果中,调整图像的透明度参数,使其透明度适合实际情况。

3. 添加阴影效果为了增加水滴的真实感,可以给水滴添加一些阴影效果。

在AE中,可以使用“投影”效果来实现这一目标。

选中水滴图像的层,并在“效果”菜单中找到“视觉效果”下的“投影”效果。

通过调整投影效果的参数,如颜色、强度和位置,使水滴看起来更加真实。

四、添加特效为了进一步增强水滴效果,我们可以添加一些特效素材,如涟漪和光泽效果。

这些素材可以在网络或AE资源库中找到。

1. 添加涟漪效果将涟漪素材导入到AE中,并将其放置在水滴图像层的上方。

调整素材的大小和位置,以使其恰好覆盖水滴。

然后,选择涟漪素材的层,并在“效果”菜单中找到“仿射变换”效果。

通过调整“仿射变换”效果的参数,如位置、旋转和缩放,使涟漪效果与水滴的形状相匹配。

制作逼真水滴与湿润效果的Photoshop教程

制作逼真水滴与湿润效果的Photoshop教程

制作逼真水滴与湿润效果的Photoshop教程在PhotoShop软件中,我们可以利用各种技巧和工具制作逼真的水滴和湿润效果。

下面就给大家分享一些简单而实用的方法。

一、制作水滴效果1. 首先,打开一个需要添加水滴效果的图片。

选择一个要添加水滴的位置。

2. 在工具栏中选择"椭圆选框工具",然后在图片上创建一个适合大小的椭圆。

3. 然后在顶部菜单中选择"滤镜"->"变形"->"球面化",将水滴形状变得更加真实。

4. 接下来,在顶部菜单中选择"编辑"->"自由变换",调整水滴的形状和大小,使其更加逼真。

5. 在图层面板中,选择水滴图层,然后选择合适的布尔运算模式(如"正常"或"叠加")来调整水滴的亮度和透明度。

6. 最后,在图层面板中,选择"新建图层",然后使用"画笔工具"或"渐变工具"添加一些高光和阴影效果,以增加水滴的逼真感。

二、制作湿润效果1. 打开一张需要添加湿润效果的图片。

选择要添加湿润效果的区域。

2. 在工具栏中选择"椭圆选框工具"或"多边形选框工具",然后在图片上创建一个适合大小的选区。

3. 在图层面板中,选择"新建图层",然后选择"渐变工具"。

在渐变工具选项中,选择一个合适的渐变色,如淡蓝色或浅灰色。

4. 在选区内使用渐变工具从中心向外拉出一个渐变。

可以根据需要调整渐变的角度和形状,使其看起来更加自然。

5. 接下来,在图层面板中选择"新建图层",然后使用"画笔工具"或"渐变工具"添加一些透明度和颜色变化,以增加湿润感。

高级流水灯_水滴效果

高级流水灯_水滴效果

高级流水灯--水滴效果(渐变带拖尾效果)实现和讲解[复制链接]spark5115主题好友124积分注册会员莫元111•发消息电梯直达1楼发表于 2011-12-6 09:03:44|只看该作者|倒序浏览简介学习嵌入式第一个例子通常都是控制一个LED亮灭,然后是花样繁多的流水灯,但不管灯的花样如何变化,单个LED的亮度没有变化,只有亮、灭两个状态,本章我们实现如何控制LED的亮度。

1 什么是PWM脉冲宽度调制(Pulse Width Modulation,简称PWM),是利用微处理器的数字输出来对模拟电路进行控制的一种技术。

在本章的应用中可以认为PWM就是一种方波。

比如图1:(原文件名:120611_0.png)图1 方波是周期为10ms,占空比为60%的PWM。

占空比:高电平在一个周期之内所占的时间比率。

2 硬件设计在例说51单片机的第三章,我们讲过如何控制开发板上LED的亮灭。

首先译码器输出端LEDS6为低,T10导通,给8个LED供电,然后通过缓冲器8个输出端BD0~BD7的控制LED的亮灭(低亮高灭)。

(原文件名:120611_1.png)图2 LED硬件连接如果BD口输出高低不断变化,则LED会闪烁;如果这种高低电平变化非常快,由于人的视觉暂留现象,LED就会出现不同的亮度。

3 软件设计3.1 PWM能否控制亮度下面我们就用实践验证PWM是否能够控制LED的亮度,测试代码如下:程序清单L1:验证PWM能否控制LED的亮度1 #include <reg52.h>2 #include "my_type.h"3 #include "hw_config.h"456 void main(void)7 {8 u8 i = 0;910 //使能独立LED的供电,即LEDS6输出低电平11 LEDEN = 0;12 ADDR0 = 0;13 ADDR1 = 1;14 ADDR2 = 1;15 ADDR3 = 1;1617 //第一个LED亮18 P0 = 0xFE;1920 while(1)21 {22 for(i=0; i<250; i++)23 {24 if(i<10)25 {26 P0 &= 0xFD; //第二个灯亮27 }28 else29 {30 P0 |= 0x02; //第二个灯灭31 }32 }33 }34 }L1(22-32):这段代码实现P0.1输出占空比为96%的方波,而P0.0恒为低。

高级流水灯--水滴效果渐变带拖尾效果实现和讲解

高级流水灯--水滴效果渐变带拖尾效果实现和讲解

下载验证:从开发板上可以看到运行效果,从 D1 到 D8 的亮度逐渐增大。 3.3 水滴下落效果 根据 PWM 可控制 LED 亮度的原理,我们用 8 个 LED 实现水滴下落的效果。第一步,水滴 逐渐变大,用 D1 从暗变亮模拟;第二步,水滴下落,带有拖尾效果,LED 逐个亮,移动速 度加快,且越靠前的 LED 亮度越大。 程序清单 L3 水滴流水灯 1 #include <reg52.h> 2 #include "hw_config.h" 3 #include "my_type.h"
如果 BD 口输出高低不断变化,则 LED 会闪烁;如果这种高低电平变化非常快,由于人的 视觉暂留现象,LED 就会出现不同的亮度。 3 软件设计 3.1 PWM 能否控制亮度 下面我们就用实践验证 PWM 是否能够控制 LED 的亮度,测试代码如下: 程序清单 L1: 验证 PWM 能否控制 LED 的亮度 1 #include <reg52.h> 2 #include "my_type.h" 3 #include "hw_config.h" 4 5 6 void main(void) 7{ 8 u8 i = 0; 9 10 //使能独立 LED 的供电,即 LEDS6 输出低电平 11 LEDEN = 0; 12 ADDR0 = 0; 13 ADDR1 = 1; 14 ADDR2 = 1; 15 ADDR3 = 1; 16 17 //第一个 LED 亮 18 P0 = 0xFE; 19 20 while(1) 21 { 22 for(i=0; i<250; i++) 23 { 24 if(i<10) 25 { 26 P0 &= 0xFD; //第二个灯亮 27 } 28 else 29 { 30 P0 |= 0x02; //第二个灯灭 31 } 32 } 33 } 34 } L1(22-32):这段代码实现 P0.1 输出占空比为 96%的方波,而 P0.0 恒为低。 P0.1 输出如图 3 所示(受纸张限制,图中高低电平长度比例和实际有偏差) 。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
图3 下载验证:从开发板上可以看到运行效果,D1 比 D2 亮。(这里说明一点:当 P0 输出低电平时, LED 亮,所以,PWM 的占空比越小越亮)。 3.2 产生 8 个亮度级别
3.1 节的例子证实了我们的设想,PWM 可控制 LED 的亮度,下面我们设计几组占空比不 同的 PWM,看看对 LED 亮度的控制效果。代码如下: 程序清单 L2:不同占空比对 LED 亮度的控制 #include <reg52.h> #include "hw_config.h" #include "my_type.h"
void timer0_init(void)
{
TMOD = 0x01;
//运行模式 1
TH0 = 0xFF; //10us 中断
TL0 = 0xFA;
EA = 1;
//开启中断ET0 = 1;T来自0 = 1;//启动定时器
}
/************************************************************ 函数名称:timer0_overflow 功 能:定时器 0 溢出中断 ************************************************************/ void timer0_overflow(void) interrupt TIMER0_OVERFLOW {
图 2 LED 硬件连接
如果 BD 口输出高低不断变化,则 LED 会闪烁;如果这种高低电平变化非常快,由于人的视觉 暂留现象,LED 就会出现不同的亮度。 3 软件设计 3.1 PWM 能否控制亮度
下面我们就用实践验证 PWM 是否能够控制 LED 的亮度,测试代码如下: 程序清单 L1: 验证 PWM 能否控制 LED 的亮度 #include <reg52.h> #include "my_type.h" #include "hw_config.h"
//亮度级别表 code u8 LightLevel[8]={0,1,2,4,8,16,32,64};
void main(void) {
u8 i = 0; u8 j = 0; u8 k = 0; u8 temp = 0;
//使能独立 LED 的供电,即 LEDS6 输出低电平 LEDEN = 0; ADDR0 = 0; ADDR1 = 1; ADDR2 = 1; ADDR3 = 1;
void main(void) {
u8 i = 0;
//使能独立 LED 的供电,即 LEDS6 输出低电平 LEDEN = 0; ADDR0 = 0; ADDR1 = 1; ADDR2 = 1; ADDR3 = 1;
//第一个 LED 亮 P0 = 0xFE;
while(1) {
for(i=0; i<250; i++) //第 22 行 {
图6 图中的红色面积代表亮度程度。实现流水效果的方法就是:让所有的亮度依次经过在所有 LED, 如图 7:
图7 状态的持续时间从 0-15 逐渐减小,以模拟水滴加速。 下载验证:下载到开发板上,可以看到水滴下落效果。 3.4 定时器产生 PWM
前面 3 个例子中,我们用循环语句虽然能产生占空比不同的 PWM,但 PWM 的周期不好 控制,对此,我们学习如何用定时器产生特定周期 PWM。关于 8051 定时器的使用方法,大 家可以参考例说 51 单片机的 4 章和 5 章。 我们用定时器 0 产生 PWM,代码如下: 程序清单 L4 定时器 0 产生 PWM #include <reg52.h> #include "hw_config.h" #include "my_type.h"
u8 i,temp = 0; static u8 count = 0;
count++; count %= 64;
for(i=0; i<8; i++) {
if(LightLevel[i] <= count) {
temp |= (1<<i); } else {
temp &= ~(1<<i); } }
P0 = temp;
P0 = ~((~temp) << (state-7)); } } } } } } L2(31-46).实现水滴变大效果,这段代码的作用可用图形表达,如图 5:
图5 控制 D1 由暗变亮,用了 64 个亮度级别,每个级别发送 64 个脉冲。 L2(49-81). 实现水滴 下落。代码就不逐 行解释了,大家 可根据注释自己分 析,主要说一下 实现 的方法。 定义 LED 有 8 个亮度级别,若用开发板上的 8 个 LED 表示,如图 6:
//亮度级别表 code u8 LightLevel[8]={0,1,2,4,8,16,32,64};
//水滴时间,实现加速效果 code u8 LightTime[16]={16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1};
void main(void) {
u8 i,j,k;
简介
学习嵌入式第一个例子通常都是控制一个 LED 亮灭,然后是花样繁多的流水灯,但不管灯 的花样如何变化,单个 LED 的亮度没有变化,只有亮、灭两个状态,本章我们实现如何控制 LED 的亮度。 1 什么是 PWM
脉冲宽度调制(Pulse Width Modulation,简称 PWM),是利用微处理器的数字输出来 对模拟电路进行控制的一种技术。在本章的应用中可以认为 PWM 就是一种方波。比如图 1:
timer0_init();
while(1) { } }
/**********************************************************
函数名称:timer0_init
功 能:初始化定时器 0
**********************************************************/
学习了用定时器产生 PWM,我们可以控制更多的 LED,比如 LED 点阵的亮度。下面的例 子实现 LED 点阵每行的亮度都不同。 程序清单 5 亮度不同的点阵 #include <reg52.h> #include "hw_config.h" #include "my_type.h"
//亮度级别表 code u8 LightLevel[8]={1,2,4,8,16,32,50,64};
图 1 方波 是周期为 10ms,占空比为 60%的 PWM。 占空比:高电平在一个周期之内所占的时间比率。 2 硬件设计 在例说 51 单片机的第三章,我们讲过如何控制开发板上 LED 的亮灭。首先译码器输出端 LEDS6 为低,T10 导通,给 8 个 LED 供电,然后通过缓冲器 8 个输出端 BD0~BD7 的控制 LED 的亮灭(低亮高灭)。
//根据亮度表,依次确定 8 个 LED 当前状态,亮或灭 for(k=0; k<8; k++) {
//以 j 为亮度级别,每个 LED 亮度不一样 if(LightLevel[k] == j) {
temp |= (1 << k); } }
if(state <= 7) {
P0 = ~((~temp) >> (7-state)); } else {
//亮度级别表 code u8 LightLevel[8]={1,2,4,8,16,28,50,64};
//函数声明 void timer0_init(void);
void main(void) {
//使能独立 LED 的供电,即 LEDS6 输出低电平 LEDEN = 0; ADDR0 = 0; ADDR1 = 1; ADDR2 = 1; ADDR3 = 1;
//开始全灭 P0 = 0xFF;
while(1) {
//P0 端口输出 8 组占空比不同的 PWM for(i=0; i<64; i++) //第 29 行 {
for(j=0; j<8; j++) {
if(LightLevel[j] <= i) {
temp |= (1<<j); } else {
temp &= ~(1<<j); } }
函数名称:timer0_init
功 能:初始化定时器 0
*****************************************************************/
void timer0_init(void)
{
TMOD = 0x01;
//运行模式 1
TH0 = 0xFF; //中断时间 10us
//函数声明 void timer0_init(void);
void main(void) {
//使能控制点阵的译码器 LEDEN = 0; ADDR3 = 0;
timer0_init();
while(1) {} }
/*****************************************************************
//一个亮度级别发送 64 个脉冲 for(j=0; j<64; j++) {
P0 = 0xFE; //以 i 为亮度级别,随着 i 的增大,占空比增大 for(k=0; k<64; k++) {
if(k > i) {
P0 = 0xFF; } } } }
//----------------------水滴降落过程--------------------for(state=0; state<16; state++) {
相关文档
最新文档