久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

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

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

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


單片機源程序如下:
  1. /*------數(shù)字集成電路芯片測試儀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                                //要測試的芯片好壞的個數(shù)
  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);              //設(shè)置(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);            //讀數(shù)據(jù)子程序
  27. void lcdwaitidle(void);               //忙檢測子程序
  28. unsigned char data CXPOS;           //列方向地址指針(用于CHARLCDPOS子程序)
  29. unsigned char data CYPOS;           //行方向地址指針(用于CHARLCDPOS子程序)
  30. sbit RSPIN   = P3^5;               //RS對應(yīng)單片機引腳
  31. sbit RWPIN   = P3^4;              //RW對應(yīng)單片機引腳
  32. sbit EPIN    = P3^3;               //E對應(yīng)單片機引腳
  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. /*==============================按鍵的標(biāo)志位=========================*/
  42. unsigned char flag=0;                                //要選擇的芯片型號在已定義字符數(shù)組中的序號
  43. unsigned char flag1=0;
  44. unsigned char flag2=0;                                //用來標(biāo)示某芯片各通道檢測均完好的標(biāo)志位
  45. unsigned char k=0;                                 //返回自動檢測后芯片序號在已定義的數(shù)組中的序號
  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ù)
  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ù)=======================*/
  233. unsigned char detect() //14腳芯片識別函數(shù)
  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;                                 //將芯片邏輯結(jié)果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;                                                        //測試結(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);                //定位寫字符
  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;                    //置當(dāng)前X位置為cx
  305.     CYPOS=cy;                    //置當(dāng)前Y位置為cy
  306.     for(;*s!=0;s++)                 //為零表示字符串結(jié)束,退出
  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++)                //為零表示字符串結(jié)束,退出
  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();                 //設(shè)置(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();                   //設(shè)置(CXPOS,CYPOS)字符位置的DDRAM地址
  337.     return lcdrd();                  //讀字符
  338. }
  339. //-------------------------------------------------------------------------------
  340. //以下charlcdpos,charcursornext,lcdreset為HD44780兼容芯片的液晶顯示控制器的
  341. //16字符X2行的SMC1602系列標(biāo)準(zhǔn)字符點陣型液晶顯示模塊的接口程序.
  342. //-------------------------------------------------------------------------------
  343. //子程序名稱:void charlcdpos(void).
  344. ……………………

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

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

評分

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

查看全部評分

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

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 色综合九九 | av三级| 粉嫩一区二区三区性色av | 亚洲精品福利在线 | 在线看亚洲 | 欧美视频福利 | 欧美一区在线视频 | 国产精品日韩欧美一区二区三区 | 九九视频网 | 亚洲协和影视 | 亚洲视频一区在线播放 | 久久久噜噜噜久久中文字幕色伊伊 | 欧美激情国产精品 | 亚洲精品一区二三区不卡 | 操人视频在线观看 | 少妇特黄a一区二区三区88av | 国产 日韩 欧美 在线 | www.99精品 | 欧美影院| 精久久久 | 国产成人精品久久二区二区91 | 成人在线免费观看 | 欧美成人一区二区三区片免费 | 一区二区国产精品 | 热99| 国产精品精品视频一区二区三区 | 99久久免费观看 | 91精品国产91久久综合桃花 | 9久9久9久女女女九九九一九 | 国产中文在线 | 在线国产一区 | 免费在线黄 | 久久精品视频免费观看 | 久久三级影院 | 国产一区二区三区在线 | 一区二区福利视频 | 免费同性女女aaa免费网站 | 中文二区 | 欧美一级黄色片免费观看 | 成人三级影院 | 久久国产精品一区二区三区 |