圆融杯小蛮腰作品.docx
《圆融杯小蛮腰作品.docx》由会员分享,可在线阅读,更多相关《圆融杯小蛮腰作品.docx(32页珍藏版)》请在冰豆网上搜索。
圆融杯小蛮腰作品
编号
2016年第八届“圆融杯”电子设计竞赛
参赛作品
作品名称:
璀璨广州塔
团队负责人:
李磊沈弢聂航
指导老师:
刘磊
填表日期:
2016年11月9日
摘要
LED作为新型环保的绿色光源被大量运用于建筑景观照明中,广州塔便是利用了LED光源体积小、颜色多、低能耗、寿命长等特点,既不破坏建筑的外观美感,又能带给大家魔幻般的艺术效果,节省了投资,降低了运营成本,实现了预期的灯光效果。
本设计是基于51系列的单片机进行的广州塔设计,可以显示16*16组合的256个蓝色的LED灯。
关键词:
LED光源;建筑照明;广州塔;单片机
1绪论
1.1设计目的
广州塔”一词正逐渐引起了全国人民的关注,并得到了全球的高度肯定。
由此,也掀起了广州塔的设计与学习热潮,在原有的基础上不断增加难度,增加变换花样,吸引电子爱好者对其研究、创新。
事实上,“广州塔”已经渗透到以下几个方面:
照明类LED光效——户外景观照明展开的视觉装饰活动;信息传播类LED光效——各种类型的大屏幕点缀着人们的生活;广州塔制作所需材料较常见,成本低廉、性价比高等优点具有较高的研究价值。
1.2功能、性能要求说明
由256蓝色LED灯组合成动态的显示:
从上往下流雨滴、对称流水灯移动、逐渐旋转上升等,还可以外接了MP3音乐控制模块。
1.3设计总体方案介绍及工作原理说明
选择单片机AT89S52作为主控制器;选择256个蓝色LED作为显示模块,此模块可以逐渐旋转上升、对称流水灯移动、雨滴从上往下流等等不同灯光效果显示。
2硬件系统的设计
2.1系统功能模块划分
根据系统功能要求,可大致画出系统所需硬件结构框图如图
(1)所示:
AT89C52
LED显示
供电电源
震荡电路
驱动模块
复位电路
.
S8550PNP
图
(1)结构框图
主控模块采用AT89S52单片机芯片,在其内部写好程序,可通过程序的运行控制单片机引脚的高低电平来进行2TYS8550PNP管三极管的导通和截止;从而实现LED多种动态显示。
2.2设计硬件系统各模块功能介绍
2.2.1最小系统模块
AT89S52是一种低功耗、高性能CMOS8位微控制器,具有8K在系统可编程Flash存储器。
使用Atmel公司高密度非易失性存储器技术制造,与工业80C51产品指令和引脚完全兼容。
片上Flash允许程序存储器在系统可编程,亦适于常规编程器。
在单芯片上,拥有灵巧的8位CPU和在系统可编程Flash,使得AT89S52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。
AT89S52具有以下标准功能:
8k字节Flash,256字节RAM,32位I/O口线,看门狗定时器,2个数据指针,三个16位定时器/计数器,一个6向量2级中断结构,全双工串行口,片内晶振及时钟电路。
另外,AT89S52可降至0Hz静态逻辑操作,支持2种软件可选择节电模式。
空闲模式下,CPU停止工作,允许RAM、定时器/计数器、串口、中断继续工作。
掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。
图
(2)最小系统模块
2.2.2电源模块
电源采用的UBS插口5V供电,通过六角开关控制系统的供电。
图(3)电源模块
2.2.3下载电路
此下载电路只是通过PCB线将各个引脚引出到下载口上,再通过ISPUSB转换进行程序自动下载。
图(4)下载电路
2.2.4显示电路
LED显示是由16个PNP三极管分别连接单片机引脚,通过三极管放大来使各个灯亮度均衡。
图5和图6只是单个电路。
图(5)LED阳极显示
图(6)LED阳极显示
2.3设计电路原理图、实物图
图(7)广州塔原理图
图(8)单片机52控制板
图(9)控制板与塔身
2.4设计元件清单
表1原件清单
原件名称
数量
备注
89C52RC单片机
1
40PID集成座
1
08051K电阻
32
2TYS8550PNP管
32
080522R电阻
1
080510K电阻
1
080533pF电容
2
120610UF坦电容
1
12M晶振
1
USB接口
1
六角开关
1
排针40P
2
3mm雾状长脚有边奶头灯
270
网线
若干
3、软件系统的设计
3.1软件系统程序流程框图
程序主函数运行流程框图如图10。
图(10)流程框图
首先,将系统所需要的文件的宏定义文件包含进来。
定义:
P0和P2口控制的256个灯的共阳极;而初P1和P3口控制的256个灯的共阴极,利用扫描形式使广州塔的LED灯逐个点亮形成动画。
3.2软件系统程序清单
程序在附录一。
4操作使用说明、测试过程、误差分析
4.1操作使用说明
按下电源键,自动开始循环运行动态。
4.2测试过程
由于用到较多的LED灯,对于焊接和调试造成一定的难度,256个灯中只要有一个出问题替换工作将是非常的麻烦,必须把八层的LED拆开再取出坏的LED重新焊接。
在对电路检查时由于本设计电路版面较大,检查起来并非易事。
在设计过程中发现了一些问题。
以下为主要的问题及解决方案:
1、本系统由于程序量要求大,256个LED灯需要较高的驱动电流和较大工作量的编程,传统的4K89c51单片机将导致程序溢出无法编译。
解决方法:
采用单片机AT89S52单片机,对广州塔功能拓展提供了更宽广的平台。
2、本系统在硬件测试时发现广州塔的LED灯普遍偏暗,电流较低,无法达到预期的效果。
解决方法:
首先先进行电路的检测,测试是否存在短路、短路情况。
发现没有问题,接着在io口上接了上拉电阻,问题得以解决。
3、在调试过程中发现插上已烧入程序的单片机后对光立方主体起不到控制的作用。
解决方法:
根据经验猜测是单片机引脚没起作用造成的。
后来换了块单片机发现动画出来了,由此判断是单片机烧坏造成。
4、由于电烙铁工作时会有较小的静电产生,很容易烧坏LED灯。
解决问题:
问题可能处在电烙铁在工作过程中产生的静电上,以下为减少静电影响的方法:
1.将烙铁头跟接地线相连,以泄放产生的静电。
2.如果烙铁没有接地线那就光脚才在地上也会降低静电的影响。
把16个灯归为一组,焊完组个检查,焊完2层整排再进行检查,把LED坏的概率降到最低。
4.3误差分析
广州塔主要是通过程序来控制灯从而达到多种动画变化的效果。
由于要形成多样的动画,在变成过程中也出现了不少的问题。
最后经过多次的细心修改,顺利的完成了编程工作。
主要问题有:
1、烧入程序后,不能显示完整的动画。
解决方法:
重新检查程序,检查对应的引脚定义有没错。
再者检查延时是否过快导致动画不明显。
2、在调试过程中发现插上已烧入程序的单片机后对广州塔体起不到控制的作用。
解决方法:
根据经验猜测是单片机引脚没起作用造成的。
后来换了块单片机发现动画出来了,由此判断是单片机烧坏造成。
3、调试过程中烧入全亮程序发现有一层16个灯同时不亮。
解决方法:
通过观察,其它的灯都亮,这说明阳极是导通的,而阴极控制线路有故障或者短路,用万用表的蜂鸣档测试发现连接三极管与单片机的线路出现断路,用导线连接恢复正常。
5程序流程框图
程序主函数运行流程框图如图11。
图(11)运行流程框图
6设计总结
与导师商讨后定下了设计的题目:
基于51单片机的广州塔,取名璀璨广州塔。
本设计采用AT89S52单片机作为主控芯片,通过程序来实现流动动画。
设计的亮点是将原先平面的流水灯延伸到立体空间,使实现的动画更能冲击视觉效果,拥有更广阔的市场价值。
刚确定这个设计题目时欣喜与茫然同在,对于网上各种各样的广州塔成品让人赞叹不已,也想能通过亲自来制作一个属于自己的广州塔。
与此同时,广州塔毕竟是个新鲜产物,网上较多的是成品材料并没有太多的经验可以引以为鉴。
在制作过程中遇到许多的困难,就比如说怎么把那256个LED怎样实现圆、半径多大、从线到面、从面到体就是必须要克服的难题。
但是功夫不负有心人,经过指导老师的精心指导以及同学们的热心帮助,终于完成了硬件和软件的测试。
那么成品有三大部分组成:
1、控制部分采用8×8cm的铜板制作而成。
2、塔身由256个蓝色雾灯组成。
3、塔顶放了一块孙中山150年纪念币。
通过这次的作品设计,过程中很多我不懂的问题都会主动查阅资料来寻找答案,在此将大学所学的专业知识进行了重温并付付诸实践,从而使我的专业涵养得到了提高。
由于此设计需要较高的焊接技巧,制作过程中也无形锻炼了自己的动手能力。
这将对于毕业设计中将是一笔宝贵的财富。
7结论
在整个设计过程中,发挥团队精神,分工合作,自主学习,通过对以前知识的补充和学习。
较好的完成了作品,完成了本次课程设计的要求。
在最初的设计中,,对于52单片机进行了充分的了解,并与51相比较,了解了两种单片机的不同,并相互学习、相互讨论、最终决定使用AT89S52单片机制作。
电路的布局在AD软件中进行了期间排布,使得期间在板子上尽可能合理分配。
电路焊接时大量使用了插针,防止了在在焊接中导线的错误链接,减小电路工程量。
达到事半功倍的效果。
程序编写中,由于思路不清晰,开始时遇到了很多的问题,通过和同组员的讨论,以及对大量书籍资料和论坛中成功的品进行借鉴,明白了编程中的的主要算法和实现,从而解决的大部分问题。
对于三极管,贴片的第一次接触,从烙铁头和管脚辨别,查看了大量的手册资料,在本次单片机课程设计中对于单片机功能及应用有了充分了认识。
充分了解了单片机的应用。
并对只是进行了补充学习在大量阅读文献资料后,感觉对单片机的了解还很少。
以后将及时补充相关知识,对单片机进行系统学习。
参考文献
【1】李广弟,朱月秀,冷祖祁编单片机基础.北京航空航天大学出版社2007.6
【2】张俊谟.单片机中级教程.北京航空航天大学出版2006.03
【3】]余发山.单片机原理及及应用技术.中国矿业大学出版社2003.12
【4】杨凌霄.微型计算机原理及应用.中国矿业大学出版社2004.08
【5】郭天祥51单片机c语言教程.电子工业出版社2009.1
【6】万光毅.单片机实验与实践教程.北京航空航天大学出版社2005.01
【7】周航慈.单片机程序设计基础.北京航空航天大学出版社1991.11
【8】黄遵熹.单片机原理接口与应用.西北工业大学出版社1997.05
【9】杨振江,杜铁军,李群.流行单片机实用子程序及应用实例[M].西安:
西
安电子科技大学出版社,2002
【10】杨子文编单片机原理及应用西安电子科技大学出版社2006
【11】王法能编单片机原理及应用科学出版社2004
附录一:
程序
#include
#include
#defineuintunsignedint
#defineucharunsignedchar
ucharcodetable0[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//从低位往高位移一个灯
ucharcodetable1[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};//从高位往低位移一个灯
ucharcodetable2[]={0xfe,0xfa,0xf8,0xf0,0xe0,0xa0,0x80,0x00};//从低位到高位逐步全部点亮
ucharcodetable3[]={0x7f,0x3f,0x1f,0x0f,0x07,0x03,0x01,0x00};//从高位到低位逐步全部点亮
ucharcodetable4[]={0x01,0x03,0x07,0x0f,0x1f,0x3f,0x7f,0xff};//从低位到高位逐步全部熄灭
ucharcodetable5[]={0x80,0xa0,0xe0,0xf0,0xf8,0xfa,0xfe,0xff};//从高位到低位逐步全部熄灭
ucharcodetable6[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};//从低位到高位,灭一个灯移动
ucharcodetable7[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};//从高位到低位,灭一个灯移动
uchari;
voiddelay(uintz)//延时函数
{
uintx,y;
for(x=z;x>0;x--)
for(y=314;y>0;y--);
}
voiddeng1234()//层灯移位
{
for(i=0;i<8;i++)
{
P1=table0[i];///从高到低
P3=table0[i];
delay(30);
}
}
voiddeng123()//
{
for(i=0;i<8;i++)
{
P2=table1[i];
P0=table1[i];
delay(60);
}
}
/***********************************************
************************************************/
voiddeng0()//所有灯亮一会儿
{
P0=0x00;P1=0x00;P2=0x00;P3=0x00;
delay(50);
}
voiddeng0_1()//所有灯灭一会儿
{
P0=0xff;P1=0xff;P2=0xff;P3=0xff;
delay(150);
}
voiddeng1()//两列灯顺时针旋转2遍,然后逐渐降低
{
ucharc;
P1=0x00;P3=0x00;
for(c=3;c>0;c--)
{
deng123();
}
P1=0x03;
deng123();
P1=0x0f;
deng123();
P1=0x3f;
deng123();
P1=0xff;
deng123();
P3=0x03;
deng123();
P3=0x0f;
deng123();
P3=0x3f;
deng123();
P3=0xff;
deng123();
P2=0xff;P0=0xff;
}
voiddeng2()//四列灯顺时针旋转2遍
{
uchara;
ucharb;
b=0x77;
P2=b;
P0=b;
P1=0x00;P3=0x00;
for(a=8;a>0;a--)
{
for(i=0;i<8;i++)
{
b=_cror_(b,1);//循环左移
delay(25);
P2=b;
P0=b;
}
}
P2=0xff;P0=0xff;P1=0xff;P3=0xff;
}
voiddeng3()//单层,向上升
{
P0=0x00;
P2=0x00;
for(i=0;i<8;i++)
{
P3=table1[i];
delay(25);
}
P3=0xff;
/*----------------------*/
for(i=0;i<8;i++)
{
P1=table1[i];
delay(25);
}
P1=0xff;
}
voiddeng4()//单层,向下降
{
P2=0x00;P0=0x00;
for(i=0;i<8;i++)
{
P1=table0[i];
delay(25);
}
P1=0xff;
/*----------------------*/
for(i=0;i<8;i++)
{
P3=table0[i];
delay(25);
}
P3=0xff;P1=0xff;P0=0xff;P2=0xff;
}
voiddeng5()//从上到下,逐层全部点亮】
{
P0=0x00;P2=0x00;
for(i=0;i<8;i++)
{
P1=table2[i];
delay(25);
}
for(i=0;i<8;i++)
{
P3=table2[i];
delay(25);
}
P0=0xff;P1=0xff;P2=0xff;P3=0xff;
}
voiddeng6()//从上到下,逐层全部熄灭】
{
P0=0x00;P2=0x00;
P1=0x00;P3=0x00;
for(i=0;i<8;i++)
{
P1=table4[i];
delay(25);
}
P1=0xff;
for(i=0;i<8;i++)
{
P3=table4[i];
delay(25);
}
P3=0xff;
P0=0xff;P2=0xff;
}
voiddeng7()//四组灯,交替两次
{
for(i=2;i>0;i--)
{
P1=0x00;P2=0x00;//上左
delay(25);
P1=0xff;P2=0xff;
delay(25);
P3=0x00;P0=0x00;//下右
delay(25);
P3=0xff;P0=0xff;
delay(25);
/////////////
P3=0x00;P2=0x00;//下左
delay(25);
P3=0xff;P2=0xff;
delay(25);
/////////////
P1=0x00;P0=0x00;//上右
delay(25);
P1=0xff;P0=0xff;
delay(25);
}
}
voiddeng8()//上半先逐步列点亮,然后再向下点点亮
{
P0=0xff;P2=0xff;P3=0xff;
P1=0x00;
for(i=0;i<8;i++)
{
P0=table3[i];
P2=table3[i];
delay(25);
}
delay(70);
P1=0x00;P2=0x00;P0=0x00;
for(i=0;i<8;i++)
{
P3=table2[i];
delay(25);
}
}
voiddeng9()//从中间向上下点亮,再熄灭
{
P0=0x00;P2=0x00;
for(i=0;i<8;i++)
{
P1=table3[i];
P3=table2[i];
delay(150);
}
for(i=0;i<8;i++)
{
P1=table4[i];
P3=table5[i];
delay(150);
}
}
voiddeng10()//从中间向上下熄灭
{
P0=0x00;P2=0x00;
for(i=0;i<8;i++)
{
P1=table5[i];
P3=table4[i];
delay(25);
}
P1=0xff;P3=0xff;
}
voiddeng11()//逆时针逐列点亮所有灯
{
P1=0x00;P3=0x00;
P0=0xff;P2=0xff;
for(i=0;i<8;i++)
{
P0=table2[i];
delay(25);
}
for(i=0;i<8;i++)
{
P2=table2[i];
delay(25);
}
P0=0xff;P2=0xff;P3=0xff;P1=0xff;
}
voiddeng12()//闪烁
{
uchari;
ucharb;
b=0xaa;
P2=b;
P0=b;
P1=b;
P3=b;
for(i=0;i<8;i++)
{
b=_cror_(b,1);//循环左移
delay(100);
P2=b;
P0=b;
P1=b;
P3=b;
}
P0=0xff;P1=0xff;P2=0xff;P3=0xff;
}
voiddeng13()//两层灯,分别从中间向上下移动
{
P2=0x00;P0=0x00;
for(i=0;i<8;i++)
{
P1=table1[i];
P3=table0[i];
delay(50);
}
P2=0xff;P0=0xff;P1=0xff;P3=0xff;
}
voiddeng16()//隔一层亮
{
P0=0x00;
P2=0x00;
P3=0x55;
P1=0x55;
delay(500);
}
voiddeng17()//1列灯滴水
{
uchard;
P2=0x7f;P0=0xff;
for(d=1;d>0;d--)
{
deng1234();
}
}
voiddeng18()//1列滴水
{
ucharf;
P2=0xfe;P0=0xff;
for(f=1;f>0;f--)
{
deng1234();
}
}
voiddeng19()//1列滴水
{
uchare;
P2=0xef;P0=0xff;
for(e=1;e>0;e--)
{
deng1234();
}
}
voiddeng20()//一列滴水
{
ucharj;
P2=0xfd;P0=0xff;
for(j=1;j>0;j--)
{
deng1234();
}
}
voiddeng01()//旋转往下
{
for(i=0;i<8;i++)
{
P1=table0[i];
P3=table0[i];
P0=table1[i];
P2=table1[i];
delay(50);
}
}
voiddeng21()//列灯亮
{
uchark;
P1=0x00;P3=0x00;
for(k=4;k>0;k--)
{
P0=0x7f;
delay(55);
P2=0x7f;
delay(55);
P0=0xef;
delay(55);
P2=0xef;
delay(55);
P0=0xfd;
delay(55);
P2=0xfd;
delay(55);
P0=0xdf;
delay(55);
P2=0xbf;
d