基于单片机的光立方课程设计.docx
- 文档编号:20669981
- 上传时间:2023-04-25
- 格式:DOCX
- 页数:97
- 大小:1.25MB
基于单片机的光立方课程设计.docx
《基于单片机的光立方课程设计.docx》由会员分享,可在线阅读,更多相关《基于单片机的光立方课程设计.docx(97页珍藏版)》请在冰豆网上搜索。
基于单片机的光立方课程设计
单片机课程设计报告
题目基于单片机的4*4*4光立方设计
系别计算机科学系
专业计算机科学与技术
班级
学号
姓名
指导教师
日期
【摘要】当今社会,随着电子行业的不断发展,单片机的应用从根本上改变了传统的控制系统设计思想和设计方法,已广泛的应用在工业自动化、通信、自动检测、信息家电、电力电子航空航天等各个方面。
成为现代生产和生活中不可缺少的一部分。
我们学习单片机也一个学期了,此次单片机课程设计,我采用的是STC12C5A60S2系列的单片机,设计一个4*4*4模式的“光立方”。
将LED灯分成4层,利用程序来编写各种不同的效果来控制LED的亮灭,最终使得整个立方体展现不同的变换,美轮美奂,绚丽多彩。
【关键词】单片机课程设计光立方
1绪论
1.1课题研究的背景
“光立方”一词正逐渐引起了全国人民的关注,并得到了全球的高度肯定。
所谓“光立方”:
就是在平面LED基础上发展起来的新的显示技术,通过复杂的程序控制,在三维空间能够显示具有立体感的图形、动画等。
由此,也掀起了光立方的设计与学习热潮,在原有的基础上不断增加难度,增加变换花样,吸引电子爱好者对其研究、创新。
光立方是由LED灯组成,由于发光二级管质量比较稳定,使用寿命长,不用频繁地去更换,能减少成本,更节能。
光立方作为一种特殊的显示资源,已用于一些广告行业、家庭、娱乐厅、会议室、大型演唱会、城市地标广场等场所的布置和装饰,还可以用于更广泛方面,具有广阔的应用前景。
1.2课题研究的意义
本次毕业设计一改传统的平面流水灯的风格,而是从平面向立体发展,通过更宽广的三维空间呈现出更加绚丽的效果,直接冲击着人们审美视觉,不在停留在乏味的平面成像。
光立方主体部分由64个LED灯组成,在制作过程中锻炼学习动手焊接能力,并以低成本,智能化产品对实现经济利益、商业价值的形成具有积极的推动作用。
光立方的研究极具创意和启发,而且可以低成本、高效益的研究未来的3D技术。
2总体设计
2.1设计目的
1.进一步掌握单片机的原理及其功能。
学会利用单片机做一些课外电子设计与制作。
2.熟悉LED点亮条件及其工作原理。
3.熟悉光立方显示的原理及其相关的线路连接。
4.通过此次的电路焊接和调试提高自己的动手及其分析问题的能力。
2.2工作原理
光立方其功能相当于三维显示器,只不过光立方是由LED灯组成的三维的立方体。
光立方显示的原理简单的说就是用单片机控制64个LED灯,在不同时刻点亮要显示图案位置所在的灯,利用人眼余辉效应,可以看到比较完整的显示图案或动画了。
其原理如下:
光立方从下到上共4层,每一层16个LED的负极接到一起,第一层16个蓝色正极和16个红色正极分别单独引出,第二层的每个正极分别接到它对应第一层正极,第三层的正极接第二层的正极。
就是竖着看是8个接到一个正极上。
连在一起的是阴极,这样焊接起来。
光立方引出4层引出线加上16个正极引出线。
3系统硬件电路设计与实现
3.1元件清单
PCB板*1,
红蓝双色超高亮长脚LED*70,
40P圆排母*4,
5MMLED间隔柱*5,
5MM七彩LED*5,
15MM铜柱*5,
DC005线*1,
DC005座*1,
25V470UF电解电容*1,
1K电阻*4,
40P芯片底座*4,
22P瓷片电容*1,
STC12C5A60S2芯片*1,
11.0592M晶振*1,
单芯导线*1
3.2硬件电路设计
本电路是由单片机STC12C5A60S2为控制核心,具有大容量程序存储器且是FLASH工艺的,具有串口烧写编程功能,低功耗;时钟源电路有很多种,比如阻容低速时钟源、普通晶体时钟源、带缓冲放大的晶体时钟源等等,考虑到电路稳定及材料选购等方面,决定采用普通晶体时钟源,其中晶体用11.0592M的石英晶振。
显示部份由显示部份由64个LED灯组成来进行显示。
3.3单片机最小系统
单片机的最小系统就是让单片机能正常工作并发挥其功能时所必须的组成部分,也可理解为是用最少的元件组成的单片机可以工作的系统。
对89C51单片机来说,最小系统一般应该包括:
单片机、时钟电路、复位电路、输入/输出设备等。
单片机的最小系统如下图所示:
3.3电路图设计
通过电路图设计,方便搭建起光立方的架构。
1.电源设计电路图
2.时钟电路图
3.整体电路图
3.4光立方搭建方法
3.4.1将LED从点到线的搭建
首先接线下灯座的制作方法:
把40P圆排母用水口钳或者斜口钳剪成单针如下图所示
把其余元器件焊接好后图:
3.4.2将LED从线到面的搭建
进行八次上诉焊接后接下来就是将4束的LED焊接起来。
在从点到线时是将所有LED的阴极连在一起,而这次则是将所有LED阳极弯折并依次连接,如图所示。
注意:
由于焊接过程中将产生静电容易将LED烧坏,因此本项工作完成后请认真检查每个灯的好坏,可以用万用笔等工具检测。
同时检测灯与灯之间有没虚焊情况。
3.4.3将LED从面到体的搭建
最后一个步骤是将已焊好的4个面进行焊接,其方法是将之前8个面上的阴极对应位置依次焊接,最后留出的4个阴极与输出端进行连接。
实物图如下图所示。
4.系统软件设计
4.1主程序设计
程序主函数运行流程框图如下图所示。
4.2软件测试
光立方主要是通过程序来控制光立方体从而达到多种动画变化的效果。
由于要形成多样的3D动画,在变成过程中也出现了不少的问题。
最后经过多次的细心修改,顺利的完成了编程工作。
4.3结果分析
本设计通过硬件设备和软件完美配合,总共呈现十一个连续的动画效果。
经过多次的反复测试与分析,所呈现的动画与程序中预期的效果吻合,符合设计要求。
在软硬件测试过程中让我们对原先设计的电路的原理及功能进一步熟悉,并对各电路模块和相关的芯片联合工作更加了解。
在这个调试的过程中虽然挺枯燥无味,但锻炼我们发现问题并解决问题的能力,对我们的专业知识起到了温故知新的作用。
5课程设计心得体会
此次为期两个礼拜的课程设计,让我感受颇深。
最终看到了绚丽多姿,变化多端的LED光立方的图案。
在中,在很大程度上培养了自己的独立思考及其动手能力。
学会了自己独立的发现问题、分析问题。
老师在实验室指导我们的设计,在查阅资料仍找不到但答案的还可以请教老师。
尽管此次设计过程中遇到些问题,但最终还是一步一个脚印过来了。
此次设计在丁老师的指导下完成的,老师扎实的专业知识,让我觉得自己还有好多的知识需要去学习。
在这大学的时间,要好好的提升自己的相关技能。
程序代码
#include
#include
#defineuintunsignedint
#defineucharunsignedchar
#defineMAX_Delay8
#defineMIN_Delay1
sbitS_1=P1^1;
sbitS_2=P1^2;
unsignedintpwm;
unsignedcharTimeDelay=10;
unsignedcharMode=1;
unsignedcharcodetabP2[]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F};//扫描
uchars=0;
voidDELAY_MS(uchari){
//unsignedinti;
//while(--a!
=0){
//for(i=0;i<600;i++);
//}
ucharx,j;
for(j=0;j
for(x=0;x<=148;x++);
}
voidAdc_Delay(uinta){
uinti;
while(--a!
=0){
for(i=0;i<600;i++);
}
}
voidDelay(uintz)
{
uintx,y;
for(x=80;x>0;x--)
for(y=z;y>0;y--);
}
voidtimer1_init()
{
TMOD|=0x10;
TH1=0;
TL1=0;
ET1=1;
TR1=1;
EA=1;
}
/*******************************************************************************
**********************AD转换函数**************/
/******************************************************************************/
unsignedcharRead(unsignedcharCHA)
{
unsignedcharAD_FIN=0;//存储A/D转换标志
CHA&=0x07;//选择ADC的8个接口中的一个(00000111清0高5位)
ADC_CONTR=0x00;//ADC转换的速度(0XX00000其中XX控制速度,请根据数据手册设置)
_nop_();
ADC_CONTR|=CHA;//选择A/D当前通道
_nop_();
ADC_CONTR|=0x80;//启动A/D电源
Adc_Delay
(1);//使输入电压达到稳定(1ms即可)
ADC_CONTR|=0x08;//启动A/D转换(00001000令ADCS=1)
_nop_();
_nop_();
_nop_();
_nop_();
while(AD_FIN==0)
{//等待A/D转换结束
AD_FIN=(ADC_CONTR&0x10);//00010000测试A/D转换结束否
}
ADC_CONTR&=0xE7;//11110111清ADC_FLAG位,关闭A/D转换,
return(ADC_RES);//返回A/D转换结果(8位)
}
/*******************************************************************************
*************AD电容式触摸按键检测程序******************/
/*********************************************************************************************/
//bit1表示有感应物,0表示没有感应物S1
/**********************************************************************************************/
bitS1(void)
{
unsignedcharR,mm=0,i,j,k;
bitaa;
j=0;k=0;
for(i=0;i<10;i++)
{//一次采集数据的数量
Adc_Delay(3);
R=Read
(1);//读对应的口,触发对应的触摸按键
if(R<0x2f)
{//此参数可调整感应灵敏度值在0x01到0x2F
k++;
}
if(R==0xFF)
{
j++;
}
}
if(k>1&&j>1)
{
mm++;
}
else
{
mm=0;
}
if(mm>0)
{
aa=1;
}
else
{
aa=0;
}
return(aa);
}
/*********************************************************************************************/
//S2
/**********************************************************************************************/
bitS2(void)
{
unsignedcharR,mm=0,i,j,k;
bitaa;
j=0;k=0;
for(i=0;i<10;i++)
{//一次采集数据的数量
Adc_Delay(3);
R=Read
(2);
if(R<0x2F)
{//此参数可调整感应灵敏度值在0x01到0x2F
k++;
}
if(R==0xFF)
{
j++;
}
}
if(k>1&&j>1)
{
mm++;
}
else
{
mm=0;
}
if(mm>0)
{
aa=1;
}
else
{
aa=0;
}
return(aa);
}
//结束呼吸灯专用
ucharcodetable[]={
0,0,1,2,3,4,5,6,7,8,9,10,
11,12,13,14,15,16,17,18,
19,20,21,22,23,24,25,26,27,
28,29,30,31,32,33,34,35,36,
37,38,39,40,41,42,43,44,45,
46,47,48,49,50,51,52,53,54,
55,56,57,58,59,60,61,62,63,
64,65,66,67,68,69,70,71,72,
73,74,75,76,77,78,79,80,81,82,
83,84,85,86,87,88,89,90,91,
92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,
110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,
};
voidPwmUp(uinta,ucharc)
{
uchari;
if(c==1)
P3=0X00;
else
P0=0X00;
P2=0X00;
i=table[a];
Delay(i);
if(c==1)
P3=0XFF;
else
P0=0XFF;
P2=0X00;
Delay(150-i);
}
voidPwmDown(uinta,ucharc)
{
uchari;
if(c==1)
P3=0XFF;
else
P0=0XFF;
P2=0X00;
i=table[a];
Delay(i);
if(c==1)
P3=0X00;
else
P0=0X00;
P2=0X00;
Delay(150-i);
}
voidPwmAllon(ucharc)
{
inti;
for(i=0;i<150;i++)
{
PwmDown(i,c);
}
if(c==1)
P3=0X00;
else
P0=0X00;
P2=0X00;
}
voidPwmOff(ucharc)
{
inti;
//P3=0XFF;
//P2=0X00;
//Delay(100);
for(i=0;i<150;i++)
{
PwmUp(i,c);
}
//P3=0X00;
}
voidAllfalloff(ucharc,uchartime)//由全亮到下落关闭只剩一排
{
unsignedcharcodetabP0[5][8]={
{0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF},
{0x00,0xFF,0xFF,0xFF,0x00,0xFF,0xFF,0xFF},
{0x00,0x00,0xFF,0xFF,0x00,0x00,0xFF,0xFF},
{0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF},
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
};
intj,k,i;
if(c==1)
P3=0X00;
elseif(c==2)
P0=0X00;
else
{
P3=0XFF;
P0=0XFF;
}
for(j=0;j<5;j++)
{
for(k=0;k<15;k++)
{
for(i=0;i<8;i++)
{
//P0=0;
P2=tabP2[i];
if(c==1)
P0=tabP0[j][i];
elseif(c==2)
P3=tabP0[j][i];
else
P0=tabP0[j][i];
DELAY_MS(time);
}
}
}
}
voidRandomlight(ucharc,uchartime)//随机亮完
{
unsignedcharcodetabP0[38][8]={
{0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00},
{0x00,0x20,0x00,0x00,0x00,0x00,0x10,0x00},
{0x00,0x20,0x00,0x00,0x00,0x02,0x10,0x00},
{0x00,0x20,0x04,0x00,0x00,0x02,0x10,0x00},
{0x00,0xA0,0x04,0x00,0x00,0x02,0x10,0x00},
{0x00,0xA0,0x24,0x10,0x00,0x02,0x10,0x00},
{0x40,0xA0,0x24,0x10,0x00,0x02,0x10,0x00},
{0x40,0xA0,0x24,0x10,0x20,0x02,0x10,0x00},
{0x40,0xA0,0x24,0x10,0x20,0x22,0x10,0x00},
{0x40,0xA0,0x24,0x10,0x20,0x22,0x14,0x42},
{0x40,0xA0,0x24,0x10,0x20,0x26,0x14,0x42},
{0x40,0xA0,0x25,0x10,0x20,0x26,0x14,0x42},
{0x44,0xA0,0x25,0x10,0x20,0x26,0x14,0x42},
{0x44,0xA0,0x25,0x50,0x20,0x26,0x14,0x42},
{0x44,0xA0,0x25,0x50,0xA0,0x26,0x14,0x42},
{0x44,0xA0,0x25,0x50,0xA0,0x27,0x14,0x43},
{0x44,0xA0,0x25,0x50,0xA0,0x27,0x14,0x53},
{0x44,0xA0,0x65,0x50,0xA0,0x27,0x54,0x53},
{0x44,0xA0,0x65,0x50,0xA0,0xA7,0x54,0x53},
{0x44,0xA0,0x65,0x50,0xA8,0xA7,0x54,0x53},
{0x44,0xA0,0x65,0x50,0xA8,0xA7,0x56,0x5B},
{0x46,0xA0,0x67,0x52,0xA8,0xA7,0x56,0x5B},
{0x46,0xA1,0x67,0x52,0xA8,0xA7,0x56,0x5B},
{0x46,0xB1,0x67,0x52,0xA8,0xA7,0x56,0x5B},
{0x46,0xB1,0x67,0x5A,0xA8,0xA7,0x56,0x5B},
{0x56,0xB1,0x67,0x5A,0xA8,0xA7,0x56,0x5B},
{0x56,0xB1,0x67,0x5A,0xA8,0xE7,0x56,0x5B},
{0x56,0xB1,0x67,0x5A,0xAA,0xE7,0x56,0x5F},
{0x56,0xB1,0x67,0x5A,0xAA,0xE7,0x56,0x7F},
{0x56,0xF9,0x67,0x7A,0xAA,0xE7,0x56,0x7F},
{0x56,0xF9,0x67,0x7A,0xAE,0xE7,0x5E,0x7F},
{0x5E,0xFD,0x67,0x7B,0xAE,0xE7,0x5E,0x7F},
{0x5E,0xFD,0x67,0x7B,0xEE,0xE7,0xDE,0xFF},
{0xDE,0xFD,0xE7,0xFB,0xEF,0xE7,0xFF,0xFF},
{0xDE,0xFD,0xF7,0xFB,0xFF,0xF7,0xFF,0xFF},
{0xDE,0xFD,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF},
{0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF}
};
intj,k,i;
if(c==1)
P3=0X00;
elseif(c==2)
P0=0X00;
else
{
P3=0XFF;
P0=0XFF;
}
for(j=0;j<38;j++)
{
for(k=0;k<10;k++)
{
for(i=0;i<8;i++)
{
//P0=0;
P2=tabP2[i];
if(c==1)
P0=tabP0[j][i];
elseif(c==2)
P3=tabP0[j][i];
else
{
P3=tabP0[j][i];
P0=tabP0[j][i];
}
DELAY_MS(time);
}
}
}
}
voidRandomoff(ucharc,uch
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 单片机 立方 课程设计