高级流水灯水滴效果Word格式文档下载.docx
《高级流水灯水滴效果Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《高级流水灯水滴效果Word格式文档下载.docx(14页珍藏版)》请在冰豆网上搜索。
#include"
my_type.h"
3
hw_config.h"
4
5
6
voidmain(void)
7
{
8
u8i=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所示(受纸张限制,图中高低电平长度比例和实际有偏差)。
120611_2.png)图3
下载验证:
从开发板上可以看到运行效果,D1比D2亮。
(这里说明一点:
当P0输出低电平时,LED亮,所以,PWM的占空比越小越亮)。
3.2产生8个亮度级别
3.1节的例子证实了我们的设想,PWM可控制LED的亮度,下面我们设计几组占空比不同的PWM,看看对LED亮度的控制效果。
代码如下:
程序清单L2:
不同占空比对LED亮度的控制
//亮度级别表
codeu8LightLevel[8]={0,1,2,4,8,16,32,64};
u8i=0;
u8j=0;
u8k=0;
u8temp=0;
//使能独立LED的供电,即LEDS6输出低电平
LEDEN=0;
ADDR0=0;
ADDR1=1;
ADDR2=1;
ADDR3=1;
//开始全灭
P0=0xFF;
while
(1)
{
//P0端口输出8组占空比不同的PWM
64;
for(j=0;
j<
8;
j++)
if(LightLevel[j]<
=i)
35
temp|=(1<
<
j);
36
37
38
39
temp&
=~(1<
40
41
42
43
P0=temp;
44
45
46
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;
//---------------水滴逐渐变大(第一个LED亮度逐渐变大)---------
//一个亮度级别发送64个脉冲
//以i为亮度级别,随着i的增大,占空比增大
for(k=0;
k<
k++)
if(k>
i)
47
48
//----------------------水滴降落过程---------------------
49
for(state=0;
state<
16;
state++)
50
{
51
//每一状态维持LightTime[state]个脉冲
52
for(count=0;
count<
=LightTime[state];
count++)
53
54
//temp记录8个LED的状态,0代表亮,1代表灭
55
temp=0x00;
56
57
//一个脉冲长度j从0到63
58
59
60
//根据亮度表,依次确定8个LED当前状态,亮或灭
61
62
63
//以j为亮度级别,每个LED亮度不一样
64
if(LightLevel[k]==j)
65
66
temp|=(1<
k);
67
68
69
70
if(state<
=7)
71
72
P0=~((~temp)>
>
(7-state));
73
74
75
76
P0=~((~temp)<
(state-7));
77
78
79
80
81
82
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);
timer0_init();
/**********************************************************
函数名称:
timer0_init
功
能:
初始化定时器0
**********************************************************/
voidtimer0_init(void)
TMOD=0x01;
//运行模式1
TH0
=0xFF;
//10us中断
TL0
=0xFA;
EA
=1;
//开启中断
ET0
TR0
//启动定时器
/************************************************************
timer0_overflow
定时器0溢出中断
************************************************************/
voidtimer0_overflow(void)interruptTIMER0_OVERFLOW
u8i,temp=0;
staticu8count=0;
count++;
count%=64;
if(LightLevel<
=count)
i);
TR0=0;
TH0=0xFF;
//重新赋值
TL0=0xF7;