ImageVerifierCode 换一换
格式:DOCX , 页数:18 ,大小:19.47KB ,
资源ID:4523027      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/4523027.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(51单片机LED流水灯拖尾效果.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

51单片机LED流水灯拖尾效果.docx

1、51单片机LED流水灯拖尾效果高级流水灯-水滴效果(渐变带拖尾效果)实现和讲解简介学习嵌入式第一个例子通常都是控制一个LED亮灭,然后是花样繁多的流水灯,但不管灯的花样如何变化,单个LED的亮度没有变化,只有亮、灭两个状态,本章我们实现如何控制LED的亮度。1什么是PWM脉冲宽度调制(Pulse Width Modulation,简称PWM),是利用微处理器的数字输出来对模拟电路进行控制的一种技术。在本章的应用中可以认为PWM就是一种方波。比如图1:http: E6E.png(原文件名:120611_0.png)图1方波是周期为10ms,占空比为60%的PWM。占空比:高电平在一个周期之内所占

2、的时间比率。2硬件设计在例说51单片机的第三章,我们讲过如何控制开发板上LED的亮灭。首先译码器输出端LEDS6为低,T10导通,给8个LED供电,然后通过缓冲器8个输出端BD0BD7的控制LED的亮灭(低亮高灭)。http: 9.png(原文件名:120611_1.png)图2 LED硬件连接如果BD口输出高低不断变化,则LED会闪烁;如果这种高低电平变化非常快,由于人的视觉暂留现象,LED就会出现不同的亮度。3软件设计3.1 PWM能否控制亮度下面我们就用实践验证PWM是否能够控制LED的亮度,测试代码如下:程序清单L1:验证PWM能否控制LED的亮度1 #include 2 #inclu

3、de my_type.h3 #include hw_config.h456 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; i250; i+)23 24 if(i10)25 26 P0 &= 0xFD; /第二个灯亮27 28 else29 30 P0 |= 0x02; /第二个灯灭31 32 33

4、 34 L1(22-32):这段代码实现P0.1输出占空比为96%的方波,而P0.0恒为低。P0.1输出如图3所示(受纸张限制,图中高低电平长度比例和实际有偏差)。http: 1.png(原文件名:120611_2.png)图3下载验证:从开发板上可以看到运行效果,D1比D2亮。(这里说明一点:当P0输出低电平时,LED亮,所以,PWM的占空比越小越亮)。3.2产生8个亮度级别3.1节的例子证实了我们的设想,PWM可控制LED的亮度,下面我们设计几组占空比不同的PWM,看看对LED亮度的控制效果。代码如下:程序清单L2:不同占空比对LED亮度的控制1 #include 2 #include h

5、w_config.h3 #include my_type.h456 /亮度级别表7 code u8 LightLevel=0,1,2,4,8,16,32,64;89 void main(void)10 11 u8 i = 0;12 u8 j = 0;13 u8 k = 0;14 u8 temp = 0;1516 /使能独立LED的供电,即LEDS6输出低电平17 LEDEN = 0;18 ADDR0 = 0;19 ADDR1 = 1;20 ADDR2 = 1;21 ADDR3 = 1;2223 /开始全灭24 P0 = 0xFF;2526 while(1)27 28 /P0端口输出8组占空比不

6、同的PWM29 for(i=0; i64; i+)30 31 for(j=0; j8; j+)32 33 if(LightLevel = i)34 35 temp |= (1j);36 37 else38 39 temp &= (1j);40 41 4243 P0 = temp;44 45 46 L2(29-45).此段程序是让P0口输出8组占空比不同的PWM,如图4:http: 3.png)图4下载验证:从开发板上可以看到运行效果,从D1到D8的亮度逐渐增大。3.3水滴下落效果根据PWM可控制LED亮度的原理,我们用8个LED实现水滴下落的效果。第一步,水滴逐渐变大,用D1从暗变亮模拟;第二

7、步,水滴下落,带有拖尾效果,LED逐个亮,移动速度加快,且越靠前的LED亮度越大。程序清单L3水滴流水灯1 #include 2 #include hw_config.h3 #include my_type.h45 /亮度级别表6 code u8 LightLevel=0,1,2,4,8,16,32,64;78 /水滴时间,实现加速效果9 code u8 LightTime=16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1;101112 void main(void)13 14 u8 i,j,k;15 u8 temp,count;16 u8 state;1718 /

8、使能独立LED的供电,即LEDS6输出低电平19 LEDEN = 0;20 ADDR0 = 0;21 ADDR1 = 1;22 ADDR2 = 1;23 ADDR3 = 1;2425 while(1)26 27 /开始全灭28 P0 = 0xFF;2930 /-水滴逐渐变大(第一个LED亮度逐渐变大)-31 for(i=0; i64; i+)32 33 /一个亮度级别发送64个脉冲34 for(j=0; j64; j+)35 36 P0 = 0xFE;37 /以i为亮度级别,随着i的增大,占空比增大38 for(k=0; k i)41 42 P0 = 0xFF;43 44 45 46 4748

