高级流水灯水滴效果Word文档格式.docx

上传人:b****1 文档编号:1399207 上传时间:2023-04-30 格式:DOCX 页数:19 大小:267.64KB
下载 相关 举报
高级流水灯水滴效果Word文档格式.docx_第1页
第1页 / 共19页
高级流水灯水滴效果Word文档格式.docx_第2页
第2页 / 共19页
高级流水灯水滴效果Word文档格式.docx_第3页
第3页 / 共19页
高级流水灯水滴效果Word文档格式.docx_第4页
第4页 / 共19页
高级流水灯水滴效果Word文档格式.docx_第5页
第5页 / 共19页
高级流水灯水滴效果Word文档格式.docx_第6页
第6页 / 共19页
高级流水灯水滴效果Word文档格式.docx_第7页
第7页 / 共19页
高级流水灯水滴效果Word文档格式.docx_第8页
第8页 / 共19页
高级流水灯水滴效果Word文档格式.docx_第9页
第9页 / 共19页
高级流水灯水滴效果Word文档格式.docx_第10页
第10页 / 共19页
高级流水灯水滴效果Word文档格式.docx_第11页
第11页 / 共19页
高级流水灯水滴效果Word文档格式.docx_第12页
第12页 / 共19页
高级流水灯水滴效果Word文档格式.docx_第13页
第13页 / 共19页
高级流水灯水滴效果Word文档格式.docx_第14页
第14页 / 共19页
高级流水灯水滴效果Word文档格式.docx_第15页
第15页 / 共19页
高级流水灯水滴效果Word文档格式.docx_第16页
第16页 / 共19页
高级流水灯水滴效果Word文档格式.docx_第17页
第17页 / 共19页
高级流水灯水滴效果Word文档格式.docx_第18页
第18页 / 共19页
高级流水灯水滴效果Word文档格式.docx_第19页
第19页 / 共19页
亲,该文档总共19页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

高级流水灯水滴效果Word文档格式.docx

《高级流水灯水滴效果Word文档格式.docx》由会员分享,可在线阅读,更多相关《高级流水灯水滴效果Word文档格式.docx(19页珍藏版)》请在冰点文库上搜索。

高级流水灯水滴效果Word文档格式.docx

my_type.h"

hw_config.h"

voidmain(void)

{

u8i=0;

//使能独立LED的供电,即LEDS6输出低电平

LEDEN=0;

ADDR0=0;

ADDR1=1;

ADDR2=1;

ADDR3=1;

//第一个LED亮

P0=0xFE;

while

(1)

{

for(i=0;

i<

250;

i++)

if(i<

10)

P0&

=0xFD;

//第二个灯亮

}

else

P0|=0x02;

//第二个灯灭

}

L1(22-32):

这段代码实现P0.1输出占空比为96%的方波,而P0.0恒为低。

P0.1输出如图3所示(受纸张限制,图中高低电平长度比例和实际有偏差)。

120611_2.png)图3

下载验证:

从开发板上可以看到运行效果,D1比D2亮。

(这里说明一点:

当P0输出低电平时,LED亮,所以,PWM的占空比越小越亮)。

3.2产生8个亮度级别

3.1节的例子证实了我们的设想,PWM可控制LED的亮度,下面我们设计几组占空比不同的PWM,看看对LED亮度的控制效果。

代码如下:

程序清单L2:

不同占空比对LED亮度的控制

#include<

//亮度级别表

codeu8LightLevel[8]={0,1,2,4,8,16,32,64};

u8j=0;

u8k=0;

u8temp=0;

//开始全灭

P0=0xFF;

while

(1)//P0端口输出8组占空比不同的PWM

64;

for(j=0;

j<

8;

j++)

if(LightLevel[j]<

=i)

temp|=(1<

<

j);

temp&

=~(1<

P0=temp;

L2(29-45).此段程序是让P0口输出8组占空比不同的PWM,如图4:

120611_3.png)图4

从开发板上可以看到运行效果,从D1到D8的亮度逐渐增大。

3.3水滴下落效果

根据PWM可控制LED亮度的原理,我们用8个LED实现水滴下落的效果。

第一步,水滴逐渐变大,用D1从暗变亮模拟;

第二步,水滴下落,带有拖尾效果,LED逐个亮,移动速度加快,且越靠前的LED亮度越大。

程序清单L3水滴流水灯

//水滴时间,实现加速效果

codeu8LightTime[16]={16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1};

u8i,j,k;

u8temp,count;

u8state;

while

(1)//开始全灭

//---------------水滴逐渐变大(第一个LED亮度逐渐变大)---------

i++)//一个亮度级别发送64个脉冲

//以i为亮度级别,随着i的增大,占空比增大

for(k=0;

k<

k++)

if(k>

i)

//----------------------水滴降落过程---------------------

for(state=0;

state<

16;

state++)//每一状态维持LightTime[state]个脉冲

for(count=0;

count<

=LightTime[state];

count++)

{//temp记录8个LED的状态,0代表亮,1代表灭

temp=0x00;

//一个脉冲长度j从0到63

j++)

//根据亮度表,依次确定8个LED当前状态,亮或灭

k++)//以j为亮度级别,每个LED亮度不一样

if(LightLevel[k]==j)

temp|=(1<

k);

if(state<

=7)

P0=~((~temp)>

>

(7-state));

P0=~((~temp)<

(state-7));

L2(31-46).实现水滴变大效果,这段代码的作用可用图形表达,如图5:

120611_4.png)图5

控制D1由暗变亮,用了64个亮度级别,每个级别发送64个脉冲。

L2(49-81).实现水滴下落。

代码就不逐行解释了,大家可根据注释自己分析,主要说一下实现的方法。

定义LED有8个亮度级别,若用开发板上的8个LED表示,如图6:

