河南机电高等专科学校
综合实训报告
系 部: 电子通信工程系
专 业: 应用电子技术
班 级: 应 电 102 班
学生姓名: 王 永 强
学 号: 100414207
20xx年 6月
实训任务书
1.时间:20xx年5月28日~20xx年6月22日
2. 实训单位:河南机电高等专科学校
3. 实训目的:熟悉电路板及电子产品的制作全过程
4. 实训任务:
①了解电路板图得来的方法,掌握电路板图的打印技巧;
②会使用热转印机将电路图转印到覆铜板上;
③掌握电路板的腐蚀过程及注意事项;
④会使用高速钻床给电路板打孔;
⑤认识电子元器件,熟悉常用元器件的特性;
⑥熟练掌握焊接方法和技巧,完成电路板的焊接;
⑦掌握电子产品通电调试的注意事项,会编写程序;
⑧作好实训笔记,对自己所发现的疑难问题及时请教解决;
⑨联系自己专业知识,体会电子产品制作过程,总结自己的心得体会; 10参考相关的书籍、资料,认真完成实训报告。 ○
2
综合实训报告
前言:
光立方是由四千多棵光艺高科技“发光树”组成的,在20xx年10月1日天安门广场举行的国庆联欢晚会上面世。这是新中国成立六十周年国庆晚会最具创意的三大法宝之首。自从国庆60周年联欢晚会开始演练后,一个全新的名词“光立方”,吸引了全国人民的关注。国庆联欢晚会三样法宝,光立方为最。
实训报告:
“光立方”在气势和整体感觉上,融合了北京奥运会开幕式“击缶而歌”和“活字印刷”的风格,而各种图案则与贯穿奥运会开幕式的“画卷”有异曲同工之妙。“光立方”可以根据爱国歌曲的不同内容,展示不同的造型和图案,具有丰富的视觉效果。
本文主要介绍基于单片机统硬件组成的光立方,利用单片机控制LED的亮灭,并利用延时控制LED亮灭时间,最终使得整个立体展现不同的造型和图案,使其变得美轮美奂,绚丽多彩!
一、主要元器件介绍
1、T89S51简介
AT89S51是一个低功耗,高性能CMOS 8位单片机,片内含4k Bytes ISP(In-system programmable)的可反复擦写1000次的Flash只读程序存储器,器件采用ATMEL公司的高密度、非易失性存储技术制造,兼容标准MCS-51指令系统及80C51引脚结构,芯片内集成了通用8位中央处理器和ISP Flash存储单元,功能强大的微型计算机的AT89S51可为许多嵌入式控制应用系统提供高性价比的解决方案。
AT89S51具有如下特点:40个引脚(引脚图如图2所示),4k Bytes Flash片内程序存储器,128 bytes的随机存取数据存储器(RAM),32个外部双向输入/输出(I/O)口,5个中断优先级2
层中断嵌套中断,2个16位可编程定
时计数器,2个全双工串行通信口,看
门狗(WDT)电路,片内时钟振荡器。
此外,AT89S51设计和配置了振荡频率
可为0Hz并可通过软件设置省电模式。
空闲模式下,CPU暂停工作,而RAM定
时计数器,串行口,外中断系统可继续
工作,掉电模式冻结振荡器而保存RAM
的数据,停止芯片其它功能直至外中断
激活或硬件复位。同时该芯片还具有
PDIP、TQFP和PLCC等三种封装形式,
以适应不同产品的需求。
图一管脚图
3
2 、74HC573
图二74HC573管脚图
74HC573是高性能硅门CMOS器件,SL74HC573 跟 LS/AL573的管脚一样。器件的输入是和标准 CMOS 输出兼容的;加上拉电阻,他们能和 LS/ALSTTL 输出兼容。当锁存使能端LE为高时,这些器件的锁存对于数据是透明的(也就是说输出同步)。当锁存使能变低时,符合建立时间和保持时间的数据会被锁存。 ×\u36755X出能直接接到 CMOS,NMOS 和 TTL 接口上
×\u25805X作电压范围:2.0V~6.0V
×\u20302X输入电流:1.0uA
×CMOS器件的高噪声抵抗特性
二、8*8*8光立方原理图
图三 8*8*8光立方原理图
4
三、8*8*8光立方PCB图
图四 PCB图
四、具体操作流程
设计原理图、打印PCB图、热转印、腐蚀与打孔、焊接、调试与检测,具体如下:
A、设计原理图 利用绘图软件PROTEL 99SE。
B、打印PCB图 把整理好的PCB图用专用的打印纸打印出来。
C、热转印 先把印制需要的铜板用细砂纸打磨平整,再把打印好的PCB图的打印纸包裹在铜板上面,接着把热转印机的温度调到大于100度,再把包裹好的铜板进行热转印。完毕后,看看转印的图面是否清晰,如果有不清晰的地方用专用的油笔进行涂抹。
D、腐蚀、打孔 把转印好的铜板浸泡在一定浓度的FeCl3溶液中并进行一定的加热,目的是加快反应的速度。待反应完全之后,取出再用细砂布把铜线上的油墨洗去。用0.5mm、0.8mm、1.2mm的钻头进行打孔。对于自己设计的封装要注意孔径的大小,选取合适的钻头。
5
E、按照PCB图的元器件的位置放好元器件,调整合适的距离,用烙铁和焊锡以及松香,焊接牢固。
F、把焊接好事物接好电源,进行调试工作。对于可能出现的情况进行及时地分析找出原因的所在,做到通过现象学习知识、学习处理问题的能力。对于处理不了的问题及时的请教老师,帮助及时地解决。
五、LED灯焊接方法
1、焊接前准备工作
准备好烙铁、焊锡丝、钳子等工具,以及LED。LED的正负极很好判别,长的引脚为+,短的为-。
LED最好选用直径3mm的LED,推荐选蓝色。长脚的LED可以省很多工作量。实际测量长脚是29mm,短脚为27mm,由于LED光立方板子灯的间距决定了,每个LED的间距是20mm。这样长短引脚都符合这个尺寸。
由于所有LED框架焊接好后,一旦有LED损坏更换难度很大,所以焊接前要测试所有LED,用一般数字显示万用表打到二极管量程,用万用表红表笔接长引脚,黑的接短引脚。LED正常发光并且亮度基本一致,这样的LED就是好的,否则是坏灯。如果为了确保可靠也可以焊接好一层后测试LED是否能点亮。 2、焊接第一步
将8个LED焊接为一组,可以通过2种方法完成
第一种方法需要用钳子将LED的正极扭弯,这个弯,一定要小,正好露出LED外围打弯正合适,LED的正极折弯后留下的引脚长度必须大于LED的间距20mm,以确保有足够的重合位LED灯脚全部折好后,就可以焊接了,为了方便焊接可以在万能板上面钻几个2mm的孔,间距为 8个洞洞置以便焊接。
焊接细节,将一个LED正极的引脚靠近到另一个LED正极的打弯处,然后上焊锡焊接,焊接要光亮可靠,有一定机械强度。这样将全部LED焊接成8个一组的LED灯排待用。焊接时避免用过多助焊剂,要不会粘到LED表面,影响外观。焊机避免正负2极短路。注意每一层的二极管都是共阴的。
第二种方法需要借助一个工艺设备,这个东西可以自己动手制作,用这个辅助焊接当然要容易些。焊接方法也是一样的,将一个LED正极的引脚靠近到另一个LED正极的打弯处,然后上焊锡焊接,焊接要光亮可靠,有一定机械强度。这样将全部LED焊接成8个一组的LED灯排待用。焊接小经验,由于LED灯脚有一定弹性,一个LED的引脚靠近到另一个LED正极的打弯处时,一松手就又弹远了,所以建议焊接时多掰一点,掰过了之后利用弹性将两个要焊接的引脚 靠进,这样焊接会容易许多。以下是这个模具的快照:
6
以上是我的方法,在木板上按照规则扎64个孔。
最后通过架设支撑架的方式把各个层架起来,然后用电烙铁焊接起来就行
7
了。
六、效果图
七、参考程序
#include"3d8.h"
#include<reg52.h>
void reset()//复位
{
Y=0xff;
Z=0x00;
X=0x00;
}
void delay(uint z)//延时函数 {
uint x,y;
for(x=z;x>0;x--)
8
for(y=10;y>0;y--);
}
void delay_ms(uint z)//毫秒延时函数
{
uint x,y;
for(x=z;x>0;x--)
for(y=10;y>0;y--);
}
void value_YZ_face(uchar x_date,uchar time)
{
reset();
Y=0xff;
X=x_date;
Z=~0xff;
delay(time);
}
void value_XZ_face(uchar y_date,uchar time)
{
reset();
Y=y_date;
X=0xff;
Z=~0xff;
delay(time);
}
void value_XY_face(uchar z_date,uchar time)
{
reset();
Y=0xff;
X=0xff;
Z=~z_date;
delay(time);
}
void set_dot(uchar x,uchar y,uchar z,bit status,uchar time) {
reset();
if(status)
{
Y = (1<<y);
Z =~(1<<z);
X = (1<<x);
}
else
{
Y =~(1<<y);
9
Z = (1<<z);
X =~(1<<x);
}
delay(time);
}
void set_line_X(uchar y,uchar z,uchar x_date,bit status,uchar time)//平行于X轴的线
{
reset();
if(status)
{
Y = (1<<y);
Z =~(1<<z);
}
else
{
Y =~(1<<y);
Z = (1<<z);
}
X=x_date;
delay(time);
}
void set_line_Y(uchar x,uchar z,uchar y_date,bit status,uchar time)//平行于Y轴的线
{
reset();
Y=y_date;
if(status)
{
Z =~(1<<z);
X = (1<<x);
}
else
{
Z = (1<<z);
X =~(1<<x);
}
delay(time);
}
void set_line_Z(uchar x,uchar y,uchar z_date,bit status,uchar time)//平行于Z轴的线
{
10
reset();
if(status)
{
Y = (1<<y);
Z=z_date;
X = (1<<x);
}
else
{
Y =~(1<<y);
Z=z_date;
X =~(1<<x);
}
delay(time);
}
void set_line(uchar x1,uchar y1,uchar z1,uchar x2,uchar y2,uchar z2,bit status,uchar time)//通过两点坐标生成直线
{
uchar i,i1,i2,x_flag=0,y_flag=0,z_flag=0;
char x,y,z;
x=x1-x2;y=y1-y2;z=z1-z2;
if(x!=0)
{
if(x<0)
{i=x2-x1;x_flag=2;}
else
{i=x1-x2;x_flag=1;}
}
if(y!=0)
{
if(y<0)
{i=y2-y1;y_flag=2;}
else
{i=y1-y2;y_flag=1;}
}
if(z!=0)
{
if(z<0)
{i=z2-z1;z_flag=2;}
11
else {i=z1-z2;z_flag=1;} } /*SBUF='0'+i; while(!TI); TI=0; SBUF=' '; while(!TI); TI=0; SBUF='0'+x_flag; while(!TI); TI=0; SBUF=' '; while(!TI); TI=0; SBUF='0'+y_flag; while(!TI); TI=0; SBUF=' '; while(!TI); TI=0; SBUF='0'+z_flag; while(!TI); TI=0; SBUF=' '; while(!TI); TI=0;*/ //i=x2-x1;x_flag=2;y_flag=2;z_flag=2; for(i2=time;i2>0;i2--) { x=x1;y=y1;z=z1; for(i1=i+1;i1>0;i1--) { set_dot(x,y,z,status,3); /* switch(x_flag) { case 0: ;break; case 1:x-=1;break; case 2:x+=1;break; } 12
switch(y_flag)
{
case 0: ;break;
case 1:y-=1;break;
case 2:y+=1;break;
}
switch(z_flag)
{
case 0: ;break;
case 1:z-=1;break;
case 2:z+=1;break;
}*/
if(x_flag==1)
x-=1;
if(x_flag==2)
x+=1;
if(y_flag==1)
y-=1;
if(y_flag==2)
y+=1;
if(z_flag==1)
z-=1;
if(z_flag==2)
z+=1;
}
}
}
void set_solid_cube(uchar x1,uchar y1,uchar z1,uchar x2,uchar y2,uchar z2,bit status,uchar time)//实心立方体
{
uchar X1,Y1,Z1,t;
if(x1>x2)
{t=x1;x1=x2;x2=t;}
if(y1>y2)
{t=y1;y1=y2;y2=t;}
if(z1>z2)
{t=z1;z1=z2;z2=t;}
reset();
X1 = ((0xff<<x1)&(0xff>>(7-x2)));
Y1 = ((0xff<<y1)&(0xff>>(7-y2)));
Z1 =~((0xff<<z1)&(0xff>>(7-z2)));
if(status)
13
{Y = Y1;X = X1;Z = Z1;}
else
{Y =~Y1;X =~X1;Z =~Z1;}
delay(time*10);
}
void set_frame_cube(uchar x1,uchar y1,uchar z1,uchar x2,uchar y2,uchar z2,bit status,uchar time)//框架立方体
{
uchar X1,Y1,Z1,t,i;
if(x1>x2)
{t=x1;x1=x2;x2=t;}
/*SBUF='0'+x1;
while(!TI);
TI=0;
SBUF=' ';
while(!TI);
TI=0;
SBUF='0'+x2;
while(!TI);
TI=0;
SBUF=' ';
while(!TI);
TI=0;*/
if(y1>y2)
{t=y1;y1=y2;y2=t;}
/*SBUF='0'+y1;
while(!TI);
TI=0;
SBUF=' ';
while(!TI);
TI=0;
SBUF='0'+y2;
while(!TI);
TI=0;
SBUF=' ';
while(!TI);
TI=0;*/
if(z1>z2)
{t=z1;z1=z2;z2=t;}
/*SBUF='0'+z1;
while(!TI);
TI=0;
SBUF=' ';
14
while(!TI);
TI=0;
SBUF='0'+z2;
while(!TI);
TI=0;
SBUF=' ';
while(!TI);
TI=0;*/
reset();
X1 = ((0xff<<x1)&(0xff>>(7-x2)));
Y1 = ((0xff<<y1)&(0xff>>(7-y2)));
Z1 =~((0xff<<z1)&(0xff>>(7-z2)));
for(i=time;i>0;i--)
{
set_line_X(y1,z1,X1,status,5);
set_line_X(y1,z2,X1,status,5);
set_line_X(y2,z1,X1,status,5);
set_line_X(y2,z2,X1,status,5);
set_line_Y(x1,z1,Y1,status,5);
set_line_Y(x1,z2,Y1,status,5);
set_line_Y(x2,z1,Y1,status,5);
set_line_Y(x2,z2,Y1,status,5);
set_line_Z(x1,y1,Z1,status,5);
set_line_Z(x1,y2,Z1,status,5);
set_line_Z(x2,y1,Z1,status,5);
set_line_Z(x2,y2,Z1,status,5);
/*SBUF='0'+y1;
while(!TI);
TI=0;
SBUF=' ';
while(!TI);
TI=0;
SBUF='0'+y2;
while(!TI);
TI=0;
SBUF=' ';
while(!TI);
TI=0;*/
}
}
心得体会:
通过这次实训,我学到了不少课本上没有的知识,也锻炼了自己的动手能 15
力,将以前学过的零散的知识串到一起。
在实训刚开始的调研阶段,我学会了怎么通过各种方式查询相关的资料。通过对这些资料的学习,我大致了解了单片机的发展现状以及未来的发展趋势,认识到目前单片机方面的各种各样的发展,和它们之间的竞争。了解了单片机方面的先进技术,这些都为我的未来的学习指明了方向。
在这次实训的过程中,焊接LED灯花费了我不少时间,而且焊接起来特别麻烦,当时的心情真是纠结。不过,最后我终于彻底的完成了这个作品,我特别高兴。正所谓一分耕耘一分收获,无论再苦再累,坚持就是胜利! 参考文献:
[1] 祈伟,杨亭.单片机C51程序设计教程与实验 北京航空航天大学出版社20xx年1月
[2] 张瑞玲.单片机原理与应用 西北工业大学出版社20xx年12月
[3] 赵亮,侯国锐.单片机C语言编程与实例[M].北京:人民邮电出版社,2003.
16