9、 /-水滴降落过程-49 for(state=0; state16; state+)50 51 /每一状态维持LightTime个脉冲52 for(count=0; count=LightTime; count+)53 54 /temp记录8个LED的状态,0代表亮,1代表灭55 temp = 0x00;5657 /一个脉冲长度j从0到6358 for(j=0; j64; j+)59 60 /根据亮度表,依次确定8个LED当前状态,亮或灭61 for(k=0; k8; k+)62 63 /以j为亮度级别,每个LED亮度不一样64 if(LightLevel = j)65 66 temp |=

10、(1 k);67 68 6970 if(state (7-state);73 74 else75 76 P0 = (temp) (state-7);77 78 79 80 81 82 L2(31-46).实现水滴变大效果,这段代码的作用可用图形表达,如图5:http: 4.png)图5控制D1由暗变亮,用了64个亮度级别,每个级别发送64个脉冲。L2(49-81).实现水滴下落。代码就不逐行解释了,大家可根据注释自己分析,主要说一下实现的方法。定义LED有8个亮度级别,若用开发板上的8个LED表示,如图6:http: 5.png)图6图中的红色面积代表亮度程度。实现流水效果的方法就是:让所有的

11、亮度依次经过在所有LED,如图7:http: 6.png)图7状态的持续时间从0-15逐渐减小,以模拟水滴加速。下载验证:下载到开发板上,可以看到水滴下落效果。3.4定时器产生PWM前面3个例子中,我们用循环语句虽然能产生占空比不同的PWM,但PWM的周期不好控制,对此,我们学习如何用定时器产生特定周期PWM。关于8051定时器的使用方法,大家可以参考例说51单片机的4章和5章。我们用定时器0产生PWM,代码如下:程序清单L4定时器0产生PWM1 #include 2 #include hw_config.h3 #include my_type.h456 /亮度级别表7 code u8 Lig

12、htLevel=1,2,4,8,16,28,50,64;89 /函数声明10 void timer0_init(void);1112 void main(void)13 14 /使能独立LED的供电,即LEDS6输出低电平15 LEDEN = 0;16 ADDR0 = 0;17 ADDR1 = 1;18 ADDR2 = 1;19 ADDR3 = 1;2021 timer0_init();2223 while(1)24 25 26 2728 /*29函数名称:timer0_init30功能:初始化定时器031 */32 void timer0_init(void)33 34 TMOD = 0x0

13、1; /运行模式135 TH0 = 0xFF; /10us中断36 TL0 = 0xFA;37 EA = 1; /开启中断38 ET0 = 1;39 TR0 = 1; /启动定时器4041 4243 /*44函数名称:timer0_overflow45功能:定时器0溢出中断46 */47 void timer0_overflow(void) interrupt TIMER0_OVERFLOW48 49 u8 i,temp = 0;50 static u8 count = 0;5152 count+;53 count %= 64;5455 for(i=0; i8; i+)56 57 if(Lig

14、htLevel = count)58 59 temp |= (1i);60 61 else62 63 temp &= (1i);64 65 6667 P0 = temp;6869 TR0 = 0;70 TH0 = 0xFF; /重新赋值71 TL0 = 0xF7;72 TR0 = 1;73 L4(32).初始化定时器0,没10us产生一次中断。L4(55-65).控制输出8组不同占空比的PWM。这段代码功能和程序清单2中的功能一致。下载验证:下载到开发板上,可以看到D1到D8亮度逐渐增大。3.5亮度不同的点阵学习了用定时器产生PWM,我们可以控制更多的LED,比如LED点阵的亮度。下面的例子实

15、现LED点阵每行的亮度都不同。程序清单5亮度不同的点阵1 #include 2 #include hw_config.h3 #include my_type.h456 /亮度级别表7 code u8 LightLevel=1,2,4,8,16,32,50,64;89 /函数声明10 void timer0_init(void);1112 void main(void)13 14 /使能控制点阵的译码器15 LEDEN = 0;16 ADDR3 = 0;1718 timer0_init();1920 while(1)21 22 2324 /*25函数名称:timer0_init26功能:初始化定

16、时器027 */28 void timer0_init(void)29 30 TMOD = 0x01; /运行模式131 TH0 = 0xFF; /中断时间10us32 TL0 = 0xF733 EA = 1; /开启中断34 ET0 = 1;35 TR0 = 1; /启动定时器36 3738 /*39函数名称:timer0_overflow40功能:定时器0溢出中断41 */42 void timer0_overflow(void) interrupt TIMER0_OVERFLOW43 44 u8 i;45 u8 p1_value = 0;46 static u8 state = 0; /

