基于单片机的TTL集成电路芯片测试仪的设计

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

摘要
集成电路(IC)测试是伴随着电子技术的发展而来的,数字集成芯片在使用过程中容易被损坏,用肉眼不易观察。

早期的人工测试方法对一些集成度高,逻辑复杂的数字集成电路显得难于入手,因而逐渐被自动测试所取代,因此很需要设计一种能够方便测试常用芯片好坏的仪器。

本系统以单片机AT89C52为核心,由芯片测试插座、独立按键、74HC573驱动8位数码管显示、5V直流电源控制模块等组成。

根据数字集成芯片的引脚特性以及集成芯片的真值表编写测试程序。

该系统能完成14脚以内常用TTL74、54系列数字集成芯片的功能测试。

关键字:测试仪;数字集成电路;单片机
ABSTRACT
Integrated circuit (IC) test is accompanied with the development of electronic technology, Digital integrated chip is easily damaged during use, and difficult to observe with the naked eye. Early manual test methods for some high integration, the logic of complex digital integrated circuits become difficult,thus gradually replaced by automated testing, so it is necessary to design a testing instrument to distinguish the Common chips is good or bad conveniently.
The system is with AT89C52 microcontroller at the core, including the chip test socket,the independent button,74HC573drives an 8-bit digital display, 5V DC power supply control module and other components,etc. According to the characteristics of digital IC pins and the truth table write integrated chip test program. The system can be completed within 14feet common TTL74, 54 series digital integrated chip functional test.
1 2
3
目录
系统总体方案 (1)
系统硬件电路设计 (2)
2.1 硬件系统电路原理框图 (2)
2.2 硬件系统电路各模块设计 (2)
2.2.1 MCS-52单片机最小系统 (2)
2.2.2 独立按键模块 (3)
2.2.3 芯片测试模块 (4)
2.2.4 显示模块 (5)
2.2.5 电源供电模块 (7)
系统软件设计 (8)
3.1 测试对象TTL74 系列芯片简介 (8)
3.2 测试原理 (8)
3.3 程序流程图 (9)
3.4 模块程序关键代码 (11)
3.4.1 主程序 (11)
3.4.2 独立按键扫描程序 (11)
3.4.3 74HC573控制数码管显示程
序 (15)
3.4.4 信号检测程序 (17)
4系统仿真测试 (19)
总结 (21)
致谢 (22)
参考文献 (23)
附录 (24)
附录A 源程序 (24)
附录B 元件清单 (35)
附录C 整体电路图 (36)
1 系统总体方案
在数字集成电路的设计、制造和应用阶段,不可避免地会出现故障,为了保证数字集成电路工作的可靠性,需要对其进行必要的测试。

设计门电路自动测试仪目的在于能够方便检测数字集成芯片的好坏。

然而,由于常用的TTL系列芯片种类繁多,不同型号的数字集成芯片其逻辑功能不同、引脚排列不同、甚至哪些引脚作为输入,哪些引脚作为输出都不固定,也就是说,某个型号的集成芯片的其中一只引脚是输入脚,而另一个型号的集成芯片的同一只引脚却可能是输出脚了。

在进行硬件电路设计时,必须要有这样的接口电路:和集成芯片引脚连接的检测端口既可作为输入,又可作为输出。

正由于上述原因,本方案设计一套数字集成电路测试装置,能够实现对指定几
种14脚常见的74系列数字电路测试。

芯片有
74LS00、74LS04、74LS20、74LS74、74LS86。

对数字系统进行测试基本方法是:从数字集成电路的原始输入端施加若干输入矢量作为激励信号,观察由此产生的输出响应,并与预期的正确结果进行比较,一致则表示芯片完好,不一致则表示芯片有故障。

因此判断一个集成电路芯片是否存在故障,可用该芯片被检测出来的功能是否同设计规范的功能一致来判断。

要让测试结果直观明了,就需设计一个显示模块显示对应测试结果,在此系统中我选用8位数码管来显示芯片型号和两个发光二极管显示测试结果。

此外,由于集成芯片的型号不同,为了提高测试的效率,还需设计一个独立按键模块用于输入检测芯片的型号,方便操作。