120611_5.png)图6

图中的红色面积代表亮度程度。

实现流水效果的方法就是:

让所有的亮度依次经过在所有LED,如图7:

120611_6.png)图7

状态的持续时间从0-15逐渐减小,以模拟水滴加速。

下载到开发板上,可以看到水滴下落效果。

3.4定时器产生PWM

前面3个例子中,我们用循环语句虽然能产生占空比不同的PWM,但PWM的周期不好控制,对此,我们学习如何用定时器产生特定周期PWM。

关于8051定时器的使用方法,大家可以参考例说51单片机的4章和5章。

我们用定时器0产生PWM,代码如下:

程序清单L4定时器0产生PWM

codeu8LightLevel[8]={1,2,4,8,16,28,50,64};

//函数声明

voidtimer0_init(void);

voidmain(void)//使能独立LED的供电,即LEDS6输出低电平

timer0_init();

while

(1){}}

/**********************************************************

函数名称:

timer0_init功能:

初始化定时器0

**********************************************************/

voidtimer0_init(void)

TMOD=0x01;

//运行模式1

TH0=0xFF;

//10us中断

TL0=0xFA;

EA=1;

//开启中断

ET0=1;

TR0=1;

//启动定时器

/************************************************************

timer0_overflow功能:

定时器0溢出中断

************************************************************/

voidtimer0_overflow(void)interruptTIMER0_OVERFLOW

u8i,temp=0;

staticu8count=0;

count++;

count%=64;

if(LightLevel[i]<

=count)

i);

TR0=0;

//重新赋值

TL0=0xF7;

L4(32).初始化定时器0,没10us产生一次中断。

L4(55-65).控制输出8组不同占空比的PWM。

这段代码功能和程序清单2中的功能一致。

下载到开发板上,可以看到D1到D8亮度逐渐增大。

3.5亮度不同的点阵

学习了用定时器产生PWM,我们可以控制更多的LED,比如LED点阵的亮度。

下面的例子实现LED点阵每行的亮度都不同。

程序清单5亮度不同的点阵

codeu8LightLevel[8]={1,2,4,8,16,32,50,64};

//函数声明

voidmain(void)

//使能控制点阵的译码器

ADDR3=0;

while

(1){}}

/*****************************************************************

*****************************************************************/

//中断时间10us

TL0=0xF7;

EA=1;

u8i;

u8p1_value=0;

staticu8state=0;

//点阵状态(扫描行数)

if(count==64)

state++;

state%=8;

count=0;

if(count<

LightLevel[state])

P0=0x00;

else{P0=0xFF;

p1_value=P1&

0xf8;

p1_value|=state;

P1=p1_value;

L5(28).初始化定时器,每10us中断一次。

L5(51-57).每中断64次,点阵扫描移动到下一行,用state记录当前行数。

L5(59-66).扫描每一行输出的PWM都不一样,使用的方式和处理独立LED一致。

L5(68-70).输出点阵对应的位码。

下载到开发板上,可以看到运行效果,点阵第一行最暗,越往下越亮。

3.6点阵模拟音乐频谱分析效果

在很多音乐播放软件上,都有频谱分析的图形,如图8:

120611_7.png)图8

我们用也可以模拟相似的图形,代码如下:

程序清单6:

点阵模拟音乐频谱分析

//频谱波形表

codeu8Wave[16][8]=

{0xFF,0xFF,0xFF,0xFF,0xFE,0xBB,0xFE,0xAA},

{0xFF,0xFF,0xFF,0xFE,0xFB,0xAE,0xFA,0xAA},

{0xFF,0xFF,0xFF,0xFE,0xEB,0xBE,0xEA,0xAA},

{0xFF,0xFF,0xFE,0xFB,0xAF,0xFE,0xAA,0xAA},

{0xFF,0xFE,0xFB,0xBE,0xEA,0xBA,0xAA,0xAA},

{0xFF,0xFE,0xBB,0xEE,0xBA,0xBA,0xAA,0xAA},

{0xFE,0xBB,0xEE,0xBA,0xAA,0xAA,0xAA,0xAA},

{0xBA,0xEF,0xBE,0xAA,0xAA,0xAA,0xAA,0xAA},

{0xEE,0xBB,0xFE,0xAA,0xAA,0xAA,0xAA,0xAA},

{0xEE,0xBB,0xFE,0xEA,0xAA,0xAA,0xAA,0xAA},

{0xFE,0xEB,0xBE,0xFE,0xAA,0xAA,0xAA,0xAA},

{0xFF,0xEE,0xBB,0xFF,0xAE,0xAA,0xAA,0xAA},

{0xFF,0xFE,0xAF,0xFB,0xEE,0xAA,0xAA,0xAA},

{0xFF,0xFF,0xFE,0xBB,0xEF,0xBA,0xAA,0xAA},

{0xFF,0xFF,0xFF,0xFE,0xAB,0xFF,0xEE,0xAA},

{0xFF,0xFF,0xFF,0xFF,0xFE,0xEB,0xBE,0xAA}

};

//亮度级别表

//使能控制点阵的译码器

staticu8wave_state=0;

//波形状态

staticu16wave_count=0;

//每中断1000次,改变波形状态

wave_count++;

if(wave_count==1000)

wave_count=0;

//每中断64次,改变扫描的行

wave_state++;

wave_state%=16;

//输出位码

P0=Wave[wave_state][state];

//定时器重新赋值

L6(6).波形表,共16个状态,每个状态下有8个数据,即一个点阵界面。

扫描点阵时循环发送,实现动态效果。

L6(77-83).每中断1000次,更换一个状态。

L6(86-101).和L5的功能一致,只是点阵段码输出的数据变成了波形表。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 人文社科 > 法律资料

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2