标题:
基于单片机的数字集成电路芯片测试仪设计 程序Proteus仿真
[打印本页]
作者:
上善-若水
时间:
2021-11-15 14:32
标题:
基于单片机的数字集成电路芯片测试仪设计 程序Proteus仿真
该仿真设计一套数字集成电路测试装置,能够实现对指定几种14脚常见的74系列数字电路测试。芯片有74LS00、74LS04、74LS20、74LS74、74LS86、74LS92。能够对指定的74系列门电路芯片进行功能测试(完好/损坏)。74LS00、74LS04、74LS20、74LS86。对于逻辑芯片的检测,我们主要实现检测芯片逻辑功能好坏亦或是确定芯片的型号,由于主控单元采用STC89c52单片机,其I/O与TTL电平完全兼容,因而直接由单片机对芯片插座的引脚进行扫描,由于是固定的14脚芯片,为了编程方便,使芯片测试引脚1~7分别为P1.0~P1.6,引脚14~8分别为P2.0~P2.6。实现了通过单片机输出端口模拟芯片的各种输入状态,并通过单片机读回芯片的输出结果,通过与芯片真值表的比较即可判断芯片逻辑功能的好坏的目的。在进行芯片扫描时,必须先将芯片的输出引脚I/O置为高电平,然后对芯片的输入引脚进行各种状态的扫描,通过单片机读回芯片的输出,再依据芯片的真值表对其输出进相比较,不一致则说明芯片的逻辑功能发生错误,断定芯片为坏的,若芯片的输出与真值表完全相符,则说明芯片的逻辑功能正确,可以判断为好芯片。 然后再依据所检测的结果,通过单片机对芯片的逻辑功能加以详细测试,并对结果加以显示。在自动识别的时候,为了提高准确度,我们编写了程序,采用对同一端口两次输入再两次读回其状态的比较方法,来对芯片好坏进行准确测试,继而返回正确的芯片型号。
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
集成电路芯片测试仪.png
(21.62 KB, 下载次数: 77)
下载附件
2021-11-15 14:36 上传
单片机源程序如下:
/*------数字集成电路芯片测试仪C51程序仅供参考------------------------------*/
//-------------------------------------------------------------------------------------------
#include<reg52.h>
#include <intrins.h>
#include <stdio.h>
//这是头文件必须包含
/*==============================宏定义==============================*/
#define LCD_data P0 //数据口
#define M 4 //要测试的芯片好坏的个数
#define N 8
#define input1 P1 //用于检测的引脚
#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,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(unsigned char d); //送控制字到液晶显示控制器子程序
unsigned char lcdrd(void); //读数据子程序
void lcdwaitidle(void); //忙检测子程序
unsigned char data CXPOS; //列方向地址指针(用于CHARLCDPOS子程序)
unsigned char data CYPOS; //行方向地址指针(用于CHARLCDPOS子程序)
sbit RSPIN = P3^5; //RS对应单片机引脚
sbit RWPIN = P3^4; //RW对应单片机引脚
sbit EPIN = P3^3; //E对应单片机引脚
/*==============================宏定义==============================*/
unsigned char detect(); //自动检测引脚
/*=============================定义按键=============================*/
sbit key1=P3^0; // 选择检测芯片
sbit key2=P3^1; // 确定选择的芯片
sbit key3=P3^2; // 自动检测
sbit key4=P3^6; // 继电器的切换
unsigned char *name[]={"74LS00 Y=/AB","74LS04 Y=/A","74LS20 Y=/ABCD","74LS86 Y=/A⊕B","74LS74","74LS92","ERROR"};
/*==============================按键的标志位=========================*/
unsigned char flag=0; //要选择的芯片型号在已定义字符数组中的序号
unsigned char flag1=0;
unsigned char flag2=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 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 '74LS00'");break;
case 2:charfill(' '); putstrxy(0,0,"NOW '74LS04'");break;
case 3:charfill(' '); putstrxy(0,0,"NOW '74LS20'");break;
case 4:charfill(' '); putstrxy(0,0,"NOW '74LS86'");
}
}
}
if(flag==1&&key2==0)
{
for(i=0;i<4;i++)
{
input1=LS00[i][0];
input2=LS00[i][1];
delay(5);
output1=input1&0x3f;
output2=input2&0x3f;
if(output1!=LS00[i][2]||output2!=LS00[i][3])
{
putstrxy(0,1,"SORRY,BAD CHIP!");
flag2=0;
break;
}
if(output1==LS00[i][2]&&output2==LS00[i][3])
{
flag2++;
}
}
if(flag2==4)
{
putstrxy(0,1,"OK,GOOD CHIP!");
flag2=0;
}
}
if(flag==2&&key2==0)
{
for(i=0;i<2;i++)
{
input1=LS04[i][0];
input2=LS04[i][1];
delay(5);
output1=input1&0x3f;
output2=input2&0x3f;
if(output1!=LS04[i][2]||output2!=LS04[i][3])
{
putstrxy(0,1,"SORRY,BAD CHIP!");
flag2=0;
break;
}
if(output1==LS04[i][2]&&output2==LS04[i][3])
{
flag2++;
}
}
if(flag2==2)
{
putstrxy(0,1,"OK,GOOD CHIP!");
flag2=0;
}
}
if(flag==3&&key2==0)
{
for(i=0;i<16;i++)
{
input1=LS20[i][0];
input2=LS20[i][1];
delay(5);
output1=input1&0x3f;
output2=input2&0x3f;
if(output1!=LS20[i][2]||output2!=LS20[i][3])
{
putstrxy(0,1,"SORRY,BAD CHIP!");
flag2=0;
break;
}
if(output1==LS20[i][2]&&output2==LS20[i][3])
{
flag2++;
}
}
if(flag2==16)
{
putstrxy(0,1,"OK,GOOD CHIP!");
flag2=0;
}
}
if(flag==4&&key2==0)
{
for(i=0;i<4;i++)
{
input1=LS86[i][0];
input2=LS86[i][1];
delay(5);
output1=input1&0x3f;
output2=input2&0x3f;
if(output1!=LS86[i][2]||output2!=LS86[i][3])
{
putstrxy(0,1,"SORRY,BAD CHIP!");
flag2=0;
break;
}
if(output1==LS86[i][2]&&output2==LS86[i][3])
{
flag2++;
}
}
if(flag2==4)
{
putstrxy(0,1,"OK,GOOD CHIP!");
flag2=0;
}
}
if(key3==0)
{
k=detect();
charfill(' ');
putstrxy(0,0,"This is:");
putstrxy(0,5,name[k]);
}
}
}
//延时函数
void delay(unsigned int z)
{
unsigned int x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
/*============================14脚芯片识别函数=======================*/
unsigned char detect() //14脚芯片识别函数
{
unsigned char i,output1,output2;
//7474的检测
P1=0xff; //初始化测试端口
P2=0xff;
input1=0x3b;
input2=0x39;
delay(5);
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;i<M;i++)
{
input1=IC[i][0];
input2=IC[i][1];
delay(5);
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];
delay(5);
output1=input1&0x3f;
output2=input2&0x3f;
if(output1==IC[i][6]&&output2==IC[i][7])
{
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&&output2==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(); //字符位置移到下一个
}
}
//-------------------------------------------------------------------------------
//子程序名称:void putstr(unsigned char *s).
//功能:在(CXPOS,CYPOS)字符位置写字符串.
//-------------------------------------------------------------------------------
void putstr(unsigned char code *s) //定位写字符串子程序
{ for(;*s!=0;s++) //为零表示字符串结束,退出
{ putchars(*s); //写1个字符
charcursornext(); //字符位置移到下一个
}
}
//-------------------------------------------------------------------------------
//子程序名称:void putchar(unsigned char c).
//功能:在(CXPOS,CYPOS)字符位置写字符.
//-------------------------------------------------------------------------------
void putchars(unsigned char c) //在(CXPOS,CYPOS)字符位置写字符子程序
{
charlcdpos(); //设置(CXPOS,CYPOS)字符位置的DDRAM地址
lcdwd(c); //写字符
}
//-------------------------------------------------------------------------------
//子程序名称:unsigned char getchar(void).
//功能:在(CXPOS,CYPOS)字符位置读字符.
//-------------------------------------------------------------------------------
unsigned char getchars(void) //在(CXPOS,CYPOS)字符位置读字符子程序
{
charlcdpos(); //设置(CXPOS,CYPOS)字符位置的DDRAM地址
return lcdrd(); //读字符
}
//-------------------------------------------------------------------------------
//以下charlcdpos,charcursornext,lcdreset为HD44780兼容芯片的液晶显示控制器的
//16字符X2行的SMC1602系列标准字符点阵型液晶显示模块的接口程序.
//-------------------------------------------------------------------------------
//子程序名称:void charlcdpos(void).
……………………
…………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei附件下载:
数字集成电路芯片测试仪.rar
(75.57 KB, 下载次数: 15)
2021-11-15 14:31 上传
点击文件名下载附件
10
下载积分: 黑币 -5
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1