综合以上所涉及的几个问题,完整的门电路自动测试仪应包括按键输入模块,显示模块,芯片测试插座模块,结合单片机最小系统来加以控制。

在确立硬件结构的基础上,结合软件完成。

软件部分主要由数据检测程序和显示驱动程序,以及按键子程序三大部分组成。

在设计过程中,首先使用P rotel和P roteus仿真软件作为开发平台来进行硬件电路的设计,并运用软件Keil uVision编写程序完成系统的仿真实现,结合软、硬件完成系统的整体调试。

2 系统硬件电路设计
2.1 硬件系统电路原理框图
该测试系统的原理框图如下图1所示。

图1 测试仪原理框图
此次所设计的数字集成电路检测系统由单片机控制单元,独立按键输入单元,
信号检测单元,数码管显示单元和电源供电单元组成。

2.2 硬件系统电路各模块设计
2.2.1 MCS-52单片机最小系统
MCS-52单片机内部主要由CPU,存储器,可编程I/O 口,定时器/计数器,串行口,中断控制系统,时钟电路等组成。

52系列单片机应用广泛,成本低,控制应用等电路成熟。

此系统中,我选择单片机AT89C52最小系统进行控制,,它的
P0、P1、P2、P3端口是准双向I/O口:既可作为输入口,又可作为输出口,为信号
的检测控制奠定了重要的基础。

其连接如图2所示。

图2 AT89C52 单片机最小系统
单片机在电路中起到控制整个系统的作用,无论是信号检测,还是数码管显示,都通过编程完成控制。

2.2.2 独立按键模块
采用独立按键的优点是控制程序和硬件电路都很简单,缺点是如果每个按键都要占用一个I/O口,当按键较多时占用I/O口较多。

但考虑到本次设计只需要三个按键:检测型号键、复位键、自动检测键。

因此在实际的测试中分别对应
P3.0\P3.1\P3.2通过按键查询就可以简单的起到控制输入的目的。

值得注意的是,在用单片机对按键处理的时候涉及到了一个重要的过程,那就是按键的去抖动。

当用手按下一个键时,按键并不会立刻稳定地接通,在释放一个键时,也不会立刻断开。

因而在闭合和断开的瞬间都会伴随着一连串的抖动。

抖动的持续时间随按键材料和操作员而异,不过通常总是不5-10ms。

这种抖动对于单片机来说是完全可以感觉到的,所以必须消除抖动。

通常有两种方法可以消除抖动,
一种是硬件方法,需要硬件电路,另一种是软件方法,用软件方法可以很容易地解决抖动问题,只需通过延迟10ms来等待抖动消失这之后,在读入按编码值。

所以,我们采用软件消抖法。

独立按键电路如图3所示。

图3独立按键与单片机连接图
2.2.3 芯片测试模块
结合单片机的I/O口使用情况,以及设计的局限,在该系统中我选用了16脚的通用IC紧锁座作为芯片测试插座,能够测试14脚以下的常用数字集成芯片。

根据AT89C52中P0口与P2口的特点,本设计采用AT89C52的P1口和P2口连接测试芯片接口,单片机的P0口的P0.0—P0.7,P2口中的P2.0—P2.5共14条通用I/O 线和检测插座构成了检测电路,其中,P2口中P2.7用于控制14管脚电源地转换,因为规则芯片的右上脚都为电源(Vcc),左下脚都为地(GND)。

测试插座优先考虑14脚的通用测试情况。

单片机与测试插座之间的连接如图4所示。

图4单片机与测试插座连接图
在单片机与紧锁座之间需串接470Ω(或510Ω)的电阻。

串接电阻目是对
AT89C52起限流保护作用,假设,P2.0输出高电平,此时,测试芯片又为非门,那么将引起灌电流现象,致使P2.0口线上电流非常大,对A T89C52有害。

2.2.4 显示模块
(1)数码管显示模块
在系统中,由于系统的独立按键模块和测试插座模块已经使用了单片机的
P1,P2 和P3口,只剩下一组I/O口可供选择。

74HC573是8数据锁存器。

主要用于数码管、按键等的控制,至此,我选用一块芯片74HC573直接控制8位数码管。

