電路原理圖如下:
1.jpg (265.72 KB, 下載次數: 68)
下載附件
2018-12-21 08:22 上傳
- /*-----------------------------數字集成電路芯片測試儀C程序-清單------------------------------*/
- //修改時間:2018
- //-------------------------------------------------------------------------------------------
- #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).
- //功能:設置(CXPOS,CYPOS)字符位置的DDRAM地址.
- //-------------------------------------------------------------------------------
- void charlcdpos(void) //設置(CXPOS,CYPOS)字符位置的DDRAM地址
- {
- CXPOS&=0X0f; //X位置范圍(0到15)
- CYPOS&=0X01; //Y位置范圍(0到1)
- if(CYPOS==0) //(第一行)X: 第0----15個字符
- lcdwc(CXPOS|0x80); // DDRAM: 0----0FH
- else //(第二行)X: 第0----15個字符
- lcdwc(CXPOS|0xC0); // DDRAM: 40----4FH
- }
- //-------------------------------------------------------------------------------
- //子程序名稱:void charcursornext(void).
- //功能:置字符位置為下一個有效位置.
- //-------------------------------------------------------------------------------
- void charcursornext(void) //置字符位置為下一個有效位置子程序
- {
- CXPOS++; //字符位置加1
- if(CXPOS>15) //字符位置CXPOS>15表示要換行
- { CXPOS=0; //置列位置為最左邊
- CYPOS++; //行位置加1
- CYPOS&=0X1; //字符位置CYPOS的有效范圍為(0到1)
- }
- }
- //-------------------------------------------------------------------------------
- //子程序名稱:void lcdreset(void).
- //功能:液晶顯示控制器初始化.
- //-------------------------------------------------------------------------------
- void lcdreset(void) //SMC1602系列液晶顯示控制器初始化子程序
- { //1602的顯示模式字為0x38
- lcdwc(0x38); //顯示模式設置第一次
- delay3ms(); //延時3MS
- lcdwc(0x38); //顯示模式設置第二次
- delay3ms(); //延時3MS
- lcdwc(0x38); //顯示模式設置第三次
- delay3ms(); //延時3MS
- lcdwc(0x38); //顯示模式設置第四次
- delay3ms(); //延時3MS
- lcdwc(0x08); //顯示關閉
- lcdwc(0x01); //清屏
- delay3ms(); //延時3MS
- lcdwc(0x06); //顯示光標移動設置
- lcdwc(0x0C); //顯示開及光標設置
- }
- void delay3ms(void) //延時3MS子程序
- { unsigned char i,j,k;
- for(i=0;i<3;i++)
- for(j=0;j<64;j++)
- for(k=0;k<51;k++);
- }
- //-------------------------------------------------------------------------------
- //以下lcdwc,lcdwd,lcdrd為HD44780兼容芯片的MCS51模擬口線方式的基本子程序,
- //lcdwaitidle為內部子程序.
- //-------------------------------------------------------------------------------
- //子程序名稱:void lcdwc(unsigned char c).
- //功能:送控制字到液晶顯示控制器.
- //-------------------------------------------------------------------------------
- void lcdwc(unsigned char c) //送控制字到液晶顯示控制器子程序
- {
- lcdwaitidle(); //HD44780液晶顯示控制器忙檢測
- RSPIN=0; //RS=0 RW=0 E=高電平
- RWPIN=0;
- P0=c;
- EPIN=1;
- _nop_();
- EPIN=0;
- }
- //-------------------------------------------------------------------------------
- //子程序名稱:void lcdwd(unsigned char d).
- //功能:送數據到液晶顯示控制器.
- //-------------------------------------------------------------------------------
- void lcdwd(unsigned char d) //送控制字到液晶顯示控制器子程序
- {
- lcdwaitidle(); //HD44780液晶顯示控制器忙檢測
- RSPIN=1; //RS=1 RW=0 E=高電平
- RWPIN=0;
- P0=d;
- EPIN=1;
- _nop_();
- EPIN=0;
- }
- //-------------------------------------------------------------------------------
- //子程序名稱:unsigned char lcdrd(void).
- //功能:讀數據到液晶顯示控制器.
- //-------------------------------------------------------------------------------
- unsigned char lcdrd(void) //讀數據子程序
- { unsigned char d;
- lcdwaitidle(); //HD44780液晶顯示控制器忙檢測
- P0=0xff;
- RSPIN=1; //RS=1 RW=1 E=高電平
- RWPIN=1;
- EPIN=1;
- _nop_();
- d=P0;
- EPIN=0;
- return d;
- }
- //-------------------------------------------------------------------------------
- //子程序名稱:void lcdwaitidle(void).
- //功能:忙檢測.
- //-------------------------------------------------------------------------------
- void lcdwaitidle(void) //忙檢測子程序
- { unsigned char i;
- P0=0xff;
- RSPIN=0; //RS=0 RW=1 E=高電平
- RWPIN=1;
- EPIN=1;
- for(i=0;i<20;i++)
- if((P0&0x80) == 0) break; //D7=0 表示LCD控制器空閑,則退出檢測
- EPIN=0;
- }
復制代碼
|