《数字集成电路测试仪.doc》由会员分享,可在线阅读,更多相关《数字集成电路测试仪.doc(19页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、精选优质文档-倾情为你奉上数字集成电路测试仪参赛组别 08 小组成员 王 海(电信081) 陈辰灿(电信082) 贺星辰(电信082)2011年6月5日 目录摘要:在当今社会中,电子技术发展迅速,数字集成电路的应用广泛,而74系列逻辑芯片在数字电路中又有着非常广泛的应用,因而数字电路设计中必须要求所用的数字电路芯片逻辑功能完整,但在数字电路芯片测试中又有很多不便,实际测试较繁琐。针对上述需要,我们针对常用的74系列逻辑芯片设计了一种数字电路芯片测试仪,用来检测常用74系列芯片的型号和逻辑功能的好坏,从而给数字电路的设计、制作带来方便。 关键词:74系列逻辑芯片 AT89C52 自动识别型号一、
2、任务设计一套数字集成电路测试装置,能够实现对指定几种14脚常见的74系列数字电路测试。芯片有74LS00、74LS04、74LS20、74LS74、74LS86、74LS92。基本要求:1.设计数字集成电路测试仪器硬件:包含自制电源、MCU控制电路、键盘、显示器等。2.能够对指定的74系列门电路芯片进行功能测试(完好/损坏)。74LS00、74LS04、74LS20、74LS86。发挥部分:1.能够自动识别指定的几种74系列门电路的型号:74LS00、74LS04、74LS20、74LS86。2.能够自动识别指定的74系列触发器、计数器电路的型号。74LS86、74LS92。二、方案设计与论证
3、比较2.1显示模块显示模块主要实现对芯片检测结果的显示,包括芯片型号及芯片功能是否完好,同时也要给用户提供必要的提示信息,提高系统界面的友好性。 2.1.1方案一 采用数码管显示由于所有芯片均为74系列,因而只显示最后两位编号即可实现对芯片型号的显示,但由于数码管显示效果较差并且动态扫描时会占用很多CPU时间,因而舍弃该方案。 2.1.2 方案二 采用点阵显示采用有二极管构成的1616点阵,通过主控单元的控制可以实现汉字及英文字符的显示,可以显示芯片型号以及芯片功能完整性,采用点阵显示的优点是显示内容可以随意控制,显示内容丰富。但点阵显示也存在占用I/O口较多并且会占用大量CPU时间的缺点,另
4、外,在使用点阵显示是还要存储大量的字模信息,而由于本系统需要扫描大量的逻辑芯片,为节约成本又未扩展程序存储区,因而考虑到所用主控单元I/O口资源有限和对程序存储区容量的限制,舍弃该方案。 2.1.3 方案三采用1602模块显示1602液晶为字符型液晶,可以显示162共32个字符,不仅可以显示芯片型号及判断结果,并且还可以在程序运行过程中为用户提供必要的提示信息,提高了系统的交互性,并且1602液晶占用CPU时间较少,虽然显示能力较弱,仅能显示英文字符,但基本能满足设计的要求,因而本设计采用1602液晶作为显示输出设备。 2.2输入模块采用独立按键的优点是控制程序和硬件电路都很简单,缺点是如果每
5、个按键都要占用一个I/O口,当按键较多时占用I/O口较多。但考虑到本次设计只需要三个按键:完好/损坏键、确认键、自动识别键。因此在实际的测试中分别对应P3.0P3.1P3.2通过按键查询就可以简单的起到控制输入的目的。2.3电源模块本设计电路模拟部分较少,电源主要用于驱动单片机、液晶以及待检测的74逻辑芯片,由于都是数字电路,对于电源的要求较低,故采用比较简单的基于LM7805芯片的电源,电源的输出为5V刚好满足电路各部分的供电要求。2.4继电器模块由于74LS92芯片的引脚中5脚为电源,10脚为地,而74LS00、74LS04、74LS20、74LS74、74LS86芯片的引脚都是14脚为电
6、源,7脚为地。因此在实际的测试过程中,我们需要对电源实现正确的切换,设计思路是:默认芯片测试引脚中是14脚为电源,7脚为地,用户按下自动识别的按键后,程序依次扫描前五个,扫到一个后就退出扫描程序后返回扫描结果,如果没扫到单片机通过P3.6脚控制继电器实现换挡后,使芯片测试引脚中5脚为电源,10脚为地。再继续执行扫描任务确定这特殊的74LS86。由于是实现5V控制,我们选择ATQ209双刀开关。三、芯片检测的基本原理对于逻辑芯片的检测,我们主要实现检测芯片逻辑功能好坏亦或是确定芯片的型号,由于主控单元采用STC89c52单片机,其I/O与TTL电平完全兼容,因而直接由单片机对芯片插座的引脚进行扫
7、描,由于是固定的14脚芯片,为了编程方便,使芯片测试引脚17分别为P1.0P1.6,引脚148分别为P2.0P2.6。实现了通过单片机输出端口模拟芯片的各种输入状态,并通过单片机读回芯片的输出结果,通过与芯片真值表的比较即可判断芯片逻辑功能的好坏的目的。在进行芯片扫描时,必须先将芯片的输出引脚I/O置为高电平,然后对芯片的输入引脚进行各种状态的扫描,通过单片机读回芯片的输出,再依据芯片的真值表对其输出进相比较,不一致则说明芯片的逻辑功能发生错误,断定芯片为坏的,若芯片的输出与真值表完全相符,则说明芯片的逻辑功能正确,可以判断为好芯片。 然后再依据所检测的结果,通过单片机对芯片的逻辑功能加以详细
8、测试,并对结果加以显示。在自动识别的时候,为了提高准确度,我们编写了程序,采用对同一端口两次输入再两次读回其状态的比较方法,来对芯片好坏进行准确测试,继而返回正确的芯片型号。四、系统的整体设计系统流程图五、系统功能测试及结果5.1测试方法对每一种芯片我们设计了唯一的输入状态并读回P1P2口的数据与真值表比较,如果有查到一个表符合要求就记录返回值后显示。在测试的整个过程中,实现了对芯片完好/损坏功能的测试,用户按完好/损坏键并按确认键后可以看到测试显示结果为“OK,GOOD CHIP!”或者“SORRY,BAD CHIP!”。当然如果用户不知道芯片是何种型号,就可以按自动识别键自动识别上述74系
9、列门电路的型号,T返回结果为“This is:74.”。用户操作的过程和显示的结果实时动态显示在液晶显示器中,以告知用户测试结果。5.2测试结果对于74LS00/04/20/86芯片进行实物测试,可以自动识别芯片型号及其好坏情况,测试结果满足要求。对74LS74/92芯片进行实物测试,可以自动识别其芯片型号。通过模拟芯片错误,均可完成正确测试。六、设计过程总结与体会通过这次电子设计竞赛,我们小组成员齐心协力,自己动手设计制作完成了一个数字集成电路测试仪。这期间我们虽然也遇到了不少的困惑,但通过老师的指导和自己的思考,这些问题一一得到解决,这次竞赛中学到了很多解决实际问题的方法,而且动手能力又得
10、到了很大的提升。对于这个设计来说,我们总结了以下几点经验和教训。第一,电路板的总体布局十分重要。一个好的线路布局不仅会使电路板外观整齐,而且在之后的电路调试和线路错误检查中亦能有一个清晰的思路,可以提高工作效率;第二,C程序的调试工作在本次设计作品中非常重要。因为本次C代码较长,所以整个程序的前后统筹调试中要很细心,乃至一个很小的标量也要重视。在完成了该电子设计后,我们觉得这个设计还有可以改进和完善之处。比如,可以通过修改代码,使得在按下某按键后可以自动检测所有芯片的型号以及其好坏情况。而且,可以加入LED指示灯或者蜂鸣器,来更加直观地显示或提醒电路工作状况和芯片检测结果。参考文献1康华光.电
11、子技术基础模拟部分(第五版).北京:高等教育出版社,20062阎石.数字电子技术基础(第三版). 北京:高等教育出版社,19893 宁武,唐晓宇,闫晓金.全国大学生电子设计竞赛基本技能指导,2009附件一 系统电路图:附件二 实物照片:附件三:/*-数字集成电路芯片测试仪C程序-清单-*/程序组:陈辰灿 王海 贺星辰/修改时间:2011.06.05-#include#include #include /这是头文件必须包含/*=宏定义=*/#define LCD_data P0/数据口#define M 4/要测试的芯片好坏的个数#define N 8#define input1 P1/用于检测
12、的引脚#define input2 P2/*=液晶宏定义、初始化引脚=*/void delay(unsigned int z);*延时函数*/void charfill(unsigned char c); /整屏显示A代表的ASCII字符子程序void putstrxy(unsigned char cx,unsigned char cy,unsigned char code *s);/在(cx,cy)字符位置写字符串子程序void putstr(unsigned char code *s); /定位写字符串子程序void putchars(unsigned char c); /在(CXPOS,
13、CYPOS)字符位置写字符子程序unsigned char getchars(void); /CXPOS,CYPOS)字符位置读字符子程序void charlcdpos(void); /设置(CXPOS,CYPOS)字符位置的DDRAM地址void charcursornext(void); /置字符位置为下一个有效位置子程序void lcdreset(void); /SMC1602系列液晶显示控制器初始化子程序void delay3ms(void); /延时3MS子程序void lcdwc(unsigned char c); /送控制字到液晶显示控制器子程序void lcdwd(unsign
14、ed char d); /送控制字到液晶显示控制器子程序unsigned char lcdrd(void); /读数据子程序void lcdwaitidle(void); /忙检测子程序unsigned char data CXPOS; /列方向地址指针(用于CHARLCDPOS子程序)unsigned char data CYPOS; /行方向地址指针(用于CHARLCDPOS子程序)sbit RSPIN = P35; /RS对应单片机引脚sbit RWPIN = P34; /RW对应单片机引脚sbit EPIN = P33; /E对应单片机引脚/*=宏定义=*/unsigned char
15、detect(); /自动检测引脚/*=定义按键=*/sbit key1=P30; / 选择检测芯片sbit key2=P31; / 确定选择的芯片sbit key3=P32; / 自动检测sbit key4=P36; / 继电器的切换unsigned char *name=7400,7404,7420,7486,7474,7492,ERROR;/*=按键的标志位=*/unsigned char flag=0;/要选择的芯片型号在已定义字符数组中的序号unsigned char flag1=0;unsigned char flag2=0;/用来标示某芯片各通道检测均完好的标志位unsigned
16、 char k=0; /返回自动检测后芯片序号在已定义的数组中的序号unsigned char code LS0044= 0x3f,0x3f,0x1b,0x1b,/74ls00 0x24,0x24,0x24,0x24, 0x36,0x36,0x36,0x36, 0x2d,0x2d,0x2d,0x2d, ;unsigned char code LS0424= 0x2a,0x2a,0x2a,0x2a,/74ls04 0x3f,0x3f,0x15,0x15, ;unsigned char code LS20164= 0x24,0x24,0x24,0x24,/74ls20 0x25,0x25,0x25
17、,0x25, 0x26,0x26,0x26,0x26, 0x27,0x27,0x27,0x27, 0x2c,0x2c,0x2c,0x2c, 0x2d,0x2d,0x2d,0x2d, 0x2e,0x2e,0x2e,0x2e, 0x2f,0x2f,0x2f,0x2f, 0x34,0x34,0x34,0x34, 0x35,0x35,0x35,0x35, 0x36,0x36,0x36,0x36, 0x37,0x37,0x37,0x37, 0x3c,0x3c,0x3c,0x3c, 0x3d,0x3d,0x3d,0x3d, 0x3e,0x3e,0x3e,0x3e, 0x3f,0x3f,0x1f,0x1f,
18、 ;unsigned char code LS8644= 0x24,0x24,0x00,0x00,/74ls86 0x36,0x36,0x36,0x36, 0x2d,0x2d,0x2d,0x2d, 0x3f,0x3f,0x1b,0x1b, ;unsigned char code ICMN= 0x24,0x24,0x24,0x24,0x3f,0x3f,0x1b,0x1b, /74000x3f,0x3f,0x15,0x15,0x3f,0x3f,0x15,0x15, /7404 0x3f,0x3f,0x1f,0x1f,0x3f,0x3f,0x1f,0x1f, /7420 0x3f,0x3f,0x1b
19、,0x1b,0x3f,0x3f,0x1b,0x1b, /7486 ;void main() unsigned char i,output1,output2; lcdreset(); /液晶显示控制器初始化 putstrxy(0,0,PLEASE CHOOSE 74LS CHIP); /显示欢迎界面 while(1) if(key1=0) delay(100); if(key1=0) if(flag=4) flag=0; flag+; switch(flag) case 1:charfill( ); putstrxy(0,0,NOW 7400);break; case 2:charfill( )
20、; putstrxy(0,0,NOW 7404);break; case 3:charfill( ); putstrxy(0,0,NOW 7420);break; case 4:charfill( ); putstrxy(0,0,NOW 7486); if(flag=1&key2=0) for(i=0;i4;i+) input1=LS00i0; input2=LS00i1; delay(5); output1=input1&0x3f; output2=input2&0x3f; if(output1!=LS00i2|output2!=LS00i3) putstrxy(0,1,SORRY,BAD
21、CHIP!); flag2=0; break; if(output1=LS00i2&output2=LS00i3) flag2+; if(flag2=4) putstrxy(0,1,OK,GOOD CHIP!); flag2=0; if(flag=2&key2=0) for(i=0;i2;i+) input1=LS04i0; input2=LS04i1; delay(5); output1=input1&0x3f; output2=input2&0x3f; if(output1!=LS04i2|output2!=LS04i3) putstrxy(0,1,SORRY,BAD CHIP!); fl
22、ag2=0; break; if(output1=LS04i2&output2=LS04i3) flag2+; if(flag2=2) putstrxy(0,1,OK,GOOD CHIP!); flag2=0; if(flag=3&key2=0) for(i=0;i16;i+) input1=LS20i0; input2=LS20i1; delay(5); output1=input1&0x3f; output2=input2&0x3f; if(output1!=LS20i2|output2!=LS20i3) putstrxy(0,1,SORRY,BAD CHIP!); flag2=0; br
23、eak; if(output1=LS20i2&output2=LS20i3) flag2+; if(flag2=16) putstrxy(0,1,OK,GOOD CHIP!); flag2=0; if(flag=4&key2=0) for(i=0;i0;x-)for(y=110;y0;y-);/*=14脚芯片识别函数=*/unsigned char detect() /14脚芯片识别函数 unsigned char i,output1,output2;/7474的检测 P1=0xff; /初始化测试端口 P2=0xff; input1=0x3b; input2=0x39; delay(5);
24、input1=0x3f; /上升沿 input2=0x3d; delay(5); output1=input1&0x3f; output2=input2&0x3f; if(output1=0x1f&output2=0x2d) return (4); /7400/04/20/86的自动检测 P1=0xff; /初始化测试端口 P2=0xff; for(i=0;iM;i+) input1=ICi0; input2=ICi1; delay(5); output1=input1&0x3f; /将芯片逻辑结果input1通过&0x3f取出 output2=input2&0x3f; if(output1=
25、ICi2&output2=ICi3) input1=ICi4; input2=ICi5; delay(5); output1=input1&0x3f; output2=input2&0x3f; if(output1=ICi6&output2=ICi7) return i; key4=0;/检测7492时,先用继电器江电源供电引脚切换 P1=0xff; /初始化测试端口 P2=0xff; input1=0x3f; /7492的检测 input2=0x3f; delay(5); output1=input1&0x3f; output2=input2&0x3f; if(output1=0x3f&ou
26、tput2=0x01) delay(100);key4=1;return (5); delay(100); key4=1;/测试结束,将电源供电引脚切换回原状态 return (6);/-void charfill(unsigned char c) /整屏显示A代表的ASCII字符子程序 for(CXPOS=CYPOS=0;1;) putchars(c); /定位写字符 charcursornext(); /置字符位置为下一个有效位置 if(CXPOS=0) & (CYPOS=0) break; /子程序名称:void putstrxy(unsigned char cx,unsigned char cy,unsigned char *s)./功能:在(cx,cy)字符位置写字符串./-void putstrxy(unsigned char cx,unsigned char cy,unsigned char code *s) /在(cx,cy)字符位置写字符串子程序 CXPOS=cx; /置当前X位置为cx CYPOS=cy; /置当前Y位置为cy for(;*s!=0;s+) /为零表示字符串结束,退出 putchars(*s); /写1个字符 charcursornext(); /字符位置移到下一个 /-