实习目的
生产实习是电子信息工程专业重要的实践性教学环节,生产实习是在学生已学习了专业基础课和部分专业课后进行的一个理论联系实际的实践性教学环节。通过生产实习,能够使学生接触生产、科研、企业管理,达到理论与实践相结合的目的,加深对专业的了解,拓宽知识面,获得基本操作训练,是培养学生分析问题和解决问题的重要途径,是培养高素质应用型人才不可缺少的环节。
实习时间:20xx.05.25——20xx.06.29
实习地点:XX电子有限公司
实习单位介绍:
武汉肯纳电子有限责任公司坐落于美丽的江城汤逊湖之滨,临近数所高校,交通便利;专注于工业测试与控制系统的研究开发和生产,是国内早期致力于张力控制系统研究的企业,迄今为止,已有十余年的历史。公司拥有实力雄厚的开发和应用团队,以科技创新、高质量的产品保障以及无间隙客户服务为企业发展主旨,致力于中国印包机械控制系统、复合机控制系统、切割机控制系统的技术提升,以全面提升国内机械控制行业的竞争力为己任。
通过多年的研发,公司已形成了张力控制系统、张力控制器、手动张力控制器、张力传感器、张力变送器、功率放大器、CCD光电纠偏控制器、切割机、节能器系列产品,公司张力类产品广泛装备于国内印包装、纺织电线光缆等多种行业机械设备上。
公司特为广大高校电类专业院系设立生产实习中心,让学生在实习中心自己动手的过程中了解电子产品从生产流程,品质控制到检测手段等一系列生产过程,接触并了解当今最前沿的电子产品生产 技术(SMT表面贴装技术)及管理模式。让学生理论与实际相结合,为今后的工作打下良好实践基础。
实习内容及过程
本次实习共五天,五天的基本安排为:
第一天:上午是实习场所的一些介绍,以及一些焊接技术的介绍,下午是对实习期间的实习所做的电话机的原理的一个介绍。
第二天:上午前面两个小时左右时进一步对几种焊接技术的进行介绍,重点是对手工焊接的一些要点和应该注意的问题的介绍,为后面近两天的手工焊接 PCB板做准备,后面两个小时是就一些基本元件包括电容,电感,电阻,二极管和三极管的识别和分类的介绍,也是为在后面的作业做准备。
下午就是进行元件的分辨了,这个过程比较的耗时间。
第三天:根据具体的分组情况,模仿流水线作业,每个组员根据自己的所安排的工作,按需跟组员之间互相分类和查找自己工作时所需的元件,然后是用元件分完后,用数字万用表检测是否为自己所需,下午就是焊接过程了,由于我们平时在学校用到的都是通用板,焊接起来并没有那么的费力,以及相关的问题也不是那么的明显,而在这次实习中,问题很严重,这个也直接导致了后面我们是电话机不能完全实现功能。
第四天:PCB板的焊接基本结束,主要是进行了一些补焊的工作,还有就是焊接了多引脚的液晶屏,这个焊接的过程中主要是在发挥了阻焊剂的作用的同时还有效的利用了液体的粘滞性,然后就是对主板的一些外围设备的焊接,如键盘,speaker,听筒和话筒。
下午开始对机子的组装和测试,这个过程我们基本是很粗糙的完成的,实习报告上的测试内容特别是哪些功能块有问题的都没能得到解决,然后就是对几种焊接技术和机器的介绍认识,为第二天进入生产车间的观察做准备。
第五天:上午跟同实习指导老师一同进入车间进行观察,由于以前自己也参加过暑期的实地实习工作,对车间的相关有一定的认识,所以后面的手工操作并没有给予我太大的认识,我更多的是关注那些机器设备的运作了,感触比较的深,因为自己大学期间也经常关注到各种有关于PCB的制作以及元件的焊接,但是没能有机会进行实地考察,这次算是有了相当的认识。
下午我们对前面做的电话机进行了故障排除工作,这个算是比较的涉及专业知识的,特别这块儿基本是模拟的,让我们对模拟电路的作用有了更深刻的认识。
实习总结
这次实习所做的工作虽然和本专业没多大的联系,但我们还是学到了很多东西,每天都有很多的体会,我总结大致有以下几点:
1. 严格遵守公司规章制度
在学习里学习生活,虽然有学校纪律约束自己的行为,但相对于在公司工作,还是非常懒散和不受控制的。因为这校园纪律大都是警告性质的,不会对自己的发展有很大的影响。在公司里工作,在方方面面都有详细的规章制度。这制度就像高压线一样,如果触犯它们就要受到处罚,大多是扣工资之类的,严重点的话可能会对自己以后的发展带来很坏的影响。同时,要成为一个非常职业,非常有素质的职业者,必须积极去面对自己的工作,认真刻苦的把工作做好,想尽一切办法把自己的工作做完美。而作为一个职业者,认真负责,积极进取的态度会是自己发奋工作的源动力。所以,要成功的进行实习,就必须首先树立认认真负责、刻苦、积极进取的职业操守,像一个真正的职业者一样要求自己,不能再像在学校那样懒懒散散的了。
2. 多听,多看,多做
我们到公司工作之后,要知道自己能否胜任这份工作,关键是看你自己对待工作的态度,态度好了,即使自己以前没有学过的知识也可以在工作中逐渐掌握,态度不好,就算自己有知识基础也不会把工作做好。我们刚到包装部时,也不清楚要做些什么,而且这些和我们专业也没有必然的联系,可是我们看多了,听师傅教了就知道做了,做多了到后来越来越熟练了,能够帮师傅们做很多事了,心里感到很高兴。
3. 少埋怨
有的人会觉得包装着工作很繁琐、很机械、很无聊,而且与我们所学专业没联系,就经常抱怨,这样很影响自己的工作情绪,是自己心情不好,也做不好工作。所以,我们应该少埋怨,毕竟很多工作都需要人来做,无论做什么工作,我们都应该以良好的态度对待,相信总会有点收获的,我们应该多看到好的方面,这样才能保持工作的激情。
4. 虚心学习
在这次实习中过程中,我们会遇到很多问题,有的我们懂得了,也有很多我们不懂的,不懂的东西我们就要虚心向师傅同事请教了,当别人教我们知识时候,我们应该虚心接受,要不然就可能做错,特别像我们包装的,更应该多听师傅的话,做错一点都不得,要保持认真严肃的态度去做事。
5. 细心加耐心,知错就改
每个人都有犯错的时候,工作中第一次犯错不要紧,能够马上改过来就得了,但下次不要再犯同样的错误,否则后果是很严重的,会给公司带来一定的损失的。
此外,这次实习还让我体验了公司的正常工作,学会了如何与同事相处,还锻炼了自己的耐力与毅力。也让我认识了工作的不容易,找工作更是很难,这也让我在就业心态上有了很大的改变,以前我总是想找一份适合自己爱好和专业对口的工作,可现在我知道那是很难的,很多东西我们初到社会才接触。所以我现在不能向以前那样等待机会的到来,而是要建立起先就业后择业的就业观,尽量学会在社会上独立,敢于接受社会的压力与考验,使自己能够在社会上快速成长。我们要保持一颗学习、思考的心,在企业这样一个新环境中,有很多我们值得学习很思考的地方。我们要认真对待工作,要有一颗职业者的心态去对待工作,做好自己的每一份工作,还要注重学习企业先进的管理和人文文化,一丰富自己的社会知识和管理文化知识,为自己日后的职业生涯打下良好的基础。
一.实习记录
1.7月2日
① 讲述Gcc Gcc工具链四个步骤:预处理、编译、汇编、链接。
在Linux操作系统下,在终端中文本编辑的命令为vim +文件名(如test123.c),回车进入文件,然后进行编写。编译命令:gcc +源文件名+-o+可执行文件名。运行:./ +可执行文件名。输入命令gcc-c test.c 时,则会生成.o文件。
在文本编辑情况下,有三种模式:命令、输入、末行,它们之间的转换关系图为:
a:输入i/o/a;b:esc;c:冒号,其中可以为wq:保存退出
q!不保存退出,应注意的是保存退出需在末行模式下进行
几种命令:gcc-o test test.c-Wall 把所有警告显示出来
gcc-o test test.c-O2
提高效率(在底层开发运用)
gcc-o test test.c-g
进入gdb调试模式
② Gdb调试器
可设置断点、单步执行、查看变量、查看文件 a.-g 编译
gcc 源文件-o 可执行文件名-g b.gdb空格./test 运行 c.l +数字
显示代码 d.b +数字/函数名
设置断点 e.r
执行程序 f.p +变量
打印变量 g.n 单步执行
h.c 依次继续往下执行
Ctrl +c停止 i.q 退出
j.s 进入函数
info break 断点信息
快捷键:方向键:翻命令
Tab键:补全命令
修改vim属性命令:vim ~/.vimrc(~表示当前用户根目录,.表示隐藏文件)然后编写:set tabstop=4 set
shiftwidth=4 set
autoindent set
cindent set
nu 2.7月3日
① 版权和版本声明:
位于头文件和函数定义的开头,包括版本、作者、更新日期 注释:函数介绍、输入参数、输出参数、返回值 /***** 函数名称: 函数功能介绍: 函数参数;函数返回值: 其他: *****/ int GStuNum,匈牙利命名规则;int g_stu_num,unix规范
调用多文件编译
gcc-o test test.c fun.c 两个源文件生成一个test文件 编写makefile文件:vim makefile,make编译。在makefile文件里,要有目标并写出依赖,命令前需加tab键。例如: main:test.o
fun.o
gcc-o main-test.o fun.o
test.o:test.c
gcc-c test.c
fun.o:fun.c
gcc-c fun.c
如图:
也可以用变量代替:开头CC=gcc(PC平台),CC=arm-linux-gcc(arm平台),则可写成:
$(CC)-o main test.o fun.o
$为使用变量值 clean:rm *.o-rf
rm main-rf ② 数据结构
C基本语法:1.变量2.语句3.分支4.循环5.函数6.存取7.类8.封装集成。C++的特性:封装,集成,多态
链表,最重要的是双向链表(单环),基本操作:添加、查找、删除。定义:typedef struct node{ datatype data;struct node *next;}LNode,*LinkList;指向本结点类型的指针是实现链表的基础,数据量大时用链表存储,少时用数组。指针最大值为2^32=4G,指针0~4G的一个数字。头指针为“NULL”则表示一个空表。内存分配函数有malloc和calloc.语句:算术语句,如i=i+1;i++;关系语句,i>2;逻辑语句,i<20&&i>10两个同时成立就成立,||(或)一个成立就成立; 分支:if else 计算闰年if(year%400==0||(year%4==0&&year%100!=0))循环:while(),do{}while();for(i=0;i<10;i++)i=0只在第一次时执行。r回车字符,%x指针地址
usleep();sleep(1);1秒跳一次fflush(stdout);题目(1.声明数组2.录入学生信息3.求最高分4.打印)代码:struct stu{int s;int num;char name[16];};
int main {struct stu stu_arry[10];} 3.7月4日 链表
链表的创建与遍历及查找、增加、删除结点各项操作,给出部分代码进行练习,对链表的操作进行熟悉。着重强调增加结点(尾插入)的操作,得到尾结点的代码如下:
for(p=h;p!=NULL;p=p->next){if(p->next==NULL)pp=p;} p=malloc(sizeof(struct node));p->num=num;strcpy(p->name,name);pp->next=p;p->next=NULL;return h;4.7月5日
① 熟悉链表的各项操作,老师给出代码,加强出错部分的练习。删除结点时的考虑,删除的是头结点和非头结点,代码如下:
struct node *link_del_node_by_num(struct node *h,int num){
struct node *p;
struct node *pp;
/*find node by num*/
for(pp=p=h;p!=NULL;pp=p,p=p->next)
{
if(p->num==num)
break;
}
/*del node is head node*/
if(p==h)
{
h=h->next;
free(p);
}
/*del node is not head node*/
else
{
pp->next=p->next;
free(p);
}
if(p==NULL)
return NULL;
return h;} ②哈希表
哈希表存储的基本思想以数据表中的每个记录的关键字k为自变量,通过一种函数H(k)计算出函数值。把这个值解释为一块连续存储空间(即数组空间)的单元地址(即下标),将该记录存储到这个单元中。
构造方法:1.直接定址法 H(k)=k+c 2.除留余数 H(k)=k%m 3.平方取中法 取关键字平方后的中间几位作为哈希函数的地址冲突解决方法:开放定址法 H(k)=(k*k+i)%m,Hi=(H(k)+d(i))%m,i=1,2,„„k(d为增量函数)编写代码,实现对哈希表的添加、查找操作。
5.7月6日
整理哈希表的操作代码,对各个部分进行完善,并编写出了删除结点的程序代码。在删除头结点的时候,程序运行结果总是出错,询问老师过后,经过老师的讲解,最后完成了代码。
6.7月7日
接口设计 词典的存储格式:文本文件,索引;查询方式:字符串匹配,二分查找 版本管理工具(git)找出版本之间的差异,回到以前的版本,原则:迭代开发(逐渐找出功能)、接口分离
$ ^ 所有的依赖文件,$< 只依赖于第一个文件,在linux终端下,查询手册用man命令。给出部分代码,查询手册以便理解。
7.7月8日
讲述部分函数的意义,memset直接设置内存,memset(trans,0,WORD_LEN);从trans开始,长度为多少,都设为0。Shift+* 移光标
#if 0„„#endif 此时这里的内容不需要编译;#if 1„„#endif 能打开
8.7月9日
①如何将windows中的文件传到虚拟机中?
控制面板—>网络连接—>Vmware Workstation启用,在终端输入命令ifconfig eth 0 找到地址192.168.8.131;然后虚拟机打开ftp命令 /etc/init.d/vsftpd start nestar-an|grep 20是查看ftp状况的,修改密码命令passwd student,解压缩文件tar xf dict.tar.bz2 ②文件的操作
FILE *pFile=fopen(filename,“rb”)fclose(pFile)关闭文件
fread(buffer,size,size_count,pFile)从文件可读取size*size_count到buffer中。在代码中实现退格键的操作。
9.7月10日
实现了退格键操作,并对代码进行完善。下午编写删除操作,结果失败。
10.7月11日
老师验收程序,进行演示。二.设计过程
1.题目
(1)建立一个哈希表,并实现添加、删除、查找的功能(2)设计一个英汉字典,要求实现退格输出功能
2.题目思路
⑴哈希表存储的基本思想以数据表中的每个记录的关键字k为自变量,通过一种函数H(k)计算出函数值。把这个值解释为一块连续存储空间(即数组空间)的单元地址(即下标),将该记录存储到这个单元中。需要用除留余数法构造。首先找到地址标号后,然后再根据链表的方式存储进去。能够实现可选择性的添加数据,然后显示出哈希表。可根据查找的数据,显示出位置,及根据数据删除时,出现的新哈希表。
⑵英汉词典需要在二进制文件里,建立一个字典库,然后再查找编写一系列功能函数。此程序用的是联想输入法,在非标准模式下实现。能够按首字母查询并且实现选择单词,出现意思的功能,并且能够实现退格输出。此时需要编写查找匹配单词的函数,及得到单词意思的函数。老师已经给出部分代码,再编写实现退格键的操作即可。
3.如何实现
⑴实现哈希表的流程图
利用除留余数,得到数据位置的代码 int hash_hash_fun(int data){
int pos;
pos=data%HASH_MAX;
return pos;} 在添加数据时,应给P开辟空间,之后找到所属位置,进行存储即可。部分主要代码如下:
/*malloc memory*/
p=(struct node*)malloc(sizeof(struct node));
/*input data*/
printf(“input add data:n”);
scanf(“%d”,&add_data);
getchar();
pos=hash_hash_fun(add_data);
p->num=add_data;
p->next=hash[pos];
hash[pos]=p;
在查找数据时,首先进入 hash_hash_fun函数,找到位置后,方可进行查找,此函数是整个程序的关键,输出结果为位置加上数据的形式。代码如下:
struct node *hash_find(struct node *hash[],int f_num){
int pos;
struct node *p;
printf(“input find f_num:n”);
scanf(“%d”,&f_num);
pos=hash_hash_fun(f_num);
for(p=hash[pos];p!=NULL;p=p->next)
{
if(p->num==f_num)
{
printf(“[%d] %dn”,pos,p->num);
break;
}
}
if(p==NULL)
printf(“no find.n”);
return p;}
在删除的时候,需要三方面的考虑,删除的是头结点,非头结点,及指针所指的为空,这样才能更准确的删除表中数据。代码如下:
struct node *hash_del(struct node *hash[],int num){
int pos;
struct node *h=NULL;
struct node *p;
struct node *pp;
printf(“input del num:n”);
scanf(“%d”,&num);
pos=hash_hash_fun(num);
for(pp=p=h=hash[pos];p!=NULL;pp=p,p=p->next)
{
if(p->num==num)
break;
}
printf(“[%d] %dn”,pos,p->num);
if(p==h)
{
hash[pos] = p->next;
free(p);
}
else
{
pp->next=p->next;
free(p);
}
if(p==NULL)
return NULL;} ⑵实现英汉词典退格功能 在实现查找功能时,需要进行输入数据的判断如果是字母的话,应怎样运行,如果是退格键时,是怎样,以及是数字时是怎样,这里需调用两个函数isalpha()判断字母和isdigit()判断数字。这里把字母的判断和退格键的判断写到了一块,代码如下:
if(isalpha(c)||(c=='177'))
{
trans[n] = c;
//back space
if(c == '177')
{
n--;
if(n < 0)n = 0;
trans[n] = ' ';
if(n > 0)printf(“nAfter you input backspace:%sn”, trans);
}
else n++;
//find and update match words.//m = find_match_words(trans, example_words, ARRAY_SIZE(example_words));
m = world_find(trans, items, VISUAL_CNT);
//display match words.if(m){ printf(“Words display:n”);display_match_words(items, m);}else{ n = 0;memset(trans, 0, sizeof(trans));}
根据词典位置词取这条单词
static int read_world_by_pos(int pos, char *buffer, int buf_len){ int i;int ch;fseek(s_file, s_world_count*sizeof(int)+4+pos, SEEK_SET);for(i = 0;i < buf_len;i++){
ch = fgetc(s_file);
if(EOF == ch)
{
buffer[i] = ' ';
return i;
}
if('/' == ch)
{
buffer[i] = ' ';
return i;
}
buffer[i] = ch;}
return 0;} 对文件进行二分查找
int world_find(const char *a_world, DictItem *items, int max_world_count){ /*二分查找*/ char input[MAX_WORLD_LEN+1];char buf_world[MAX_WORLD_LEN+1];int begin = 0;int end = s_world_count-1;int mid;int compare;
strcpy(input, a_world);to_lower(input);while(begin <= end){
mid =(end+begin)/2;
read_world_by_pos(s_wordindex[mid], buf_world, sizeof(buf_world));
to_lower(buf_world);
compare = strcmp(input, buf_world);
if(compare < 0)
{
end = midcur)
max_world_count = s_world_count48;if(k >=0 && k < m){
} else{ } printf(“nchoose errorn”);//display the translation world_get_content(items[k].world_pos, buffer, sizeof(buffer));printf(“%s:n%sn”, items[k].world, buffer);n = 0;memset(trans, 0, sizeof(trans));memset(items, 0, sizeof(items));break;
}
} } // C-d exit if(c == ' 04')break;int main(int argc, char **argv){
} if(dict_init(“./dict.bin”)< 0)return-1;translate();dict_release();return 0;