有效的节省了单片机的I/O口的使用,极大地简化了硬件电路。

由5片芯片74HC573和4 个7段共阴极数码管构成了显示电路,用于向用户提供按键输入信息及输出检测结果等。

通过单片机的三个I/O口来控制信号输入。

74HC573与AT89C52单片机的硬件连接如图6所示,74HC573锁存器的数据输入端连接单片机的P0口,P0口同时加了上拉电阻,数码管中的C1,C2,C3,C4是它们的位选端。

图6 74HC573 驱动8位数码
(2)发光二极管显示模块
为了使测试结果直观明了,分别在单片机的两个I/O口P3.6和P3.7分别串接两
分别显示芯片好坏两种状态,发光二极管与单片机连接图个红、绿色发光二极管连接图如图7所示。

图7发光LED指示灯与单片机连接图
2.2.5 电源供电模块
在该设计系统中,所需电压都为直流5V,它由电源变压器,桥式整流电路(4
个二极管D1~D4构成),滤波电容,防止自激电容和一只固定式三端稳压器
(LM7805)极为简捷方便地搭成的,为了保证输入LM7805电压的稳定性,在7805
之前我使用一只7812保证电流稳定输入12V。

如图8所示,220V交流电通过电源变压器变换成交流低压,再经过桥式整流电路BR1和滤波电容C6的整流和滤波,在固定式三端稳压器L M7812和L M7805的Vin和GND两端形成一个并不十分稳定的直流电压(该电压常常会因为市电电压的波动或负载的变化等原因而发生变化),此直流电压经过L M7812和LM7805的稳压和C4,C5的滤波便在稳压电源的输出端产生了精度高、稳定度好的直流输出电压。

图8 220V转5V直流电源连接图
LM7805用来给单片机等其它芯片供电,整流电路后的C6为滤波电容,容量较大,输出端电容C4、C5主要是抑制高频干扰,此外还在两个稳压块中加散热片。

3 系统软件设计
软件设计包括主程序模块,按键控制模块,芯片信号检测模块和数码管显示模块等,下面将逐一介绍各个模块的详细设计过程。

由于测试芯片种类繁多,在进行程序设计时首先需要分析常用数字集成芯片的一些规律,便于编程控制。

TTL74系列作为两大主流集成芯片,地位和作用极其重要,基于此,接下来就对测试对象中的常用系列数字集成电路进行分析。

3.1 测试对象TTL74系列芯片简介
TTL电路以双极型晶体管为开关元件,所以又称双极型集成电路,74系列的工作
环境温度规定为O~70℃,电源电压的工作范围为5V士5%。

此外,为满足用户在提高工作速度和降低功耗这两方面的要求,继TTL74、54系列之后,又相继研制和生产了74H系列、74S系列、74LS系列、74AS系列和74ALS系列,以及54H系列、54S系到、54LS系列、54AS系列和54ALS系列,就像74系列和54系列的区别那样,它们之间的区别也仅在于工作环境温度与电源电压工作范围不同。

据于设计的局限及考虑到程序的繁琐,表1列举了14脚以内的要测试TTL74芯片,本设计中只实现对指定几种14脚常见的74系列数字电路测试。

芯片有
74LS00、74LS04、74LS20、74LS74、74LS86。

3.2 测试原理
对于逻辑芯片的检测,我们主要实现检测芯片逻辑功能好坏亦或是确定芯片的型号,由于主控单元采用AT89C52单片机,其I/O与TTL电平完全兼容,因而直接由单片机对芯片插座的引脚进行扫描,由于是固定的14脚芯片,为了编程方便,使芯片测试引脚1~7分别为P1.0~P1.6,引脚14~8分别为P2.0~P2.6。

实现了通过单片机输出
端口模拟芯片的各种输入状态,并通过单片机读回芯片的输出结果,通过与芯片真
值表的比较即可判断芯片逻辑功能的好坏的目的。

在进行芯片扫描时,必须先将芯
片的输出引脚I/O置为高电平,然后对芯片的输入引脚进行各种状态的扫描,通过单
片机读回芯片的输出,再依据芯片的真值表对其输出进相比较,不一致则说明芯片
的逻辑功能发生错误,断定芯片为坏的,若芯片的输出与真值表完全相符,则说明
芯片的逻辑功能正确,可以判断为好芯片。

