找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 2430|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

基于單片機(jī)的數(shù)字集成電路芯片測(cè)試儀設(shè)計(jì) 程序Proteus仿真

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:142045 發(fā)表于 2021-11-15 14:32 | 只看該作者 |只看大圖 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
  該仿真設(shè)計(jì)一套數(shù)字集成電路測(cè)試裝置,能夠?qū)崿F(xiàn)對(duì)指定幾種14腳常見(jiàn)的74系列數(shù)字電路測(cè)試。芯片有74LS00、74LS04、74LS20、74LS74、74LS86、74LS92。能夠?qū)χ付ǖ?4系列門(mén)電路芯片進(jìn)行功能測(cè)試(完好/損壞)。74LS00、74LS04、74LS20、74LS86。對(duì)于邏輯芯片的檢測(cè),我們主要實(shí)現(xiàn)檢測(cè)芯片邏輯功能好壞亦或是確定芯片的型號(hào),由于主控單元采用STC89c52單片機(jī),其I/O與TTL電平完全兼容,因而直接由單片機(jī)對(duì)芯片插座的引腳進(jìn)行掃描,由于是固定的14腳芯片,為了編程方便,使芯片測(cè)試引腳1~7分別為P1.0~P1.6,引腳14~8分別為P2.0~P2.6。實(shí)現(xiàn)了通過(guò)單片機(jī)輸出端口模擬芯片的各種輸入狀態(tài),并通過(guò)單片機(jī)讀回芯片的輸出結(jié)果,通過(guò)與芯片真值表的比較即可判斷芯片邏輯功能的好壞的目的。在進(jìn)行芯片掃描時(shí),必須先將芯片的輸出引腳I/O置為高電平,然后對(duì)芯片的輸入引腳進(jìn)行各種狀態(tài)的掃描,通過(guò)單片機(jī)讀回芯片的輸出,再依據(jù)芯片的真值表對(duì)其輸出進(jìn)相比較,不一致則說(shuō)明芯片的邏輯功能發(fā)生錯(cuò)誤,斷定芯片為壞的,若芯片的輸出與真值表完全相符,則說(shuō)明芯片的邏輯功能正確,可以判斷為好芯片。 然后再依據(jù)所檢測(cè)的結(jié)果,通過(guò)單片機(jī)對(duì)芯片的邏輯功能加以詳細(xì)測(cè)試,并對(duì)結(jié)果加以顯示。在自動(dòng)識(shí)別的時(shí)候,為了提高準(zhǔn)確度,我們編寫(xiě)了程序,采用對(duì)同一端口兩次輸入再兩次讀回其狀態(tài)的比較方法,來(lái)對(duì)芯片好壞進(jìn)行準(zhǔn)確測(cè)試,繼而返回正確的芯片型號(hào)。

仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)


