子弹初速度测试系统设计55_第1页
子弹初速度测试系统设计55_第2页
子弹初速度测试系统设计55_第3页
子弹初速度测试系统设计55_第4页
子弹初速度测试系统设计55_第5页
已阅读5页,还剩29页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

PAGEPAGE33目录1实习目的及意义 12实习任务及要求 13实习时间及地点 14实习情况及完成情况 24.1硬件电路的设计 24.1.1数据采集电路 34.1.2单片机处理电路 34.1.3数码管显示电路 74.2硬件电路板调试 74.3软件设计 84.3.1程序流程图 84.3.2主程序 84.3.3软件调试 205实习产品的功能及指标参数 206总结与体会 217谢辞 218参考文献 22附录:电路总图 231实习目的及意义毕业实习是本科学生毕业前的一个重要的实践教学环节,是成长为一名高级专门技术人才所得到专门实践训练的重要手段。通过毕业实习可以使我们能较深入地了解本专业的生产技术、生产过程和管理知识,进一步加深对所学专业理论知识的理解,进一步熟悉实际电子产品研发的方法与过程,培养学生分析问题、解决问题的能力以及工程实际能力,为实际工作打下良好基础。①学习体会电子产品企业规范化、专业化、标准化、规模化的电子产品设计、开发流程、典型开发团队中人员角色设置;②学习体会典型电子产品项目开发团队的角色构成及团队角色协同工作技巧;③学习典型的电子产品开发技术;④学习体验课堂理论知识在实际工程项目中的应用,积累项目实战经验;⑤感受电子产品研发对学生知识结构、技术技能、综合素质的要求;⑥加速由学生向员工的身份转变,增强同学的就业能力和信心。2实习任务及要求本次实习我们所做的课题为红外的遥控、显示控制系统。本次实习要求我们自己学会从PROTEL图绘制到PCB图的布局连线以及用KEILC来编写和调试程序,以实现子弹初速度的测试,并能够在LED显示屏上显示出相应的数字。本次实习要求我们自己能够自己画原理图和PCB图,通过对程序的调试最终能够实现测试和显示功能。本次实习在这基础上还实现了单片机与计算机的串口通信。3实习时间及地点4实习情况及完成情况如图4.1所示为这次子弹初速度测试系统设计的整体设计框图。启动系统(系统初始化)启动系统(系统初始化)检测初始点(定时器计时)检测终止点(停止计时)数据处理结果输出并显示图4.1整体方案图4.1硬件电路的设计本次实习的内容包括3部分:电路的设计(数据采集电路、单片机处理电路、显示电路),电路板调试,软件的设计和调试。本次实习的系统结构图如下所示:红外红外发射器A红外接收器A红外发射器B红外接收器B单片机模块LCD显示模块子弹入口测速腔图4.2系统结构设计4.1.1数据采集电路如图4.3,红外传感器在正常工作(无遮挡)时,可通过图示电路在射集输出1.6V的电压;若采用运放放大三倍则电路过于繁琐,且运放的电压电源不易满足,所以我采用三极管开关电源电路,如图4.4所示;红外传感器的输出加在三极管的基极上,通过控制三极管的基极的电压来控制三极管开关电源电路的输出,红外传感器无遮挡时,红外传感器的输出电压Vout1为1.6V,三极管开关电源电路的输出Vout2为5V,当Vout1为0V时,Vout2也为0V,这样就通过简单的电路实现了高低电平的标准采集,为下一步单片机模块打下基础。图4.3数据采集电路图图4.4信号整形电路图4.1.2单片机处理电路如图4.5所示,所示为单片机STC89C52,负责信号的处理及将结果输出至LED数码显示管显示。图4.5ATC89C52AT89C51是一种高性能低功耗的采用CMOS工艺制造的8位微控制器,它提供下列标准特征:4K字节的程序存储器,128字节的RAM,32条I/O线,2个16位定时器/计数器,一个5中断源两个优先级的中断结构,一个双工的串行口,片上震荡器和时钟电路。如图引脚说明:·VCC:电源电压·GND:地·P0口:P0口是一组8位漏极开路型双向I/O口,作为输出口用时,每个引脚能驱动8个TTL逻辑门电路。当对0端口写入1时,可以作为高阻抗输入端使用。当P0口访问外部程序存储器或数据存储器时,它还可设定成地址数据总线复用的形式。在这种模式下,P0口具有内部上拉电阻。在EPROM编程时,P0口接收指令字节,同时输出指令字节在程序校验时。程序校验时需要外接上拉电阻。·P1口:P1口是一带有内部上拉电阻的8位双向I/O口。P1口的输出缓冲能接受或输出4个TTL逻辑门电路。当对P1口写1时,它们被内部的上拉电阻拉升为高电平,此时可以作为输入端使用。当作为输入端使用时,P1口因为内部存在上拉电阻,所以当外部被拉低时会输出一个低电流(IIL)。·P2口:P2是一带有内部上拉电阻的8位双向的I/O端口。P2口的输出缓冲能驱动4个TTL逻辑门电路。当向P2口写1时,通过内部上拉电阻把端口拉到高电平,此时可以用作输入口。作为输入口,因为内部存在上拉电阻,某个引脚被外部信号拉低时会输出电流(IIL)。P2口在访问外部程序存储器或16位地址的外部数据存储器(例如MOVX@DPTR)时,P2口送出高8位地址数据。在这种情况下,P2口使用强大的内部上拉电阻功能当输出1时。当利用8位地址线访问外部数据存储器时(例MOVX@R1),P2口输出特殊功能寄存器的内容。当EPROM编程或校验时,P2口同时接收高8位地址和一些控制信号。·P3口:P3是一带有内部上拉电阻的8位双向的I/O端口。P3口的输出缓冲能驱动4个TTL逻辑门电路。当向P3口写1时,通过内部上拉电阻把端口拉到高电平,此时可以用作输入口。作为输入口,因为内部存在上拉电阻,某个引脚被外部信号拉低时会输出电流(IIL)。P3口同时具有AT89C51的多种特殊功能,具体如下表所示:P3口引脚引脚第二功能描述P3.0RXD串行口输入端P3.1TXD串行口输出端P3.2外部中断0请求输入端P3.3外部中断1请求输入端P3.4T0定时器/计数器0计数脉冲输入端P3.5T1定时器/计数器1计数脉冲输入端P3.6片外数据存储器写选通信号输出端P3.7片外数据存储器读选通信号输出端·RST(复位输入):当振荡器工作时,RST引脚出现两个机器周期的高电平将使单片机复位。·ALE/:当访问外部存储器时,地址锁存允许是一输出脉冲,用以锁存地址的低8位字节。当在Flash编程时还可以作为编程脉冲输出。一般情况下,ALE是以晶振频率的1/6输出,可以用作外部时钟或定时目的。但也要注意,每当访问外部数据存储器时将跳过一个ALE脉冲;程序存储允许时外部程序存储器的读选通信号。当AT89C52执行外部程序存储器的指令时,每个机器周期两次有效,除了当访问外部数据存储器时,将跳过两个信号。·/VPP:外部访问允许。为了使单片机能够有效的传送外部数据存储器从0000H到FFFH单元的指令,必须同GND相连接。需要主要的是,如果加密位1被编程,复位时EA端会自动内部锁存。当执行内部编程指令时,应该接到VCC端。·XTAL1:振荡器反相放大器以及内部时钟电路的输入端。·XTAL2:振荡器反相放大器的输出端。两个红外检测装置在子弹摄入后因被遮挡,先后输出一个负脉冲,将这两个脉冲作为单片机的两个中断源INT0和INT1,来控制单片机内部时钟的计时开始与终止,再结合两个红外检测装置间的距离即可由程序预算出子弹的初速度,并在LED上予以显示。如图4.6为单片机与光电电路的连接原理图。图4.6单片机与光电电路的连接原理图4.1.3数码管显示电路数码管主要用来显示测量的速度值,由于采用地址的方式,所以在软件设计中可以直接对地址操作。数码管显示电路如下图:图4.7数码管显示电路电路中LED_D0-LED_D7为数码管的数据传输线,而LED_SEG0--LED_SEG7为数码管的片选信号。通过对系统的分析可知,数码管的数据操作地址为0X9800,数码管的片选操作地址0X9A00。4.2硬件电路板调试硬件调试是一步比较重要的过程,如果硬件都没正确,那即使软件正确了最后的调试也是调不成功的。所以在硬件调试这步中我们应该认真的对待,要做到细心耐心。硬件调试中第一步对是元器件的焊接,元器件的焊接比较重要,对于元器件焊接要做从矮到高,从小到大,由于本次设计用到了贴片元件,所以在焊的时候应该先焊。在焊接过程中也应该注意到有的元器件正负极之分,在焊接的过程中不能焊错了。第二步是在电路焊接完成之后对电路的检测,在电路焊完后我们可以先上电,上电之后在用万用表对电路进行检测电路是否已通,若不通检察下电路中有无虚焊或者有无元器件焊错,若通了就可以给单片机烧写事先写好的示例程序已检测电路能否正常工作,若能正常工作,表示硬件部分已经调试成功了。4.3软件设计据本次实习要求,不但要进行硬件的设计,还得进行软件的设计,才能做出符合要求的产品来。下面将针对软件的设计作具体分析。4.3.1程序流程图根据设计的原理,程序流程图如下图4.2所示,开始时程序初始化定时器1、定时器0,利用中断停止计数,得到子弹出膛时间。开始开始所有器件的初始化外中断显示速度值速度的计算图4.7程序流程图4.3.2主程序1、定义头文件type.h#ifndef_TYPE_H#define_TYPE_Htypedefunsignedchar UCHAR;typedefunsignedint UINT;typedefunsignedlong ULONG;typedefunsignedlong LONG;typedefunsignedchar BOOL;//Constants#defineTRUE 1#defineON 1#defineOK1#defineFALSE 0#defineOFF 0#defineMATCH 0#defineRET 0x0D#defineLF 0x0A#defineSPACE 0x20#endif2、定义头文件uart.hvoidInitUART(void);3、初始化程序int.C#include<REG52.h>#include"int.h"#include"type.h"#include"timer.h"voidInitInt(void){EA=TRUE; EX0=TRUE; EX1=TRUE; IT0=TRUE; IT1=TRUE;}/*******************************************************/voidInt0(void)interrupt0{EX0=FALSE;TR1=TRUE;count1=0;flag=0;P1=~P1;EX0=TRUE;}/*******************************************************/voidInt1(void)interrupt2{EX1=FALSE;TR1=FALSE;P1=~P1;flag=1;TH1=TIMER1_H;TH1=TIMER1_L;EX1=TRUE;}4、主函数main.C#include<REG52.h>#include"lednum.h"#include"timer.h"#include"int.h"#include"type.h"#include"sysio.h"voidInitDevice(void);voidCalculate(void);voidDelay(void);voidDisplay(void);codeUCHARMyTable[]={0X76,0X79,0X38,0X38,0X3F};UINTcount1=0,count2=0;BOOLflag=0;UINTT1L=0,T1H=0;intmain(void){InitDevice();P1=0xAA;Display();InitLEDNumber();while(TRUE){Calculate();}return0;}/***************************************************/voidInitDevice(void){InitInt(); InitTimer();}/**************************************************/voidCalculate(void){UINTu; floatt,u1; if(flag==1) { count2=count1; T1L=TL1;T1H=TH1; if(count2<=0) { t=(float)((T1L+T1H)*0.000001); u=(unsignedint)((1/t)*0.1); LED_ShowWordDEC(4,u); } else { t=(float)(((60.0*count2)*0.001)+((T1L+T1H)*0.000001)); u1=(float)((1.0/t)*0.1); //u=(unsignedint)(u1); LED_ShowDotDEC(3,u1); } } else { LED_ShowByteHEX(4,0); LED_ShowByteHEX(6,0); LED_ShowByteDEC(0,(UCHAR)count1); }}/***********************************************/voidDelay(void){UINTi,j;for(i=0;i<1000;i++)for(j=0;j<255;j++);}/************************************************/voidDisplay(void){UCHARi; for(i=0;i<5;i++) { SetLED(i,MyTable[i]); }Delay();}/*************************************************/5、定时器函数timer.C#include<REG52.h>#include"type.h"#include"lednum.h"#include"timer.h"voidInitTimer(void){ TMOD&=0X00; TMOD|=0X11; TR0=TRUE; ET0=TRUE; TR1=FALSE; ET1=TRUE;}voidTimer0(void)interrupt1//using1{ staticidx; TL0=TIMER0_L; TH0=TIMER0_H; idx++; if(idx==MAX_LEDNUM)idx=0;// KeyScaner(idx); LEDNumberScaner(idx);}voidTimer1(void)interrupt3{ TL1=TIMER1_L; TH1=TIMER1_H; count1++; //T1L=TL1; //T1H=TH1;} 6、LED显示函数#include<REG52.h>#include"type.h"#include"sysio.h"#include"lednum.h"UCHARvbuffer[MAX_LEDNUM];unsignedcharcodeidxTable[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};unsignedcharcodeledTable[]={ //01234567890X3F,0X06,0X5B,0X4F,0X66,0X6D,0X7D,0X07,0X7F,0X6F, //A B CD EFSSS NES O 0X77,0X7C,0X39,0X5E,0X79,0X71,0X49,0x40,0X5D};unsignedcharcodeledDotTable[]={ //01234567890XBF,0X86,0XDB,0XCF,0XE6,0XED,0XFD,0X87,0XFF,0XEF, };/*** 初始化LED数码管显示 输入参数:无 输出参数:无*/voidInitLEDNumber(void){ UINTi; for(i=0;i<MAX_LEDNUM;i++) { vbuffer[i]=LED_BLANK; }}/*** 在LED数码管上的设定位置,按十六进制显示一个字节数据 输入参数:idx显示位置 d显示的数据 返回参数:无*/voidLED_ShowByteHEX(UCHARidx,UCHARd){ UCHARt; t=d>>4; t=ledTable[t]; SetLED(idx,t); t=d&0x0f; t=ledTable[t]; SetLED(idx+1,t);}/*** 在LED数码管上的设定位置,按十进制显示一个字节数据 输入参数:idx显示位置 d显示的数据 返回参数:无*/voidLED_ShowByteDEC(UCHARidx,UCHARd){ UCHARt; t=d%10; t=ledTable[t]; SetLED(idx+2,t); d/=10; if(d) { t=d%10; t=ledTable[t]; } else { t=LED_BLANK; } SetLED(idx+1,t); d/=10; if(d) { t=d%10; t=ledTable[t]; } else { t=LED_BLANK; } SetLED(idx,t);}/*** 直接设置LED的段码 输入参数:idx所要设置的位置, seg段码 返回参数: 无*/voidSetLED(UCHARidx,UCHARseg){ if(idx>=MAX_LEDNUM)return; vbuffer[idx]=seg;}/*** LED扫描程序 输入参数:idx显示位置索引 输出参数:无*/voidLEDNumberScaner(UCHARidx){ EX_LED_DATA=LED_BLANK;//关闭显示,避免出现残影 EX_LED_SEG=idxTable[idx];//设置要显示的位 EX_LED_DATA=vbuffer[idx];//设置显示的段}/********************************************************/voidLED_ShowWordDEC(UCHARidx,UINTd){ UCHARt; t=d%10; t=ledTable[t]; SetLED(idx+3,t); d/=10; if(d) { t=d%10; t=ledTable[t]; } else { t=LED_BLANK; } SetLED(idx+2,t); d/=10; if(d) { t=d%10; t=ledTable[t]; } else { t=LED_BLANK; } SetLED(idx+1,t); d/=10; if(d) { t=d%10; t=ledTable[t]; } else { t=LED_BLANK; } SetLED(idx,t);}/************************************************/voidLED_ShowDotDEC(unsignedcharidx,floatd1){ UCHARt; UINTd; d=d1*100; t=d%10; t=ledTable[t]; SetLED(idx+4,t); d/=10;t=d%10; t=ledTable[t];SetLED(idx+3,t); d/=10; t=d%10; t=ledDotTable[t];SetLED(idx+2,t); d/=10; if(d) { t=d%10; t=ledTable[t]; } else { t=LED_BLANK; } SetLED(idx+1,t); d/=10; if(d) { t=d%10; t=ledTable[t]; } else { t=LED_BLANK; } SetLED(idx,t);}4.3.3软件调试软件调试为期七天过程,在软件调试过程中,我们组遇到许多实际问题。软件部分我们是在老师的指导下完成的。为了实现检测子弹出膛时初速度测量的方法及实现过程,并且把实时检测的结果在数码管上显示出来,可以测试N组的数据,每次测完以后最终的结果不消失,直到显示下次速度结果,这些都需要对程序进行不断的测试和调整。5实习产品的功能及指标参数本次实习所做的是子弹初速度测试系统。主要实现的功能就是,用双红外发射接收装置对子弹经过不同位置的时间进行取样,然后通过特殊电路将采样信号变为标准脉冲信号输入单片机,通过单片机内部的两个定时器,通过编程计算出子弹通过这两个红外发射接收装置的时间间隔,然后再结合子弹飞行的距离计算出子弹的初速度,最后将结果输出至LED显示器显示。由于子弹的速度的范围很大,对于小到几十米每秒的气枪子弹到每秒几百米的子弹。我们采用了折中的方法来处理中间速度,在定时器中每20ms中断一次,同时记下次数。在打开中断的同时开定时器。最终得到子弹的时间,路程采用的为定植1米。由于子弹的初速度很大而且变速,所以在相对的一段时间内我们认为是匀速的,根据公司得到最终的初速度值。6总结与体会这次毕业实习我们组做的是子弹初速度测试系统。这次实习从原理图来PCB图到硬质板的焊接,以及程序的编写调试都是由我们小组三个同学共同努力下完成的。首先在硬件方面我们画了几天的图,从中我们也学到了很多一起课本所学不到的东西的。也加强自己的动手能力。在画PCB方面由于我们第一操作,所以在布局画线等多方面都有很大的不足,多亏在老师和同学的帮忙下,才能勉强完成。在硬件的调试焊接方面,体会最深的就是焊接,焊接要求我们要做到从小到大,从矮到高,而且在焊接过程中一定要做的细心,不能焊错了极性。软件方面主要体现在程序的编写上,我们组在老师的要求基础上,还试着编写了一些小程序,也基本能够调试的出来。毕业实习是一个综合性比较强的实践活动,通过此次毕业实习我学到了新的知识,也让自己所学的理论知识与实践动手结合起来了。并且在实际操作过

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论