17、点阵状态(扫描行数)47 static u8 count = 0;4849 TR0 = 0;5051 count+;52 if(count = 64)53 54 state+;55 state %= 8;56 count = 0;57 5859 if(count LightLevel)60 61 P0 = 0x00;62 63 else64 65 P0 = 0xFF;66 6768 p1_value = P1 & 0xf8;69 p1_value |= state;70 P1 = p1_value;7172 TH0 = 0xFF; /重新赋值73 TL0 = 0xFA;74 TR0 = 1;7

18、5 L5(28).初始化定时器,每10us中断一次。L5(51-57).每中断64次,点阵扫描移动到下一行,用state记录当前行数。L5(59-66).扫描每一行输出的PWM都不一样,使用的方式和处理独立LED一致。L5(68-70).输出点阵对应的位码。下载验证:下载到开发板上,可以看到运行效果,点阵第一行最暗,越往下越亮。3.6点阵模拟音乐频谱分析效果在很多音乐播放软件上,都有频谱分析的图形,如图8:http: 7.png)图8我们用也可以模拟相似的图形,代码如下:程序清单6:点阵模拟音乐频谱分析1 #include 2 #include hw_config.h3 #include my

19、_type.h45 /频谱波形表6 code u8 Wave=7 8 0xFF,0xFF,0xFF,0xFF,0xFE,0xBB,0xFE,0xAA,9 0xFF,0xFF,0xFF,0xFE,0xFB,0xAE,0xFA,0xAA,10 0xFF,0xFF,0xFF,0xFE,0xEB,0xBE,0xEA,0xAA,11 0xFF,0xFF,0xFE,0xFB,0xAF,0xFE,0xAA,0xAA,12 0xFF,0xFE,0xFB,0xBE,0xEA,0xBA,0xAA,0xAA,13 0xFF,0xFE,0xBB,0xEE,0xBA,0xBA,0xAA,0xAA,14 0xFE,0xB

20、B,0xEE,0xBA,0xAA,0xAA,0xAA,0xAA,15 0xBA,0xEF,0xBE,0xAA,0xAA,0xAA,0xAA,0xAA,16 0xEE,0xBB,0xFE,0xAA,0xAA,0xAA,0xAA,0xAA,17 0xEE,0xBB,0xFE,0xEA,0xAA,0xAA,0xAA,0xAA,18 0xFE,0xEB,0xBE,0xFE,0xAA,0xAA,0xAA,0xAA,19 0xFF,0xEE,0xBB,0xFF,0xAE,0xAA,0xAA,0xAA,20 0xFF,0xFE,0xAF,0xFB,0xEE,0xAA,0xAA,0xAA,21 0xFF,0x

21、FF,0xFE,0xBB,0xEF,0xBA,0xAA,0xAA,22 0xFF,0xFF,0xFF,0xFE,0xAB,0xFF,0xEE,0xAA,23 0xFF,0xFF,0xFF,0xFF,0xFE,0xEB,0xBE,0xAA24 ;2526 /亮度级别表27 code u8 LightLevel=1,2,4,8,16,32,50,64;2829 /函数声明30 void timer0_init(void);3132 void main(void)33 34 /使能控制点阵的译码器35 LEDEN = 0;36 ADDR3 = 0;3738 timer0_init();3940 wh

22、ile(1)41 42 43 4445 /*46函数名称:timer0_init47功能:初始化定时器048 */49 void timer0_init(void)50 51 TMOD = 0x01; /运行模式152 TH0 = 0xFF; /10us中断53 TL0 = 0xFA;54 EA = 1; /开启中断55 ET0 = 1;56 TR0 = 1; /启动定时器5758 5960 /*61函数名称:timer0_overflow62功能:定时器0溢出中断63 */64 void timer0_overflow(void) interrupt TIMER0_OVERFLOW65 66

23、 u8 i;67 u8 p1_value = 0;68 static u8 state = 0; /点阵状态(扫描行数)69 static u8 count = 0;7071 static u8 wave_state = 0; /波形状态72 static u16 wave_count = 0;7374 TR0 = 0;7576 /每中断1000次,改变波形状态77 wave_count+;78 if(wave_count = 1000)79 80 wave_count = 0;81 wave_state+;82 wave_state %= 16;83 8485 /每中断64次,改变扫描的行8

24、6 count+;87 if(count = 64)88 89 state+;90 state %= 8;91 count = 0;92 9394 if(count LightLevel)95 1 P0 = Wave;2 3 else4 5 P0 = 0xFF;6 78 /输出位码9 p1_value = P1 & 0xf8;10 p1_value |= state;11 P1 = p1_value;1213 /定时器重新赋值14 TH0 = 0xFF;15 TL0 = 0xF7;16 TR0 = 1;17 L6(6).波形表,共16个状态,每个状态下有8个数据,即一个点阵界面。扫描点阵时循环发送,实现动态效果。L6(77-83).每中断1000次,更换一个状态。L6(86-101).和L5的功能一致,只是点阵段码输出的数据变成了波形表。

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1