單片機(jī)源程序如下:
  1. /*------數(shù)字集成電路芯片測(cè)試儀C51程序僅供參考------------------------------*/
  2. //-------------------------------------------------------------------------------------------
  3. #include<reg52.h>
  4. #include <intrins.h>
  5. #include <stdio.h>
  6. //這是頭文件必須包含
  7. /*==============================宏定義==============================*/
  8. #define LCD_data P0                //數(shù)據(jù)口
  9. #define M 4                                //要測(cè)試的芯片好壞的個(gè)數(shù)
  10. #define N 8
  11. #define input1 P1                        //用于檢測(cè)的引腳
  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)字符位置寫(xiě)字符串子程序
  17. void putstr(unsigned char code *s);    //定位寫(xiě)字符串子程序
  18. void putchars(unsigned char c);       //在(CXPOS,CYPOS)字符位置寫(xiě)字符子程序
  19. unsigned char getchars(void);         //CXPOS,CYPOS)字符位置讀字符子程序
  20. void charlcdpos(void);              //設(shè)置(CXPOS,CYPOS)字符位置的DDRAM地址
  21. void charcursornext(void);           //置字符位置為下一個(gè)有效位置子程序
  22. void lcdreset(void);                 //SMC1602系列液晶顯示控制器初始化子程序
  23. void delay3ms(void);                //延時(shí)3MS子程序
  24. void lcdwc(unsigned char c);          //送控制字到液晶顯示控制器子程序
  25. void lcdwd(unsigned char d);         //送控制字到液晶顯示控制器子程序
  26. unsigned char lcdrd(void);            //讀數(shù)據(jù)子程序
  27. void lcdwaitidle(void);               //忙檢測(cè)子程序
  28. unsigned char data CXPOS;           //列方向地址指針(用于CHARLCDPOS子程序)
  29. unsigned char data CYPOS;           //行方向地址指針(用于CHARLCDPOS子程序)
  30. sbit RSPIN   = P3^5;               //RS對(duì)應(yīng)單片機(jī)引腳
  31. sbit RWPIN   = P3^4;              //RW對(duì)應(yīng)單片機(jī)引腳
  32. sbit EPIN    = P3^3;               //E對(duì)應(yīng)單片機(jī)引腳
  33. /*==============================宏定義==============================*/
  34. unsigned char detect(); //自動(dòng)檢測(cè)引腳
  35. /*=============================定義按鍵=============================*/
  36. sbit key1=P3^0;  // 選擇檢測(cè)芯片
  37. sbit key2=P3^1;  // 確定選擇的芯片
  38. sbit key3=P3^2;  // 自動(dòng)檢測(cè)
  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. /*==============================按鍵的標(biāo)志位=========================*/
  42. unsigned char flag=0;                                //要選擇的芯片型號(hào)在已定義字符數(shù)組中的序號(hào)
  43. unsigned char flag1=0;
  44. unsigned char flag2=0;                                //用來(lái)標(biāo)示某芯片各通道檢測(cè)均完好的標(biāo)志位
  45. unsigned char k=0;                                 //返回自動(dòng)檢測(cè)后芯片序號(hào)在已定義的數(shù)組中的序號(hào)
  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. //延時(shí)函數(shù)
  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腳芯片識(shí)別函數(shù)=======================*/
  233. unsigned char detect() //14腳芯片識(shí)別函數(shù)
  234. {
  235.   unsigned char i,output1,output2;
  236. //7474的檢測(cè)
  237.   P1=0xff;                          //初始化測(cè)試端口
  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的自動(dòng)檢測(cè)
  252.   P1=0xff;                          //初始化測(cè)試端口
  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;                                 //將芯片邏輯結(jié)果input1通過(guò)&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;                                                        //檢測(cè)7492時(shí),先用繼電器江電源供電引腳切換
  276.   P1=0xff;                          //初始化測(cè)試端口
  277.   P2=0xff;
  278.   input1=0x3f;                                            //7492的檢測(cè)
  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;                                                        //測(cè)試結(jié)束,將電源供電引腳切換回原狀態(tài)
  289.   return (6);
  290. }
  291. //-------------------------------------------------------------------------------
  292. void charfill(unsigned char c)          //整屏顯示A代表的ASCII字符子程序
  293. {   for(CXPOS=CYPOS=0;1;)
  294.     {   putchars(c);                //定位寫(xiě)字符
  295.         charcursornext();            //置字符位置為下一個(gè)有效位置
  296.         if((CXPOS==0) && (CYPOS==0)) break;
  297.     }
  298. }
  299. //子程序名稱(chēng):void putstrxy(unsigned char cx,unsigned char cy,unsigned char *s).
  300. //功能:在(cx,cy)字符位置寫(xiě)字符串.
  301. //-------------------------------------------------------------------------------
  302. void putstrxy(unsigned char cx,unsigned char cy,unsigned char code *s)
  303. {                                 //在(cx,cy)字符位置寫(xiě)字符串子程序
  304.     CXPOS=cx;                    //置當(dāng)前X位置為cx
  305.     CYPOS=cy;                    //置當(dāng)前Y位置為cy
  306.     for(;*s!=0;s++)                 //為零表示字符串結(jié)束,退出
  307.     {   putchars(*s);               //寫(xiě)1個(gè)字符
  308.         charcursornext();           //字符位置移到下一個(gè)
  309.     }
  310. }
  311. //-------------------------------------------------------------------------------
  312. //子程序名稱(chēng):void putstr(unsigned char *s).
  313. //功能:在(CXPOS,CYPOS)字符位置寫(xiě)字符串.
  314. //-------------------------------------------------------------------------------
  315. void putstr(unsigned char code *s)     //定位寫(xiě)字符串子程序
  316. {   for(;*s!=0;s++)                //為零表示字符串結(jié)束,退出
  317.     {   putchars(*s);              //寫(xiě)1個(gè)字符
  318.         charcursornext();          //字符位置移到下一個(gè)
  319.     }
  320. }
  321. //-------------------------------------------------------------------------------
  322. //子程序名稱(chēng):void putchar(unsigned char c).
  323. //功能:在(CXPOS,CYPOS)字符位置寫(xiě)字符.
  324. //-------------------------------------------------------------------------------
  325. void putchars(unsigned char c)       //在(CXPOS,CYPOS)字符位置寫(xiě)字符子程序
  326. {
  327.     charlcdpos();                 //設(shè)置(CXPOS,CYPOS)字符位置的DDRAM地址
  328.     lcdwd(c);                    //寫(xiě)字符
  329. }
  330. //-------------------------------------------------------------------------------
  331. //子程序名稱(chēng):unsigned char getchar(void).
  332. //功能:在(CXPOS,CYPOS)字符位置讀字符.
  333. //-------------------------------------------------------------------------------
  334. unsigned char getchars(void)          //在(CXPOS,CYPOS)字符位置讀字符子程序
  335. {
  336.     charlcdpos();                   //設(shè)置(CXPOS,CYPOS)字符位置的DDRAM地址
  337.     return lcdrd();                  //讀字符
  338. }
  339. //-------------------------------------------------------------------------------
  340. //以下charlcdpos,charcursornext,lcdreset為HD44780兼容芯片的液晶顯示控制器的
  341. //16字符X2行的SMC1602系列標(biāo)準(zhǔn)字符點(diǎn)陣型液晶顯示模塊的接口程序.
  342. //-------------------------------------------------------------------------------
  343. //子程序名稱(chēng):void charlcdpos(void).
  344. ……………………

  345. …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼

所有資料51hei附件下載:
數(shù)字集成電路芯片測(cè)試儀.rar (75.57 KB, 下載次數(shù): 15)

評(píng)分

參與人數(shù) 1黑幣 +80 收起 理由
admin + 80 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表