电子电工实习报告.docx
- 文档编号:23341813
- 上传时间:2023-05-16
- 格式:DOCX
- 页数:23
- 大小:191.64KB
电子电工实习报告.docx
《电子电工实习报告.docx》由会员分享,可在线阅读,更多相关《电子电工实习报告.docx(23页珍藏版)》请在冰豆网上搜索。
电子电工实习报告
机电学院电子信息工程系
电
子
工
程
实
习
报
告
学生姓名:
XXX
班级:
071091
学号:
2009100XXXX
实习地点:
信息楼
目录
1.前言……………………………………………………………1
2.实习内容………………………………………………………2
第一阶段……………………..……...………......…………………2
第二阶段…………..…..…..…..….…………………………………5
第三阶段…………………………………..…..…..…………………5
第四阶段……………………………………………......……………10
3.心得体会………………………………………………………18
一.前言
微控制器诞生于20世纪70年代中期,经过20多年的发展,其成本越来越低,而性能越来越强大,这使其应用已经无处不在,遍及各个领域。
例如电机控制、条码阅读器/扫描器、消费类电子、游戏设备、电话、HVAC、楼宇安全与门禁控制、工业控制与自动化和白色家电(洗衣机、微波炉)等。
而89S51单片机作为其最简单,最典型的代表在教学和实践中都显示了其强大而简单的功能。
二.实习内容
第一阶段:
protel99下的PCB制板
1、原理图的设计
2、时间:
12月26号---12月31号
3、地点:
信息中心五楼
4、内容:
protel99下的PCB制板
5、要求:
掌握PCB制板方法,完成单片机系统PCB板制作
6、负责老师:
倪效勇、罗大鹏
7、实习步骤:
在电脑上用protel99进行PCB制板。
先根据图纸进行电路图绘制,每个模块检查正确之后;将文件导入PCB中,再进行PCB制板,检查正确之后方可通过;最后交予老师验收。
主要包括如下:
新建一个DDB——新建原理图——设置图纸的类型、大小、方向、标题栏——改变图纸底色——修改可视栅格的大小、类型、颜色——放置元器件——移动元件——调整元件的方向——修改元件的型号、参数及封装——放置导线——相应快捷键——生成网络报表——原理图的电气检查ERC
新建PCB文件——在KeepOut层绘制电路板边框——导入网络表——手动布局、布线——布线规则设置——手工布线——DRC
1、原理图的绘制
这是我们第一次接触到Protel99电路设计软件,因为是第一次接触Portel软件所以很多电子原器件的英文名都不知道,慢慢的绘制过程中,也让我们学到了不少电子原器件的英文名,在自己第一次做出来的电路板原理图总体感觉还是很满意。
其中我觉得难点是建元件库。
如单片机与数码管等有些元件需要自己绘制,其它部分大多可以在元件库中找到,可直接添加。
在实习的过程中,遇到了颇多问题。
例如:
在绘制电路图的过程中必须细心且耐心,要严格按照图纸上标注的绘制,一些细微的疏忽都会导致最后结果的错误。
在标注一些元器件的流水号与封装名称都要细心,某些元器件虽然看起来极其相似,但是封装名称却大不相同,比如蜂鸣器的封装名称就和某些电容的封装名称相同,值得注意。
其次需注意的地方就是端口一定要与程序一致。
中途有粗心弄掉元器件的,有把总线当做普通导线画的,有电气规则检查不过关,曾经出现过100余处错误,不过后来在与同学的互相讨论以及老师的帮助下解决了。
2、绘制PCB板
制作过程首先还是先绘制原理图,原理图绘制完成后,就开始封装原器件,在封装原器件的时候要注意PSB板中是否有此元件的对应脚标,以便PCB板的生成过程中找到此元件的实物图,还有,在绘制原理图的过程中,一定要注意元气件的排法,元气件和元气件之间不能叠加,元气件和元气件之间一定要用导线连接,不然在生产PCB板的时候,虽然检查不出错误,但在你生产完的时候,会发现有的元气件的没有导线连接,生产的PCB板中找不到元器件的连接。
在画边框的时候一定要用KeepOutLayer的紫色边框,不然不能自动布线。
画电路图的时候不能让线重叠,也不能断线,不能多点,也不能少点,否则就找不到所需的元件、在PCB中自动布线后,要认真检查线路是否与原电路图一致。
在画完原理图后,生成PCB图时有好多元件没有出现,对于这个问题,我首先便去检查各个元件的封装是否正确,发现有两个电容没有封装正确。
然而在改正之后还是不能正确生成原理图。
然后查看生成PCB图报错面板,最后经同学协助,终于查找出问题的原因。
原来是我以前曾在那个PCB文件生成过一次原理图,由于当时生成的错误太多,便放之不理。
当我把那几个错误的器件删除之后,一切正常。
最大的收获还是觉得很多东西要自己去干去做才会有收获。
3自己绘制的电路原理图及PCB
图1AT89S51单片机最小系统学习板原理图
图2AT89S51单片机最小系统PCB图
第二阶段:
单片机最小系统仿真
1、时间:
1月4号---1月8号
2、地点:
信息中心五楼
3、内容:
单片机最小系统板仿真
4、要求:
单片机最小系统仿真
5、负责老师:
杨勇、王勇
6、实习步骤:
在信息楼503利用Keil和Proteus相互配合写出程序,并进行仿真。
过程
因为之前没有系统的接触过程序和仿真,因此在这一阶段开始时,老师给我们了几个基本模块的示范代码,给我们用来熟悉与学习。
之后再在各个模块的基础上提出要求并进行综合。
虽然在阅读各个示范代码时感觉自己都看懂了,但在综合时,自己编写的代码仿真时却时常得不到我所希望的结果,在自己思考,询问老师和有经验的同学的帮助下,我发现每当遇到这样的情况,出错的地方往往是那些自己没有注意到的细节,这只能说明自己在阅读示范代码时并没有真正的理解透彻,因此在之后的综合过程中我经常拿出那些基本代码有针对性的再阅读理解遍,这样在综合时就更能减少错误的发生。
第三阶段:
单片机最小系统板焊接、功能测试
1、时间:
1月9号---1月11号
2、地点:
信息中心五楼
3、内容:
单片机最小系统板焊接、功能测试
4、要求:
实现最小系统电路功能测试
5、负责老师:
叶敦范、陈分雄
6、实习步骤:
在信息楼505进行单片机最小系统板焊接,在所有元器件焊接完成之后,在电脑上利用ISPlay软件进行功能测试;在功能测试完成之后方可通过。
电路板资源
AT89S51单片机(2个定时器、2个外部中断、串行中断)
蜂鸣器键盘数码管液晶LCD1602
焊接过程
并不是第一次焊接板子了,去年的实习也是焊接给我的印象最深。
在信息楼五楼的单片机最小系统板焊接的过程中,我重新熟习了去年夏天实习中所学习的焊接知识。
开始的时候还自信满满的,不紧不慢地弄弄这边,玩玩那边,一看别人都完成很多了,终于着急了,赶快的焊,还好没有误事。
不料这次的焊接和原来的略有区别,这次的焊接是要从头到尾一气呵成,并且因为孔比较小,焊接难度比去年要高一些,开始的时候我还不能习惯这么小的孔,焊点也感觉比较丑,后来还好,总算掌握了点技巧,但是还是出了一点不,USB插口焊掉了一个引脚,费了好大的力才把它给改过来,暗暗告诫自己要细心。
在后来焊的过程中,没有很大困难,偶尔需要同学帮忙。
由于我在焊接过程中还算比较小心,一直没有出什么错。
相关软件代码
给电路板上电后电源指示灯正常工作,证明电路板焊接无误。
接下来是部分模块代码及其编写思路:
a.蜂鸣器测试代码
说明:
这是一个每三秒蜂鸣器响一下的简单程序,相对于其他模块的代码这个是最直白的。
代码:
#include"reg52.h"
#defineucharunsignedchar
#defineuintunsignedint
sbitbuzz=P3^3;
ucharSeconds=0;//秒初始值
voiddelay(uintz)//1ms延时
{
ucharx,x1;
for(;z>0;z--)
{
for(x=0;x<114;x++)
{
for(x1=0;x1<1;x1++);
}
}
}
voidTimer0()interrupt1
{
staticucharCount_50=0;//
TH0=0xb7;
TL0=0xff;//定时时间为20ms,每20ms中断一次
Count_50++;
if(Count_50==50)//20ms*50=1秒
{
Count_50=0;
Seconds++;
if((Seconds/3)==0)
{
buzz=0;
delay(100);
buzz=1;
Seconds=0;
}
}
}
voidmain(void)
{
TMOD=0x01;
TH0=0xb7;
TL0=0xff;//定时时间为20ms,每20ms中断一次
ET0=1;//开T0中断
EA=1;//开总中断
TR0=1;//T0开始运行
while
(1);
}
b.液晶1602测试代码
说明:
头文件即为基础1602头文件,这段代码实现的功能是在液晶屏上显示"Helloteacher!
",并向左移动,ShowString_L()函数实现左移。
代码:
#include"reg52.h"
#include"1602.h"
charchar1[]={"Helloteacher!
"};//李哲丰
voidmain()
{
int_lcd();
DelayMS(100);
ShowString_L(char1);
DelayMS(500);
while
(1);
}
c.键盘测试代码
说明:
通过按键,在液晶屏上显示所按键的键值的十进制数(0-16)
代码:
#include
#include"1602.h"
#include"zlg7289.h"
unsignedchar*ptr;
unsignedcharcodea[]="lizhefeng71091";
voidmain()
{
unsignedchark,dat;
ptr=a;
LcdInit();
DispNChar(0,1,16,ptr);
ZLG7289_Init(5);
while
(1)
{
for(;;)
{
if(ZLG7289_pinINT==0)//有键按下
{
k=ZLG7289_Key();
//显示按键值
dat=k/10;
Disp1Char(0,0,dat+0x30);
dat=k-dat*10;
Disp1Char(1,0,dat+0x30);
//等待按键抬起
while(!
ZLG7289_pinINT);
}
delay_us(5);
}
}
}
d.数码管测试代码
说明:
这是数码管的一个初始化和测试函数
代码:
#include"reg52.h"
#include"zlg7289.h"
voiddelay(intz)//1ms延时
{
charx,x1;
for(;z>0;z--)
{
for(x=0;x<114;x++)
{
for(x1=0;x1<1;x1++);
}
}
}
voidmain()
{
ZLG7289_Init(5);
//测试
delay(10);
ZLG7289_Test();
delay(10);
}
第四阶段:
单片机最小系统综合考核、验收
1、时间:
1月12号---1月14号
2、地点:
信息中心五楼
3、内容:
单片机最小系统综合考核、验收
4、要求:
把所有模块综合到一个程序,并尽可能多的扩展功能
5、负责老师:
陈分雄、王勇、叶敦范
设计说明:
因为之前已经把各个模块都测试过了,因此对各个模块具体怎么运转,能够实现些什么功能有了个初步的认识,自己也能在这个基础上发挥出自己的想象,写出新的子程序,设计出新的功能出来,接下来我具体说说我各个模块所实现的功能。
首先是蜂鸣器,这是个非常简单的模块,因为之前手上有一个利用蜂鸣器播放音乐的程序,所以开始时想过把音乐整合到总程序里面去,但后来一方面因为播放音乐时间有些偏长,另一方面因为音乐程序利用了两个中断,整合进去比较麻烦,因此最后我权衡利弊决定放弃音乐播放功能,改用最基础也是最实用的普通蜂鸣进行按键提示和闹钟报时。
其次是数码管,首先我就在zlg7289的头文件中的zlg7289_init()函数中加入了数码管逐段显示的功能,然后我的想法是利用数码管实现时钟的显示功能,因为数码管不像液晶屏那样能显示更多的元素,因此我也没把那类似于左移、右移这样的可有可无的功能函数加进去(这个功能在1602中实现),也没把主要精力放在数码管上。
再就是液晶屏1602,,首先我做的事情也是自己修改1602的头文件,为了使最后编写主程序时更加简单明了,我自己编写了一个按键便直接显示两位十进制数的函数,这也为我之后编写加减法器奠定了基础。
其次受启于数码管的平移功能,因此我也打算在1602上实现移动的功能,但1602的头文件中本来并没有现成的平移函数,所以我便自己想算法,自己编写出了一个单排循环左移的子程序,然后实现的是按键加减法器的显示功能(例如显示出:
13+14=27)。
最后我把主要精力放在了键盘的使用上,我所实现的功能有加减法中加数(减数),加号(减号),被加数(被减数)的先后输入,输入完毕后自动先输出结果(1602上显示),再按特定键进行一排的清屏(单排清屏函数因为1602头文件中也没有,因此也是自己编写的),若没键入所设定的特定值,则一直等到键入这个值才会进行清屏,,并进行下一轮的加减法计算,并且在每一步的输入过程中会显示提醒你操作到了哪一步,及提醒你是该输入什么数据(加数、符号、被加数或者清屏键);其次在输入符号的那一步时,因为只需要两个键值来确定加减号,因此我便对其他键值设定了对数码管显示的时分秒进行调整的功能,并在1602上显示出到底是对时分秒具体哪个进行了什么调整。
问题及解决方法:
在编写各个子程序的时候遇到了不少小问题,但也差不多都自己解决了,最后在写main()函数的时候,首先遇到的问题就是;一方面我要在主程序的循环函数中不间断的刷新数码管以用来显示实时时间,另一方面也要在循环函数中通过按键来执行一步一步的加减法操作,这两者都必须存在于循环函数中,但这两者确实矛盾的,因此在我最初编写的程序中要么只可以实时显示时间,要么只可以进行加减法操作,在进行完一轮加减法后才能显示当时的时间,对于这个问题,我的想法是在每一次按键之前再加一个子循环程序,当有键按下是再跳出子循环程序,进行接下来的按键操作,我尝试过使用不同的方法,for(;;)+break;while
(1)+break;do()while;开始两个方法我尝试加进去后虽然理论上行的通,但实际烧到单片机中后却没有得到我所期望的结果,最后我用do()while函数,成功解决了这个问题,但发现按键时不能瞬间就松开,必须按下大概0.5秒才能跳出子循环,当发现这个问题后我开始想是不是延时程序的原因,但加入显示函数用来测试后发现好像不是延时的原因,因此我猜测可能是判断本身需要一定的时间吧。
(或许之前两种方法也是行得通的,只是之前没注意按键时间的原因而没得到所想结果)
代码:
#include"reg52.h"
#include"intrins.h"
#include"1602.h"
#include"zlg7289.h"
#defineucharunsignedchar
#defineuintunsignedint
#defineDATAP0//数据传输口
unsignedcharcodeb[]="";
unsignedcharcodec[]="s++";
unsignedcharcoded[]="m++";
unsignedcharcodee[]="h++";
sbitkey1=P2^3;
sbitkey2=P2^4;
sbitkey3=P2^5;
sbitbuzz=P3^3;
ucharHours=13;//小时初始值
ucharMinutes=59;//分钟初始值
ucharSeconds=0xfa;//秒初始值
bitSeconds_marks=1;//秒闪烁标志
uchartime[]="Time:
";
ucharcodeDispTab_1[]={'0','1','2','3','4','5','6','7','8','9'};//1602:
0-9数字
ucharcodeDispTab_2[]={'A','B','C','D','E','a','b','c','d','e'};//1602:
A-e字母
ucharDispdata[8];//8字节的显示数据
charchar1[]={"lizhefeng71091"};//李哲丰
charchar2[]={""};//定义空字符串
voiddelay(uintz)//1ms延时
{
ucharx,x1;
for(;z>0;z--)
{
for(x=0;x<114;x++)
{
for(x1=0;x1<1;x1++);
}
}
}
voidTimer0()interrupt1
{
staticucharCount_50=0;//
uchartemp;
TH0=0xb7;
TL0=0xff;//定时时间为20ms,每20ms中断一次
Count_50++;
if(Count_50==50)//20ms*50=1秒
{Seconds_marks=~Seconds_marks;
Count_50=0;
Seconds++;
if(Seconds==60)
{
buzz=0;
delay(1000);
buzz=1;
Seconds=0;
Minutes++;
if(Minutes==60)
{
Minutes=0;
Hours++;
if(Hours==24)
{
Hours=0;
}
}
}
}
if(Seconds_marks==1)//秒闪烁标志判断
Dispdata[6]=':
';
else
Dispdata[6]='';
Dispdata[0]=Hours/10;//转换成10进制显示
Dispdata[1]=Hours%10;
Dispdata[2]=Minutes/10;
Dispdata[3]=Minutes%10;
Dispdata[4]=Seconds/10;
Dispdata[5]=Seconds%10;
Dispdata[7]=':
';
temp=Dispdata[0];
Dispdata[0]=DispTab_1[temp];//查表取字符
temp=Dispdata[1];
Dispdata[1]=DispTab_1[temp];
temp=Dispdata[2];
Dispdata[2]=DispTab_1[temp];
temp=Dispdata[3];
Dispdata[3]=DispTab_1[temp];
temp=Dispdata[4];
Dispdata[4]=DispTab_1[temp];
temp=Dispdata[5];
Dispdata[5]=DispTab_1[temp];
}
voidwrite_com(uchara)//写指令
{
RS=0;
RW=0;
delay
(1);
E=0;
DATA=a;
delay
(1);
E=1;
delay
(1);
E=0;
delay
(1);
}
voidwrite_Data(uchara)//写数据
{
RS=1;
RW=0;
delay
(1);
E=0;
DATA=a;
delay
(1);
E=1;
delay
(1);
E=0;
delay
(1);
}
voidinit()//初始化
{
uchari,j,k=16;
TMOD=0x01;
TH0=0xb7;
TL0=0xff;//定时时间为20ms,每20ms中断一次
ET0=1;//开T0中断
EA=1;//开总中断
TR0=1;//T0开始运行
Dispdata[6]=':
';
delay(15);
write_com(0x38);
delay(5);
write_com(0x38);
delay(5);
write_com(0x38);
write_com(0x01);
write_com(0x02);//初始化后数据地址为0x80;即第一行,第一个位置
write_com(0x0c);//不显示光标
write_com(0x80+0x40);//第二行第一位地址
for(j=0;j<17;j++)
{
for(i=0;i<16;i++)
{
k=i+j;
if(k>15)k=k-16;
write_Data(char1[k]);//显示字符串"lizhefeng71091"
delay(20);
}
write_com(0x80+0x40);
}
}
voidTime_data()//显示时间函数
{
ZLG7289_Download(1,4,0,Dispdata[0]);
ZLG7289_Download(1,5,0,Dispdata[1]);
ZLG7289_cmd_dat(0x96,0x01);
ZLG7289_Download(1,7,0,Dispdata[2]);
ZLG7289_Download(1,0,0,Dispdata[3]);
ZLG7289_cmd_dat(0x91,0x01);
ZLG7289_Download(1,2,0,Dispdata[4]);
ZLG7289_Download(1,3,0,Dispdata[5]);
delay_us(250);
}
voidmain()
{
unsignedcharadd=1,s=0;
unsignedintdat0;
ZLG7289_Init();
LcdInit();
init();
key1=1;
key2=1;
key3=1;
while
(1)
{
Time_data();//调用时间函数,1表示第一行;2表示第二行
do{Time_data();Disp1Char(10,0,'0');}
while(ZLG7289_pinINT);
buzz=0;
delay(10);
buzz=1;
ZLG7289_xianshi(0,0);//输入数据1
s=k;
do{Time_data();Disp1Char(10,0,'1');}
while(ZLG7289_pinINT);//输入符号
buzz=0;
delay(10);
buzz=1;
k=ZLG7289_Key();
if(k==14){Disp1Char(2,0,'+');add=1;}
elseif(k==15){Di
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 电子电工 实习 报告