找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1766|回复: 0
打印 上一主题 下一主题
收起左侧

基于单片机的数字集成电路芯片测试仪设计 程序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仿真工程文件可到本帖附件中下载)


单片机源程序如下:
  1. /*------数字集成电路芯片测试仪C51程序仅供参考------------------------------*/
  2. //-------------------------------------------------------------------------------------------
  3. #include<reg52.h>
  4. #include <intrins.h>
  5. #include <stdio.h>
  6. //这是头文件必须包含
  7. /*==============================宏定义==============================*/
  8. #define LCD_data P0                //数据口
  9. #define M 4                                //要测试的芯片好坏的个数
  10. #define N 8
  11. #define input1 P1                        //用于检测的引脚
  12. #define input2 P2
  13. /*======================液晶宏定义、初始化引脚=========================*/
  14. void delay(unsigned int z);
  15. void charfill(unsigned char c);        //整屏显示A代表的ASCII字符子程序
  16. void putstrxy(unsigned char cx,unsigned char cy,unsigned char code *s);//在(cx,cy)字符位置写字符串子程序
  17. void putstr(unsigned char code *s);    //定位写字符串子程序
  18. void putchars(unsigned char c);       //在(CXPOS,CYPOS)字符位置写字符子程序
  19. unsigned char getchars(void);         //CXPOS,CYPOS)字符位置读字符子程序
  20. void charlcdpos(void);              //设置(CXPOS,CYPOS)字符位置的DDRAM地址
  21. void charcursornext(void);           //置字符位置为下一个有效位置子程序
  22. void lcdreset(void);                 //SMC1602系列液晶显示控制器初始化子程序
  23. void delay3ms(void);                //延时3MS子程序
  24. void lcdwc(unsigned char c);          //送控制字到液晶显示控制器子程序
  25. void lcdwd(unsigned char d);         //送控制字到液晶显示控制器子程序
  26. unsigned char lcdrd(void);            //读数据子程序
  27. void lcdwaitidle(void);               //忙检测子程序
  28. unsigned char data CXPOS;           //列方向地址指针(用于CHARLCDPOS子程序)
  29. unsigned char data CYPOS;           //行方向地址指针(用于CHARLCDPOS子程序)
  30. sbit RSPIN   = P3^5;               //RS对应单片机引脚
  31. sbit RWPIN   = P3^4;              //RW对应单片机引脚
  32. sbit EPIN    = P3^3;               //E对应单片机引脚
  33. /*==============================宏定义==============================*/
  34. unsigned char detect(); //自动检测引脚
  35. /*=============================定义按键=============================*/
  36. sbit key1=P3^0;  // 选择检测芯片
  37. sbit key2=P3^1;  // 确定选择的芯片
  38. sbit key3=P3^2;  // 自动检测
  39. sbit key4=P3^6;  // 继电器的切换

  40. unsigned char *name[]={"74LS00 Y=/AB","74LS04 Y=/A","74LS20 Y=/ABCD","74LS86 Y=/A⊕B","74LS74","74LS92","ERROR"};
  41. /*==============================按键的标志位=========================*/
  42. unsigned char flag=0;                                //要选择的芯片型号在已定义字符数组中的序号
  43. unsigned char flag1=0;
  44. unsigned char flag2=0;                                //用来标示某芯片各通道检测均完好的标志位
  45. unsigned char k=0;                                 //返回自动检测后芯片序号在已定义的数组中的序号
  46. unsigned char code LS00[4][4]={
  47.                                 0x3f,0x3f,0x1b,0x1b,                //74ls00
  48.                                        0x24,0x24,0x24,0x24,
  49.                                 0x36,0x36,0x36,0x36,
  50.                                                           0x2d,0x2d,0x2d,0x2d,
  51.                                         };

  52. unsigned char code LS04[2][4]={
  53.                                                              0x2a,0x2a,0x2a,0x2a,                //74ls04
  54.                                                               0x3f,0x3f,0x15,0x15,
  55.                                                     };

  56. unsigned char code LS20[16][4]={
  57.                                 0x24,0x24,0x24,0x24,                //74ls20
  58.                                 0x25,0x25,0x25,0x25,
  59.                                                          0x26,0x26,0x26,0x26,
  60.                                                          0x27,0x27,0x27,0x27,
  61.                                                          0x2c,0x2c,0x2c,0x2c,
  62.                                                        0x2d,0x2d,0x2d,0x2d,
  63.                                                               0x2e,0x2e,0x2e,0x2e,
  64.                                                                0x2f,0x2f,0x2f,0x2f,
  65.                                                            0x34,0x34,0x34,0x34,
  66.                                                               0x35,0x35,0x35,0x35,
  67.                                                             0x36,0x36,0x36,0x36,
  68.                                                            0x37,0x37,0x37,0x37,
  69.                                                       0x3c,0x3c,0x3c,0x3c,
  70.                                                               0x3d,0x3d,0x3d,0x3d,
  71.                                                       0x3e,0x3e,0x3e,0x3e,
  72.                                                      0x3f,0x3f,0x1f,0x1f,
  73.                                                     };

  74. unsigned char code LS86[4][4]={
  75.                                 0x24,0x24,0x00,0x00,                //74ls86
  76.                                 0x36,0x36,0x36,0x36,
  77.                                                       0x2d,0x2d,0x2d,0x2d,
  78.                                                          0x3f,0x3f,0x1b,0x1b,
  79.                                           };


  80. unsigned char code IC[M][N]={
  81.                                0x24,0x24,0x24,0x24,0x3f,0x3f,0x1b,0x1b, //7400
  82.                                                            0x3f,0x3f,0x15,0x15,0x3f,0x3f,0x15,0x15, //7404
  83.                                0x3f,0x3f,0x1f,0x1f,0x3f,0x3f,0x1f,0x1f, //7420
  84.                                0x3f,0x3f,0x1b,0x1b,0x3f,0x3f,0x1b,0x1b, //7486
  85.                                        };

  86. void main()
  87. {  
  88. unsigned char i,output1,output2;
  89.     lcdreset();                         //液晶显示控制器初始化
  90.     putstrxy(0,0,"PLEASE CHOOSE 74LS CHIP");  //显示欢迎界面
  91.     while(1)
  92.         {  
  93.                 if(key1==0)
  94.                 {
  95.                  delay(100);
  96.                    if(key1==0)
  97.                    {
  98.                                if(flag==4)
  99.                        {
  100.                            flag=0;
  101.                        }
  102.                         flag++;
  103.                         switch(flag)
  104.                                                 {
  105.                           case 1:charfill(' '); putstrxy(0,0,"NOW '74LS00'");break;
  106.                                                 case 2:charfill(' '); putstrxy(0,0,"NOW '74LS04'");break;
  107.                                                   case 3:charfill(' '); putstrxy(0,0,"NOW '74LS20'");break;
  108.                                                   case 4:charfill(' '); putstrxy(0,0,"NOW '74LS86'");
  109.                                                 }

  110.                    }
  111.                 }

  112.                 if(flag==1&&key2==0)
  113.                 {
  114.                    for(i=0;i<4;i++)
  115.                    {
  116.                          input1=LS00[i][0];
  117.                          input2=LS00[i][1];
  118.                           delay(5);
  119.                           output1=input1&0x3f;
  120.                           output2=input2&0x3f;
  121.                           if(output1!=LS00[i][2]||output2!=LS00[i][3])
  122.                              {
  123.                                   putstrxy(0,1,"SORRY,BAD CHIP!");
  124.                                   flag2=0;
  125.                                   break;
  126.                              }
  127.                           if(output1==LS00[i][2]&&output2==LS00[i][3])
  128.                              {
  129.                                   flag2++;
  130.                    }
  131.                 }
  132.                  if(flag2==4)
  133.                    {
  134.                           putstrxy(0,1,"OK,GOOD CHIP!");
  135.                           flag2=0;
  136.                    }
  137.                 }
  138.                if(flag==2&&key2==0)
  139.                 {
  140.                    for(i=0;i<2;i++)
  141.                    {
  142.                           input1=LS04[i][0];
  143.                           input2=LS04[i][1];
  144.                           delay(5);
  145.                           output1=input1&0x3f;
  146.                           output2=input2&0x3f;
  147.                           if(output1!=LS04[i][2]||output2!=LS04[i][3])
  148.                             {
  149.                                   putstrxy(0,1,"SORRY,BAD CHIP!");
  150.                                   flag2=0;
  151.                                   break;
  152.                             }
  153.                           if(output1==LS04[i][2]&&output2==LS04[i][3])
  154.                             {
  155.                                   flag2++;
  156.                             }
  157.                    }
  158.                      if(flag2==2)
  159.                        {
  160.                           putstrxy(0,1,"OK,GOOD CHIP!");
  161.                           flag2=0;
  162.                       }
  163.                  }
  164.                 if(flag==3&&key2==0)
  165.                 {
  166.                    for(i=0;i<16;i++)
  167.                    {
  168.                           input1=LS20[i][0];
  169.                           input2=LS20[i][1];
  170.                           delay(5);
  171.                           output1=input1&0x3f;
  172.                           output2=input2&0x3f;
  173.                           if(output1!=LS20[i][2]||output2!=LS20[i][3])
  174.                             {
  175.                                   putstrxy(0,1,"SORRY,BAD CHIP!");
  176.                                   flag2=0;
  177.                                   break;
  178.                             }
  179.                           if(output1==LS20[i][2]&&output2==LS20[i][3])
  180.                             {
  181.                                    flag2++;
  182.                             }
  183.                    }
  184.                       if(flag2==16)
  185.                         {
  186.                            putstrxy(0,1,"OK,GOOD CHIP!");
  187.                            flag2=0;
  188.                         }
  189.                  }
  190.                 if(flag==4&&key2==0)
  191.                  {
  192.                     for(i=0;i<4;i++)
  193.                     {
  194.                            input1=LS86[i][0];
  195.                            input2=LS86[i][1];
  196.                            delay(5);
  197.                            output1=input1&0x3f;
  198.                            output2=input2&0x3f;
  199.                            if(output1!=LS86[i][2]||output2!=LS86[i][3])
  200.                              {
  201.                                    putstrxy(0,1,"SORRY,BAD CHIP!");
  202.                                    flag2=0;
  203.                                    break;
  204.                              }
  205.                            if(output1==LS86[i][2]&&output2==LS86[i][3])
  206.                              {
  207.                                     flag2++;
  208.                              }
  209.                     }
  210.                        if(flag2==4)
  211.                          {
  212.                            putstrxy(0,1,"OK,GOOD CHIP!");
  213.                            flag2=0;
  214.                          }
  215.                 }

  216.                 if(key3==0)
  217.                 {
  218.                            k=detect();
  219.                            charfill(' ');
  220.                            putstrxy(0,0,"This is:");
  221.                            putstrxy(0,5,name[k]);
  222.                 }
  223.        }
  224. }

  225. //延时函数
  226. void delay(unsigned int z)
  227. {
  228.         unsigned int x,y;
  229.         for(x=z;x>0;x--)
  230.                 for(y=110;y>0;y--);
  231. }

  232. /*============================14脚芯片识别函数=======================*/
  233. unsigned char detect() //14脚芯片识别函数
  234. {
  235.   unsigned char i,output1,output2;
  236. //7474的检测
  237.   P1=0xff;                          //初始化测试端口
  238.   P2=0xff;
  239.   input1=0x3b;                                                
  240.   input2=0x39;
  241.   delay(5);
  242.   input1=0x3f;                                                   //上升沿
  243.   input2=0x3d;
  244.   delay(5);
  245.   output1=input1&0x3f;
  246.   output2=input2&0x3f;
  247.   if(output1==0x1f&&output2==0x2d)
  248.   {
  249.         return (4);
  250.   }
  251.                                                                         //7400/04/20/86的自动检测
  252.   P1=0xff;                          //初始化测试端口
  253.   P2=0xff;

  254.   for(i=0;i<M;i++)
  255.   {
  256.     input1=IC[i][0];
  257.     input2=IC[i][1];
  258.     delay(5);
  259.     output1=input1&0x3f;                                 //将芯片逻辑结果input1通过&0x3f取出
  260.     output2=input2&0x3f;
  261.     if(output1==IC[i][2]&&output2==IC[i][3])
  262.     {
  263.          input1=IC[i][4];
  264.          input2=IC[i][5];
  265.          delay(5);
  266.          output1=input1&0x3f;         
  267.          output2=input2&0x3f;
  268.          if(output1==IC[i][6]&&output2==IC[i][7])
  269.          {
  270.                 return i;
  271.          }
  272.     }
  273.   }
  274.    
  275.   key4=0;                                                        //检测7492时,先用继电器江电源供电引脚切换
  276.   P1=0xff;                          //初始化测试端口
  277.   P2=0xff;
  278.   input1=0x3f;                                            //7492的检测
  279.   input2=0x3f;
  280.   delay(5);
  281.   output1=input1&0x3f;
  282.   output2=input2&0x3f;
  283.   if(output1==0x3f&&output2==0x01)
  284.   {
  285.       delay(100);key4=1;return (5);
  286.   }
  287.   delay(100);
  288.   key4=1;                                                        //测试结束,将电源供电引脚切换回原状态
  289.   return (6);
  290. }
  291. //-------------------------------------------------------------------------------
  292. void charfill(unsigned char c)          //整屏显示A代表的ASCII字符子程序
  293. {   for(CXPOS=CYPOS=0;1;)
  294.     {   putchars(c);                //定位写字符
  295.         charcursornext();            //置字符位置为下一个有效位置
  296.         if((CXPOS==0) && (CYPOS==0)) break;
  297.     }
  298. }
  299. //子程序名称:void putstrxy(unsigned char cx,unsigned char cy,unsigned char *s).
  300. //功能:在(cx,cy)字符位置写字符串.
  301. //-------------------------------------------------------------------------------
  302. void putstrxy(unsigned char cx,unsigned char cy,unsigned char code *s)
  303. {                                 //在(cx,cy)字符位置写字符串子程序
  304.     CXPOS=cx;                    //置当前X位置为cx
  305.     CYPOS=cy;                    //置当前Y位置为cy
  306.     for(;*s!=0;s++)                 //为零表示字符串结束,退出
  307.     {   putchars(*s);               //写1个字符
  308.         charcursornext();           //字符位置移到下一个
  309.     }
  310. }
  311. //-------------------------------------------------------------------------------
  312. //子程序名称:void putstr(unsigned char *s).
  313. //功能:在(CXPOS,CYPOS)字符位置写字符串.
  314. //-------------------------------------------------------------------------------
  315. void putstr(unsigned char code *s)     //定位写字符串子程序
  316. {   for(;*s!=0;s++)                //为零表示字符串结束,退出
  317.     {   putchars(*s);              //写1个字符
  318.         charcursornext();          //字符位置移到下一个
  319.     }
  320. }
  321. //-------------------------------------------------------------------------------
  322. //子程序名称:void putchar(unsigned char c).
  323. //功能:在(CXPOS,CYPOS)字符位置写字符.
  324. //-------------------------------------------------------------------------------
  325. void putchars(unsigned char c)       //在(CXPOS,CYPOS)字符位置写字符子程序
  326. {
  327.     charlcdpos();                 //设置(CXPOS,CYPOS)字符位置的DDRAM地址
  328.     lcdwd(c);                    //写字符
  329. }
  330. //-------------------------------------------------------------------------------
  331. //子程序名称:unsigned char getchar(void).
  332. //功能:在(CXPOS,CYPOS)字符位置读字符.
  333. //-------------------------------------------------------------------------------
  334. unsigned char getchars(void)          //在(CXPOS,CYPOS)字符位置读字符子程序
  335. {
  336.     charlcdpos();                   //设置(CXPOS,CYPOS)字符位置的DDRAM地址
  337.     return lcdrd();                  //读字符
  338. }
  339. //-------------------------------------------------------------------------------
  340. //以下charlcdpos,charcursornext,lcdreset为HD44780兼容芯片的液晶显示控制器的
  341. //16字符X2行的SMC1602系列标准字符点阵型液晶显示模块的接口程序.
  342. //-------------------------------------------------------------------------------
  343. //子程序名称:void charlcdpos(void).
  344. ……………………

  345. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei附件下载:
数字集成电路芯片测试仪.rar (75.57 KB, 下载次数: 14)

评分

参与人数 1黑币 +80 收起 理由
admin + 80 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表