然后再依据所检测的结果,通过单片机
对芯片的逻辑功能加以详细测试,并对结果加以显示。

在自动检测的时候,为了提
高准确度,我们编写了程序,采用对同一端口两次输入再两次读回其状态的比较方法,来对芯片好坏进行准确测试,继而返回正确的芯片型号。

此次在测试过程中我选用7400来进行系统的调试。

其中,7400为四2输入与非门,在编写测试程序时,主要从以下思路入手:首先,根据测试插座与单片机的各
I/O口连接情况,分别送给测试芯片各引脚送值。

送值的时候是将所有可能出现的各
种逻辑情况进行组合送入至芯片输入端,而输出端都给它置1,并根据真值表推断出
预期的正确结果先存于寄存器中,送值结束后,读取芯片输出端的值,判断输出是
否与预期的值相符,若一致则继续判断另一组输入逻辑值的情况,直至每一组都完
成后对各组结果相与,逻辑为真则表示芯片是好的,若为假表示芯片是坏的。

当然,在测试时若遇其中一组的逻辑为假,则直接判断出芯片是坏的。

3.3 程序流程图
流程图如图9所示。

图9程序流程图
3.4 模块程序关键代码
3.4.1 主程序
在主程序中,需要完成对各状态的初始化,如单片机引脚,寄存器的初始化、74HC573控制数码管显示的初始化、按键扫描,信号检测等工作。

主程序将根据检测芯片的型号,按键的输入提示分别完成信号的测试比较、结果显示等不同的操作。

关键代码如下所示:
int main()//主程序
{
reset();//初始化
while(1)//不停扫描按键
{
keyscan();
}
return 0;//结束程序
}
3.4.2 独立按键扫描程序
在按键控制时采用了全扫描方式,这种方式是直接在主程序中插入按键扫描子程序,主程序每执行一次则按键检测子程序被执行一次,对按键进行检测一次。

如没有按键按下,则跳过键识别,直接执行主程序;如果有键按下,则通过按键扫描子程序识别按键,得到按键的编码值,然后根据编码值进行相应的处理,处理完成在回到主程序执行。

