|
該仿真設(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仿真工程文件可到本帖附件中下載)
集成電路芯片測試儀.png (21.62 KB, 下載次數(shù): 77)
下載附件
2021-11-15 14:36 上傳
單片機源程序如下:
- /*------數(shù)字集成電路芯片測試儀C51程序僅供參考------------------------------*/
- //-------------------------------------------------------------------------------------------
- #include<reg52.h>
- #include <intrins.h>
- #include <stdio.h>
- //這是頭文件必須包含
- /*==============================宏定義==============================*/
- #define LCD_data P0 //數(shù)據(jù)口
- #define M 4 //要測試的芯片好壞的個數(shù)
- #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); //設(shè)置(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); //讀數(shù)據(jù)子程序
- void lcdwaitidle(void); //忙檢測子程序
- unsigned char data CXPOS; //列方向地址指針(用于CHARLCDPOS子程序)
- unsigned char data CYPOS; //行方向地址指針(用于CHARLCDPOS子程序)
- sbit RSPIN = P3^5; //RS對應(yīng)單片機引腳
- sbit RWPIN = P3^4; //RW對應(yīng)單片機引腳
- sbit EPIN = P3^3; //E對應(yīng)單片機引腳
- /*==============================宏定義==============================*/
- 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"};
- /*==============================按鍵的標(biāo)志位=========================*/
- unsigned char flag=0; //要選擇的芯片型號在已定義字符數(shù)組中的序號
- unsigned char flag1=0;
- unsigned char flag2=0; //用來標(biāo)示某芯片各通道檢測均完好的標(biāo)志位
- unsigned char k=0; //返回自動檢測后芯片序號在已定義的數(shù)組中的序號
- 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]);
- }
- }
- }
- //延時函數(shù)
- void delay(unsigned int z)
- {
- unsigned int x,y;
- for(x=z;x>0;x--)
- for(y=110;y>0;y--);
- }
- /*============================14腳芯片識別函數(shù)=======================*/
- unsigned char detect() //14腳芯片識別函數(shù)
- {
- 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; //將芯片邏輯結(jié)果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; //測試結(jié)束,將電源供電引腳切換回原狀態(tài)
- 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; //置當(dāng)前X位置為cx
- CYPOS=cy; //置當(dāng)前Y位置為cy
- for(;*s!=0;s++) //為零表示字符串結(jié)束,退出
- { putchars(*s); //寫1個字符
- charcursornext(); //字符位置移到下一個
- }
- }
- //-------------------------------------------------------------------------------
- //子程序名稱:void putstr(unsigned char *s).
- //功能:在(CXPOS,CYPOS)字符位置寫字符串.
- //-------------------------------------------------------------------------------
- void putstr(unsigned char code *s) //定位寫字符串子程序
- { for(;*s!=0;s++) //為零表示字符串結(jié)束,退出
- { putchars(*s); //寫1個字符
- charcursornext(); //字符位置移到下一個
- }
- }
- //-------------------------------------------------------------------------------
- //子程序名稱:void putchar(unsigned char c).
- //功能:在(CXPOS,CYPOS)字符位置寫字符.
- //-------------------------------------------------------------------------------
- void putchars(unsigned char c) //在(CXPOS,CYPOS)字符位置寫字符子程序
- {
- charlcdpos(); //設(shè)置(CXPOS,CYPOS)字符位置的DDRAM地址
- lcdwd(c); //寫字符
- }
- //-------------------------------------------------------------------------------
- //子程序名稱:unsigned char getchar(void).
- //功能:在(CXPOS,CYPOS)字符位置讀字符.
- //-------------------------------------------------------------------------------
- unsigned char getchars(void) //在(CXPOS,CYPOS)字符位置讀字符子程序
- {
- charlcdpos(); //設(shè)置(CXPOS,CYPOS)字符位置的DDRAM地址
- return lcdrd(); //讀字符
- }
- //-------------------------------------------------------------------------------
- //以下charlcdpos,charcursornext,lcdreset為HD44780兼容芯片的液晶顯示控制器的
- //16字符X2行的SMC1602系列標(biāo)準(zhǔn)字符點陣型液晶顯示模塊的接口程序.
- //-------------------------------------------------------------------------------
- //子程序名稱:void charlcdpos(void).
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼
所有資料51hei附件下載:
數(shù)字集成電路芯片測試儀.rar
(75.57 KB, 下載次數(shù): 15)
2021-11-15 14:31 上傳
點擊文件名下載附件
10 下載積分: 黑幣 -5
|
評分
-
查看全部評分
|