欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標(biāo)題: 51單片機(jī)的集成邏輯門測(cè)試儀的設(shè)計(jì)(電路+程序) [打印本頁(yè)]

作者: 上善-若水    時(shí)間: 2018-12-21 08:22
標(biāo)題: 51單片機(jī)的集成邏輯門測(cè)試儀的設(shè)計(jì)(電路+程序)
電路原理圖如下:

  1. /*-----------------------------數(shù)字集成電路芯片測(cè)試儀C程序-清單------------------------------*/
  2. //修改時(shí)間:2018
  3. //-------------------------------------------------------------------------------------------
  4. #include<reg52.h>
  5. #include <intrins.h>
  6. #include <stdio.h>
  7. //這是頭文件必須包含
  8. /*==============================宏定義==============================*/
  9. #define LCD_data P0  //數(shù)據(jù)口
  10. #define M 4    //要測(cè)試的芯片好壞的個(gè)數(shù)
  11. #define N 8
  12. #define input1 P1   //用于檢測(cè)的引腳
  13. #define input2 P2
  14. /*======================液晶宏定義、初始化引腳=========================*/
  15. void delay(unsigned int z);
  16. void charfill(unsigned char c);        //整屏顯示A代表的ASCII字符子程序
  17. void putstrxy(unsigned char cx,unsigned char cy,unsigned char code *s);//在(cx,cy)字符位置寫字符串子程序
  18. void putstr(unsigned char code *s);    //定位寫字符串子程序
  19. void putchars(unsigned char c);       //在(CXPOS,CYPOS)字符位置寫字符子程序
  20. unsigned char getchars(void);         //CXPOS,CYPOS)字符位置讀字符子程序
  21. void charlcdpos(void);              //設(shè)置(CXPOS,CYPOS)字符位置的DDRAM地址
  22. void charcursornext(void);           //置字符位置為下一個(gè)有效位置子程序
  23. void lcdreset(void);                 //SMC1602系列液晶顯示控制器初始化子程序
  24. void delay3ms(void);                //延時(shí)3MS子程序
  25. void lcdwc(unsigned char c);          //送控制字到液晶顯示控制器子程序
  26. void lcdwd(unsigned char d);         //送控制字到液晶顯示控制器子程序
  27. unsigned char lcdrd(void);            //讀數(shù)據(jù)子程序
  28. void lcdwaitidle(void);               //忙檢測(cè)子程序
  29. unsigned char data CXPOS;           //列方向地址指針(用于CHARLCDPOS子程序)
  30. unsigned char data CYPOS;           //行方向地址指針(用于CHARLCDPOS子程序)
  31. sbit RSPIN   = P3^5;               //RS對(duì)應(yīng)單片機(jī)引腳
  32. sbit RWPIN   = P3^4;              //RW對(duì)應(yīng)單片機(jī)引腳
  33. sbit EPIN    = P3^3;               //E對(duì)應(yīng)單片機(jī)引腳
  34. /*==============================宏定義==============================*/
  35. unsigned char detect(); //自動(dòng)檢測(cè)引腳
  36. /*=============================定義按鍵=============================*/
  37. sbit key1=P3^0;  // 選擇檢測(cè)芯片
  38. sbit key2=P3^1;  // 確定選擇的芯片
  39. sbit key3=P3^2;  // 自動(dòng)檢測(cè)
  40. sbit key4=P3^6;  // 繼電器的切換
  41. unsigned char *name[]={"74LS00 Y=/AB","74LS04 Y=/A","74LS20 Y=/ABCD","74LS86 Y=/A⊕B","74LS74","74LS92","ERROR"};
  42. /*==============================按鍵的標(biāo)志位=========================*/
  43. unsigned char flag=0;    //要選擇的芯片型號(hào)在已定義字符數(shù)組中的序號(hào)
  44. unsigned char flag1=0;
  45. unsigned char flag2=0;    //用來(lái)標(biāo)示某芯片各通道檢測(cè)均完好的標(biāo)志位
  46. unsigned char k=0;     //返回自動(dòng)檢測(cè)后芯片序號(hào)在已定義的數(shù)組中的序號(hào)
  47. unsigned char code LS00[4][4]={
  48.                                 0x3f,0x3f,0x1b,0x1b,  //74ls00
  49.                                 0x24,0x24,0x24,0x24,
  50.                                 0x36,0x36,0x36,0x36,
  51.                 0x2d,0x2d,0x2d,0x2d,
  52.                    };
  53. unsigned char code LS04[2][4]={
  54.             0x2a,0x2a,0x2a,0x2a,  //74ls04
  55.              0x3f,0x3f,0x15,0x15,
  56.           };
  57. unsigned char code LS20[16][4]={
  58.                                 0x24,0x24,0x24,0x24,  //74ls20
  59.                                 0x25,0x25,0x25,0x25,
  60.                0x26,0x26,0x26,0x26,
  61.                0x27,0x27,0x27,0x27,
  62.                0x2c,0x2c,0x2c,0x2c,
  63.                     0x2d,0x2d,0x2d,0x2d,
  64.              0x2e,0x2e,0x2e,0x2e,
  65.               0x2f,0x2f,0x2f,0x2f,
  66.                  0x34,0x34,0x34,0x34,
  67.                     0x35,0x35,0x35,0x35,
  68.                   0x36,0x36,0x36,0x36,
  69.                  0x37,0x37,0x37,0x37,
  70.                    0x3c,0x3c,0x3c,0x3c,
  71.                     0x3d,0x3d,0x3d,0x3d,
  72.                    0x3e,0x3e,0x3e,0x3e,
  73.                   0x3f,0x3f,0x1f,0x1f,
  74.           };
  75. unsigned char code LS86[4][4]={
  76.                                 0x24,0x24,0x00,0x00,  //74ls86
  77.                                 0x36,0x36,0x36,0x36,
  78.                    0x2d,0x2d,0x2d,0x2d,
  79.                0x3f,0x3f,0x1b,0x1b,
  80.                      };

  81. unsigned char code IC[M][N]={
  82.                                0x24,0x24,0x24,0x24,0x3f,0x3f,0x1b,0x1b, //7400
  83.           0x3f,0x3f,0x15,0x15,0x3f,0x3f,0x15,0x15, //7404
  84.                                0x3f,0x3f,0x1f,0x1f,0x3f,0x3f,0x1f,0x1f, //7420
  85.                                0x3f,0x3f,0x1b,0x1b,0x3f,0x3f,0x1b,0x1b, //7486
  86.                   };
  87. void main()
  88. {  
  89. unsigned char i,output1,output2;
  90.     lcdreset();                         //液晶顯示控制器初始化
  91.     putstrxy(0,0,"PLEASE CHOOSE 74LS CHIP");  //顯示歡迎界面
  92.     while(1)
  93.         {  
  94.                 if(key1==0)
  95.                 {
  96.                  delay(100);
  97.                    if(key1==0)
  98.                    {
  99.                         if(flag==4)
  100.                        {
  101.                            flag=0;
  102.                        }
  103.                         flag++;
  104.                         switch(flag)
  105.       {
  106.                           case 1:charfill(' '); putstrxy(0,0,"NOW '74LS00'");break;
  107.              case 2:charfill(' '); putstrxy(0,0,"NOW '74LS04'");break;
  108.         case 3:charfill(' '); putstrxy(0,0,"NOW '74LS20'");break;
  109.         case 4:charfill(' '); putstrxy(0,0,"NOW '74LS86'");
  110.       }
  111.                    }
  112.                 }
  113.                 if(flag==1&&key2==0)
  114.                 {
  115.                    for(i=0;i<4;i++)
  116.                    {
  117.                          input1=LS00[i][0];
  118.                          input2=LS00[i][1];
  119.                           delay(5);
  120.                           output1=input1&0x3f;
  121.                           output2=input2&0x3f;
  122.                           if(output1!=LS00[i][2]||output2!=LS00[i][3])
  123.                              {
  124.                                   putstrxy(0,1,"SORRY,BAD CHIP!");
  125.                                   flag2=0;
  126.                                   break;
  127.                              }
  128.                           if(output1==LS00[i][2]&&output2==LS00[i][3])
  129.                              {
  130.                                   flag2++;
  131.                    }
  132.                 }
  133.                  if(flag2==4)
  134.                    {
  135.                           putstrxy(0,1,"OK,GOOD CHIP!");
  136.                           flag2=0;
  137.                    }
  138.                 }
  139.                if(flag==2&&key2==0)
  140.                 {
  141.                    for(i=0;i<2;i++)
  142.                    {
  143.                           input1=LS04[i][0];
  144.                           input2=LS04[i][1];
  145.                           delay(5);
  146.                           output1=input1&0x3f;
  147.                           output2=input2&0x3f;
  148.                           if(output1!=LS04[i][2]||output2!=LS04[i][3])
  149.                             {
  150.                                   putstrxy(0,1,"SORRY,BAD CHIP!");
  151.                                   flag2=0;
  152.                                   break;
  153.                             }
  154.                           if(output1==LS04[i][2]&&output2==LS04[i][3])
  155.                             {
  156.                                   flag2++;
  157.                             }
  158.                    }
  159.                      if(flag2==2)
  160.                        {
  161.                           putstrxy(0,1,"OK,GOOD CHIP!");
  162.                           flag2=0;
  163.                       }
  164.                  }
  165.                 if(flag==3&&key2==0)
  166.                 {
  167.                    for(i=0;i<16;i++)
  168.                    {
  169.                           input1=LS20[i][0];
  170.                           input2=LS20[i][1];
  171.                           delay(5);
  172.                           output1=input1&0x3f;
  173.                           output2=input2&0x3f;
  174.                           if(output1!=LS20[i][2]||output2!=LS20[i][3])
  175.                             {
  176.                                   putstrxy(0,1,"SORRY,BAD CHIP!");
  177.                                   flag2=0;
  178.                                   break;
  179.                             }
  180.                           if(output1==LS20[i][2]&&output2==LS20[i][3])
  181.                             {
  182.                                    flag2++;
  183.                             }
  184.                    }
  185.                       if(flag2==16)
  186.                         {
  187.                            putstrxy(0,1,"OK,GOOD CHIP!");
  188.                            flag2=0;
  189.                         }
  190.                  }
  191.                 if(flag==4&&key2==0)
  192.                  {
  193.                     for(i=0;i<4;i++)
  194.                     {
  195.                            input1=LS86[i][0];
  196.                            input2=LS86[i][1];
  197.                            delay(5);
  198.                            output1=input1&0x3f;
  199.                            output2=input2&0x3f;
  200.                            if(output1!=LS86[i][2]||output2!=LS86[i][3])
  201.                              {
  202.                                    putstrxy(0,1,"SORRY,BAD CHIP!");
  203.                                    flag2=0;
  204.                                    break;
  205.                              }
  206.                            if(output1==LS86[i][2]&&output2==LS86[i][3])
  207.                              {
  208.                                     flag2++;
  209.                              }
  210.                     }
  211.                        if(flag2==4)
  212.                          {
  213.                            putstrxy(0,1,"OK,GOOD CHIP!");
  214.                            flag2=0;
  215.                          }
  216.                 }
  217.                 if(key3==0)
  218.                 {
  219.                            k=detect();
  220.                            charfill(' ');
  221.                            putstrxy(0,0,"This is:");
  222.                            putstrxy(0,5,name[k]);
  223.                 }
  224.        }
  225. }
  226. //延時(shí)函數(shù)
  227. void delay(unsigned int z)
  228. {
  229. unsigned int x,y;
  230. for(x=z;x>0;x--)
  231.   for(y=110;y>0;y--);
  232. }
  233. /*============================14腳芯片識(shí)別函數(shù)=======================*/
  234. unsigned char detect() //14腳芯片識(shí)別函數(shù)
  235. {
  236.   unsigned char i,output1,output2;
  237. //7474的檢測(cè)
  238.   P1=0xff;                          //初始化測(cè)試端口
  239.   P2=0xff;
  240.   input1=0x3b;      
  241.   input2=0x39;
  242.   delay(5);
  243.   input1=0x3f;         //上升沿
  244.   input2=0x3d;
  245.   delay(5);
  246.   output1=input1&0x3f;
  247.   output2=input2&0x3f;
  248.   if(output1==0x1f&&output2==0x2d)
  249.   {
  250.         return (4);
  251.   }
  252.          //7400/04/20/86的自動(dòng)檢測(cè)
  253.   P1=0xff;                          //初始化測(cè)試端口
  254.   P2=0xff;
  255.   for(i=0;i<M;i++)
  256.   {
  257.     input1=IC[i][0];
  258.     input2=IC[i][1];
  259.     delay(5);
  260.     output1=input1&0x3f;     //將芯片邏輯結(jié)果input1通過(guò)&0x3f取出
  261.     output2=input2&0x3f;
  262.     if(output1==IC[i][2]&&output2==IC[i][3])
  263.     {
  264.          input1=IC[i][4];
  265.          input2=IC[i][5];
  266.          delay(5);
  267.          output1=input1&0x3f;  
  268.          output2=input2&0x3f;
  269.          if(output1==IC[i][6]&&output2==IC[i][7])
  270.          {
  271.          return i;
  272.          }
  273.     }
  274.   }
  275.    
  276.   key4=0;       //檢測(cè)7492時(shí),先用繼電器江電源供電引腳切換
  277.   P1=0xff;                          //初始化測(cè)試端口
  278.   P2=0xff;
  279.   input1=0x3f;         //7492的檢測(cè)
  280.   input2=0x3f;
  281.   delay(5);
  282.   output1=input1&0x3f;
  283.   output2=input2&0x3f;
  284.   if(output1==0x3f&&output2==0x01)
  285.   {
  286.       delay(100);key4=1;return (5);
  287.   }
  288.   delay(100);
  289.   key4=1;       //測(cè)試結(jié)束,將電源供電引腳切換回原狀態(tài)
  290.   return (6);
  291. }
  292. //-------------------------------------------------------------------------------
  293. void charfill(unsigned char c)          //整屏顯示A代表的ASCII字符子程序
  294. {   for(CXPOS=CYPOS=0;1;)
  295.     {   putchars(c);                //定位寫字符
  296.         charcursornext();            //置字符位置為下一個(gè)有效位置
  297.         if((CXPOS==0) && (CYPOS==0)) break;
  298.     }
  299. }
  300. //子程序名稱:void putstrxy(unsigned char cx,unsigned char cy,unsigned char *s).
  301. //功能:在(cx,cy)字符位置寫字符串.
  302. //-------------------------------------------------------------------------------
  303. void putstrxy(unsigned char cx,unsigned char cy,unsigned char code *s)
  304. {                                 //在(cx,cy)字符位置寫字符串子程序
  305.     CXPOS=cx;                    //置當(dāng)前X位置為cx
  306.     CYPOS=cy;                    //置當(dāng)前Y位置為cy
  307.     for(;*s!=0;s++)                 //為零表示字符串結(jié)束,退出
  308.     {   putchars(*s);               //寫1個(gè)字符
  309.         charcursornext();           //字符位置移到下一個(gè)
  310.     }
  311. }
  312. //-------------------------------------------------------------------------------
  313. //子程序名稱:void putstr(unsigned char *s).
  314. //功能:在(CXPOS,CYPOS)字符位置寫字符串.
  315. //-------------------------------------------------------------------------------
  316. void putstr(unsigned char code *s)     //定位寫字符串子程序
  317. {   for(;*s!=0;s++)                //為零表示字符串結(jié)束,退出
  318.     {   putchars(*s);              //寫1個(gè)字符
  319.         charcursornext();          //字符位置移到下一個(gè)
  320.     }
  321. }
  322. //-------------------------------------------------------------------------------
  323. //子程序名稱:void putchar(unsigned char c).
  324. //功能:在(CXPOS,CYPOS)字符位置寫字符.
  325. //-------------------------------------------------------------------------------
  326. void putchars(unsigned char c)       //在(CXPOS,CYPOS)字符位置寫字符子程序
  327. {
  328.     charlcdpos();                 //設(shè)置(CXPOS,CYPOS)字符位置的DDRAM地址
  329.     lcdwd(c);                    //寫字符
  330. }
  331. //-------------------------------------------------------------------------------
  332. //子程序名稱:unsigned char getchar(void).
  333. //功能:在(CXPOS,CYPOS)字符位置讀字符.
  334. //-------------------------------------------------------------------------------
  335. unsigned char getchars(void)          //在(CXPOS,CYPOS)字符位置讀字符子程序
  336. {
  337.     charlcdpos();                   //設(shè)置(CXPOS,CYPOS)字符位置的DDRAM地址
  338.     return lcdrd();                  //讀字符
  339. }
  340. //-------------------------------------------------------------------------------
  341. //以下charlcdpos,charcursornext,lcdreset為HD44780兼容芯片的液晶顯示控制器的
  342. //16字符X2行的SMC1602系列標(biāo)準(zhǔn)字符點(diǎn)陣型液晶顯示模塊的接口程序.
  343. //-------------------------------------------------------------------------------
  344. //子程序名稱:void charlcdpos(void).
  345. //功能:設(shè)置(CXPOS,CYPOS)字符位置的DDRAM地址.
  346. //-------------------------------------------------------------------------------
  347. void charlcdpos(void)                //設(shè)置(CXPOS,CYPOS)字符位置的DDRAM地址
  348. {
  349.     CXPOS&=0X0f;                //X位置范圍(0到15)
  350.     CYPOS&=0X01;               //Y位置范圍(0到1)
  351.     if(CYPOS==0)                 //(第一行)X: 第0----15個(gè)字符
  352.         lcdwc(CXPOS|0x80);        //    DDRAM:   0----0FH
  353.     else                          //(第二行)X: 第0----15個(gè)字符
  354.         lcdwc(CXPOS|0xC0);        //    DDRAM:  40----4FH
  355. }
  356. //-------------------------------------------------------------------------------
  357. //子程序名稱:void charcursornext(void).
  358. //功能:置字符位置為下一個(gè)有效位置.
  359. //-------------------------------------------------------------------------------
  360. void charcursornext(void)             //置字符位置為下一個(gè)有效位置子程序
  361. {
  362.     CXPOS++;                     //字符位置加1
  363.     if(CXPOS>15)                  //字符位置CXPOS>15表示要換行
  364.     {   CXPOS=0;                 //置列位置為最左邊
  365.         CYPOS++;                 //行位置加1
  366.         CYPOS&=0X1;             //字符位置CYPOS的有效范圍為(0到1)
  367.     }
  368. }
  369. //-------------------------------------------------------------------------------
  370. //子程序名稱:void lcdreset(void).
  371. //功能:液晶顯示控制器初始化.
  372. //-------------------------------------------------------------------------------
  373. void lcdreset(void)                   //SMC1602系列液晶顯示控制器初始化子程序
  374. {                                 //1602的顯示模式字為0x38
  375.     lcdwc(0x38);                   //顯示模式設(shè)置第一次
  376.     delay3ms();                    //延時(shí)3MS
  377.     lcdwc(0x38);                   //顯示模式設(shè)置第二次
  378.     delay3ms();                    //延時(shí)3MS
  379.     lcdwc(0x38);                        //顯示模式設(shè)置第三次
  380.     delay3ms();                         //延時(shí)3MS
  381.     lcdwc(0x38);                        //顯示模式設(shè)置第四次
  382.     delay3ms();                         //延時(shí)3MS
  383.     lcdwc(0x08);                        //顯示關(guān)閉
  384.     lcdwc(0x01);                        //清屏
  385.     delay3ms();                         //延時(shí)3MS
  386.     lcdwc(0x06);                        //顯示光標(biāo)移動(dòng)設(shè)置
  387.     lcdwc(0x0C);                        //顯示開及光標(biāo)設(shè)置
  388. }
  389. void delay3ms(void)                     //延時(shí)3MS子程序
  390. { unsigned char i,j,k;
  391.   for(i=0;i<3;i++)
  392.     for(j=0;j<64;j++)
  393.       for(k=0;k<51;k++);
  394. }
  395. //-------------------------------------------------------------------------------
  396. //以下lcdwc,lcdwd,lcdrd為HD44780兼容芯片的MCS51模擬口線方式的基本子程序,
  397. //lcdwaitidle為內(nèi)部子程序.
  398. //-------------------------------------------------------------------------------
  399. //子程序名稱:void lcdwc(unsigned char c).
  400. //功能:送控制字到液晶顯示控制器.
  401. //-------------------------------------------------------------------------------
  402. void lcdwc(unsigned char c)             //送控制字到液晶顯示控制器子程序
  403. {
  404.     lcdwaitidle();                       //HD44780液晶顯示控制器忙檢測(cè)
  405.     RSPIN=0;                         //RS=0 RW=0 E=高電平
  406.     RWPIN=0;
  407.     P0=c;
  408.     EPIN=1;
  409.     _nop_();
  410.     EPIN=0;
  411. }
  412. //-------------------------------------------------------------------------------
  413. //子程序名稱:void lcdwd(unsigned char d).
  414. //功能:送數(shù)據(jù)到液晶顯示控制器.
  415. //-------------------------------------------------------------------------------
  416. void lcdwd(unsigned char d)             //送控制字到液晶顯示控制器子程序
  417. {
  418.     lcdwaitidle();                     //HD44780液晶顯示控制器忙檢測(cè)
  419.     RSPIN=1;                        //RS=1 RW=0 E=高電平
  420.     RWPIN=0;
  421.     P0=d;
  422.     EPIN=1;
  423.     _nop_();
  424.     EPIN=0;
  425. }
  426. //-------------------------------------------------------------------------------
  427. //子程序名稱:unsigned char lcdrd(void).
  428. //功能:讀數(shù)據(jù)到液晶顯示控制器.
  429. //-------------------------------------------------------------------------------
  430. unsigned char lcdrd(void)               //讀數(shù)據(jù)子程序
  431. {   unsigned char d;
  432.     lcdwaitidle();                       //HD44780液晶顯示控制器忙檢測(cè)
  433.     P0=0xff;
  434.     RSPIN=1;                          //RS=1 RW=1 E=高電平
  435.     RWPIN=1;
  436.     EPIN=1;
  437.     _nop_();
  438.     d=P0;
  439.     EPIN=0;
  440.     return d;
  441. }
  442. //-------------------------------------------------------------------------------
  443. //子程序名稱:void lcdwaitidle(void).
  444. //功能:忙檢測(cè).
  445. //-------------------------------------------------------------------------------
  446. void lcdwaitidle(void)                  //忙檢測(cè)子程序
  447. {   unsigned char i;
  448.     P0=0xff;
  449.     RSPIN=0;                        //RS=0 RW=1 E=高電平
  450.     RWPIN=1;
  451.     EPIN=1;
  452.     for(i=0;i<20;i++)
  453.         if((P0&0x80) == 0) break;       //D7=0 表示LCD控制器空閑,則退出檢測(cè)
  454.     EPIN=0;
  455. }
復(fù)制代碼



作者: 845209119    時(shí)間: 2018-12-22 01:05
弄個(gè)壓縮包就好了




歡迎光臨 (http://m.raoushi.com/bbs/) Powered by Discuz! X3.1