另外我们采用软件消抖法,具体代码如下所示:void keyscan(void) //键盘扫描函数
{ int i;
unsigned char output1,output2;
if(key1==0)//按键1的子程序
{
delayms(10);//延时10ms
if(key1==0)
{
while(key1==0);//等待按键释放
k=detect();
display(name[k]);
}
}
if(key2==o)//按键2的子程序
{
delayms(10);
if(key2==0)
(
while(key2==0);//等待按键释放
ledR = 1;//灭绿led灯
ledG = 1;//灭红led灯
display(0);//数码管显示为0000
}
}
if(key3==0)//按键3的子程序
{
delayms(10);
if(key3==0)
{
while(key3==0);//等待按键释放
k=detect();//调用检测芯片型号子程序
delayms(100);
if(k==0)//检测芯片好坏
{
for(i=0;i<4;i++)
{
input1=LS00[i][0];
input2=LS00[i][1];
delayms(500);
output1=input1&0x3f;
output2=input2&0x3f;
if(output1!=LS00[i][2]||output2!=LS00[i][3])
{
ledR= 0;
time=0;
break;
}
if(output1==LS00[i][2]&&output2==LS00[i][3])
{
time++;
}
}
if(time==4)
{
ledG = 0;
display(name[0]);
time=0;
}
}
if(k==1)
{
for(i=0;i<2;i++)
{
input1=LS04[i][0];
input2=LS04[i][1];
delayms(500);
output1=input1&0x3f;
output2=input2&0x3f;
if(output1!=LS04[i][2]||output2!=LS04[i][3])
{
ledR = 0;
time=0;
break;
}
if(output1==LS04[i][2]&&output2==LS04[i][3])
{
time++;
}
}
if(time==2)
{
ledG = 0;
time=0;
}
}
if(k==2)
{
for(i=0;i<16;i++)
{
input1=LS20[i][0];
input2=LS20[i][1];
delayms(500);
output1=input1&0x3f;
output2=input2&0x3f;
if(output1!=LS20[i][2]||output2!=LS20[i][3])
{
ledR = 0;//点亮红led
time=0;
break;
}
if(output1==LS20[i][2]&&output2==LS20[i][3])
{
time++;
}
}
if(time==16)
{
ledG = 0;//点亮绿led
display(name[k]);//显示芯片型号
time=0;
}
}
if(k==4)
{
for(i=0;i<4;i++)
{
input1=LS86[i][0];
input2=LS86[i][1];
delayms(500);
output1=input1&0x3f;
output2=input2&0x3f;
if(output1!=LS86[i][2]||output2!=LS86[i][3])
{
ledR = 0;
time=0;
break;
}
if(output1==LS86[i][2]&&output2==LS86[i][3])
{
time++;
}
if(time==4)
{
ledG = 0;
display(name[k]);
time=0;
}
}
}
}
}
3.4.3 74HC573控制数码管显示程序
每个数码对应一个位选端。

单片机可以控制锁存器的锁存端,进而控制锁存器
的数据输出,这种分时控制的方法便可方便地控制任意数码管显示任意数字。

在这里我们把数码管的显示部分写成了一个带参数的函数,以便以后调用,另外我们把这个要显示的参数分离成4个一位数。

void display(uint namex)//数码管显示子程序
{
uchar qian,bai,shi,ge;
qian = namex/1000;//千位,把一个4位数分离后分别送数码管显示
bai = namex%1000/100;//百位
shi = namex%100/10;//十位
ge = namex%10;//个位
dula1 = 1;
P0 = table[qian];//送段选数据
dula1 = 0;
P0 = 0xff;//送位选数据前关闭所有显示
delayms(500);//延时500ms
dula2 = 1;
P0 = table[bai];
dula2 = 0;
P0 = 0xff;
delayms(500);
dula3 = 1;
P0 = table[shi];
dula3 = 0;
P0 = 0xff;
delayms(500);
dula4 = 1;
P0 = table[ge];
dula4 = 0;
P0 = 0xff;
delayms(500);
P0 = 0xff;
wela = 1;
P0 = 0xc0;
wela =0;
while(1)
{
if(key1==0)break;
if(key2==0)break;
}
}
3.4.4 信号检测程序
在信号检测部分,我们只对指定的74系列门电路芯片进行功能测试(完好/损坏),如74LS00、74LS04、74LS20、74LS86。

并且能够自动检测指定的几种74系列门电路的型号。

程序设计中需要考虑到芯片的引脚识别,芯片型号的检测程序如下:
unsigned char detect(void) //14脚芯片识别函数
{
unsigned char i,output1,output2;//7474的检测
P1=0xff; //初始化测试端口
P2=0xff;
input1=0x3b;
input2=0x39;
delayms(100);
input1=0x3f; //上升沿
input2=0x3d;
delayms(100);
output1=input1&0x3f;
output2=input2&0x3f;
if(output1==0x1f&&output2==0x2d)
{
return (4);
}
//7400/04/20/86的自动检测
P1=0xff; //初始化测试端口
P2=0xff;
for(i=0;i<M;i++)
{
input1=IC[i][0];
input2=IC[i][1];
delayms(500);
output1=input1&0x3f; //将芯片逻辑结果input1通过&0x3f取出output2=input2&0x3f;
if(output1==IC[i][2]&&output2==IC[i][3])
{
input1=IC[i][4];
input2=IC[i][5];
delayms(500);
output1=input1&0x3f;
output2=input2&0x3f;
if(output1==IC[i][6]&&output2==IC[i][7])
{
return(i);
}
}
}
}
4 系统仿真测试
系统设计完成后,将74LS00芯片放入测试插槽中进行测试,仿真测试结果所示:(1)当按下自动检测键key3后,测试结果如图10所示。

图10按下自动检测键后的测试结果
(2)当按下复位键key2后,测试结果如下图11所示。

图11按下复位键后的测试结果
(3)按下检测型号键key1后,测试结果如下图12所示。

图12按下检测型键后的测试结果
从测试结果可以看出,该系统能够实现对常用的74系列逻辑芯片进行逻辑功能测试,确定芯片的型号,名称,逻辑表达式,是否能够正常工作。

操作简单,测试结果准确率高。

总结
此次毕业设计是我大学四年中最为系统的一次,它有效的把所学的专业知识与实际结合起来。

在硬件电路中较有难度的单数数码管显示单元和测试插座的控制上,虽然之前做实验时有涉及到关于数码管显示的一些方案,但在这次所设计的电路中,由于顾及单片机I/O口的使用情况,最终选取锁存器74HC573芯片来驱动控制。

当然,使用这种方法在节省单片机I/O口的同时,也为后面的编程增加了难度,要是选用MAX7219驱动8位数码管显示,该硬件电路设计和编程都会变得简单些。

此外,程序设计是本次设计的一个难点,对不同类型的芯片,由于引脚、功能不一,测试程序就得具体分析。

而我在编程方面的能力又非常欠缺,在编写程序时显得不知所措,在指导老师的帮助下和自己的努力下,最终得以顺利完成。

由于时间和能力有限,我此次设计只实现了系统的基本功能,测试芯片种类比较单一,在有些地方还有待于改进。

例如,要增加芯片的测试种类,可以对相应的引脚分别用一个继电器来控制,实现I/O线与电源间的自动切换;在显示部分,除了显示结果简单信息外,还可以在测试结束后,让数码管显示字符“good”或“bad”,结果将更加直观明了。

这次设计使我收获颇多,在设计的过程中屡屡碰壁,对我自己算是一次小小的挑战。

通过对设计方案的不断整改,电路调试运行,解决了问题,使我真正认识到‘知行合一’的重要性。

在以后的日子的我会逐渐加强这方面的能力,不断去提高自己。

作为一个当代大学生,仅仅学习理论知识是远远不够的,这次设计给我们提供了一次很好的理论联系实际的机会,使得我对专业方面的基础知识有了更深刻的认识,为即将走上工作岗位奠定了良好的基础。

致谢
大学四年的学习生活即将结束,这篇论文作为我在校期间学习的最后一份答卷,在这里,我要向所有关心和帮助我的老师和同学们表示衷心的感谢。

在这里尤其感谢我的指导老师——罗雪莲老师,她在毕业设计过程中给予我极大的关心和帮助。

从选题到开题报告,程序的编写设计以及论文的完成,罗老师倾注了大量的心血。

本论文的写作是在罗老师的悉心指导下完成的,她为我的毕业设计提出了许多宝贵的建议和给出了设计思路及资料,给予了细心的指导和不懈的支持。

对我遇到的问题,循循善诱,谆谆教导,使我的设计和论文得以如期完成。

当进行方案的选取时和论文的检查时,罗老师给了我的仔细检查和指导及改正,使设计在最短的时间里顺利完成。

罗老师的这种无私的敬业精神和责任感,令人敬佩,在此向尊敬的罗老师表示衷心的感谢。

也感谢湖南工学院所有教导过我的老师们,谢谢您们四年来的悉心教导与关心爱护。

时光匆匆,转眼便是毕业时节,离校日期已日趋临近,毕业论文的的完成也随之进入了尾声。

从开始题到论文的顺利完成,一直都离不开老师、同学、朋友给我热情的帮助,在这里请接受我诚挚的谢意!在设计和论文写作过程中,我还参考了有很多关的书籍和论文,在这里一并向相关的作者们表示感谢。

参考文献
[1] 康华光.电子技术基础模拟部分(第五版).北京:高等教育出版社,2006
Kang huaguang.Basic electronic technology analog part(Fifth
Edition ). Beijing: Higher Education Press,2006
[2] 阎石.数字电子技术基础(第四版).北京:高等教育出版社,1989
Yan shi.fundamentals of digital electronic technology(Fourth
Edition ). Beijing: Higher Education Press,1989
[3]
[4]
[5] 2009
[6]宁武,唐晓宇,闫晓金.全国大学生电子设计竞赛基本技能指导,2009 Ning wu,Tang xiaoyu,Yan xiaojin.National Undergraduate Electronic Design Contest of Basic Skills Guide,2009
郭天祥编著.51单片机C语言教程.电子工业出版社,2009
Edited by Guo tianxiang.51singlechip C language tutorial. Publishing House of electronics industry,2009
刘海涛等编著.8051单片机C语言程序设计与实例解析.清华大学出版社,
Edited by Liu haitao and so on.8051 singlechip C language program design and case analysis. Tsinghua University Press,2009
科林,孙人杰编著.TTL、高速COMS手册.电子工业出版社,2004
Edited by Ke lin,Sun renjie.TTL、high-speed COMS Handbook. Publishing House of electronics industry,2004
附录
附录A源程序
#include<reg52.h>
#include<intrins.h>
#include<stdio.h>//这是头文件
/*==============================宏定义===================*/ #define M4 //要测试的芯片好坏的个数
#define N8
#define input1P1//用于检测的引脚
#define input2P2
#define uchar unsigned char
#define uint unsigned int
sbit key1=P3^0;// 选择检测芯片型号
sbit key2=P3^1;// 复位
sbit key3=P3^2;// 自动检测
sbit ledR=P3^7;/*红色发光led 接单片机P3.7*/
sbit ledG=P3^6;/*绿色放发光LED 接单片机P3.6*/
sbit dula4=P2^6;//声明锁存器的锁存端
sbit dula1=P3^3;
sbit dula2=P3^4;
sbit dula3=P3^5;
sbit wela =P2^7;
unsigned int name[]={7400,7404,7420,7486,7474,7492};
uchar code table[] ={0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};//共阴极数码管编码
/*==============================按键的标志位============*/unsigned char time=0;//用来标示某芯片各通道检测均完好的标志位unsigned char k=0;//返回自动检测后芯片序号在已定义的数组中的序号unsigned char code LS00[4][4]={
0x3f,0x3f,0x1b,0x1b,//74ls00
0x24,0x24,0x24,0x24,
0x36,0x36,0x36,0x36,
0x2d,0x2d,0x2d,0x2d
};
unsigned char code LS04[2][4]={
0x2a,0x2a,0x2a,0x2a,//74ls04
0x3f,0x3f,0x15,0x15
};
unsigned char code LS20[16][4]={
0x24,0x24,0x24,0x24,//74ls20
0x25,0x25,0x25,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
};
unsigned char code LS86[4][4]={
0x24,0x24,0x00,0x00,//74ls86
0x36,0x36,0x36,0x36,
0x2d,0x2d,0x2d,0x2d,
0x3f,0x3f,0x1b,0x1b
};
unsigned char code IC[M][N]={
0x24,0x24,0x24,0x24,0x3f,0x3f,0x1b,0x1b, //7400
0x3f,0x3f,0x15,0x15,0x3f,0x3f,0x15,0x15,//7404
0x3f,0x3f,0x1f,0x1f,0x3f,0x3f,0x1f,0x1f,//7420
0x3f,0x3f,0x1b,0x1b,0x3f,0x3f,0x1b,0x1b//7486
};
void delayms(unsigned int z)//延时函数
{
unsigned int x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
/*=======================14脚芯片识别函数=====================*/ unsigned char detect(void)//14 脚芯片识别函数
{
unsigned char i,output1,output2;
//7474的检测
P1=0xff; //初始化测试端口
P2=0xff;
input1=0x3b;
input2=0x39;
delayms(100);
input1=0x3f;//上升沿
input2=0x3d;
delayms(100);
output1=input1&0x3f;
output2=input2&0x3f;
if(output1==0x1f&&output2==0x2d)
{
return(4);
}
//7400/04/20/86的自动检测
P1=0xff; //初始化测试端口
P2=0xff;
for(i=0;i<M;i++)
{
input1=IC[i][0];
input2=IC[i][1];
delayms(500);
output1=input1&0x3f;//将芯片逻辑结果input1 通过&0x3f取出output2=input2&0x3f;
if(output1==IC[i][2]&&output2==IC[i][3])
{
input1=IC[i][4];
input2=IC[i][5];
delayms(500);
output1=input1&0x3f;
output2=input2&0x3f;
if(output1==IC[i][6]&&output2==IC[i][7])
{
return(i);
}
}
}
}
void display(uint namex)//数码管显示子程序
{
uchar qian,bai,shi,ge;
qian=namex/1000;//千位,把一个4 位数分离后分别送数码管显示bai= namex%1000/100;//百位
shi = namex%100/10;//十位
ge= namex%10;//个位
dula1=1;
P0 =table[qian];//送段选数据
dula1=0;
P0 =0xff;//送位选数据前关闭所有显示
delayms(500);//延时500ms
dula2=1;
P0 =table[bai];
dula2=0;
P0 =0xff;
delayms(500);
dula3=1;
P0 =table[shi];
dula3=0;
P0 =0xff;
delayms(500);
dula4=1;
P0 =table[ge];
dula4=0;
P0 =0xff;
delayms(500);
P0 =0xff;
wela= 1;
P0 =0xc0;
wela=0;
while(1)
{
if(key1==0)break;
if(key2==0)break;
}
}
int reset(void)//数码管和发光led初始化{
ledR= 1; //led 初始化,都熄灭
ledG=1;
wela= 1;//数码管初始化,显示为0000 P0 =0xc0;
wela= 0;
dula1=1;
dula2=1;
dula3=1;
dula4=1;
P0 =table[0];
dula1=0;
dula2=0;
dula3=0;
dula4=0;
}
void keyscan(void)//键盘扫描函数
{ int i;
unsigned char output1,output2;
if(key1==0)//按键1的子程序
{
delayms(10);
if(key1==0)
{
while(key1==0);//等待按键释放
k=detect();
display(name[k]);
}
}
if(key2==o)//按键2的子程序
{
delayms(10);
if(key2==0)
(
while(key2==0);//等待按键释放
ledR= 1;//灭绿led 灯
ledG=1;//灭红led灯
display(0);//数码管显示为0000
}
}
if(key3==0)//按键3的子程序
{
delayms(10);
if(key3==0)
{
while(key3==0);//等待按键释放
k=detect();//调用检测芯片型号子程序
delayms(100);
if(k==0)//检测芯片好坏
{
for(i=0;i<4;i++)
{
input1=LS00[i][0];
input2=LS00[i][1];
delayms(500);
output1=input1&0x3f;
output2=input2&0x3f;
if(output1!=LS00[i][2]||output2!=LS00[i][3])
{
ledR= 0;
time=0;
break;
}
if(output1==LS00[i][2]&&output2==LS00[i][3])
{
time++;
}
}
if(time==4)
{
ledG=0;
display(name[0]);
time=0;
}
}
if(k==1)
{
for(i=0;i<2;i++)
{
input1=LS04[i][0];
input2=LS04[i][1];
delayms(500);
output1=input1&0x3f;
output2=input2&0x3f;
if(output1!=LS04[i][2]||output2!=LS04[i][3])
{
ledR= 0;
time=0;
break;
}
if(output1==LS04[i][2]&&output2==LS04[i][3])
{
time++;
}
}
if(time==2)
{
ledG=0;
time=0;
}
}
if(k==2)
{
for(i=0;i<16;i++)
{
input1=LS20[i][0];
input2=LS20[i][1];
delayms(500);
output1=input1&0x3f;
output2=input2&0x3f;
if(output1!=LS20[i][2]||output2!=LS20[i][3])
{
ledR= 0;//点亮红led
time=0;
break;
}
if(output1==LS20[i][2]&&output2==LS20[i][3])
{
time++;
}
}
if(time==16)
{
ledG=0;//点亮绿led
display(name[k]);//显示芯片型号
time=0;
}
}
if(k==4)
{
for(i=0;i<4;i++)
{
input1=LS86[i][0];
input2=LS86[i][1];
delayms(500);
output1=input1&0x3f;
output2=input2&0x3f;
if(output1!=LS86[i][2]||output2!=LS86[i][3])
{
ledR= 0;
time=0;
break;
}
if(output1==LS86[i][2]&&output2==LS86[i][3])
{
time++;
}
if(time==4)
{
ledG=0;
display(name[k]);
time=0;
}
}
}
}
}
}
int main()//主程序
{
reset();//初始化
while(1)//不停扫按键{
keyscan();
}
return0;//结束程
序}
附录B 元件清单
附录C整体电路图。

相关文档
最新文档