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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2670|回復: 1
打印 上一主題 下一主題
收起左側

51單片機的集成邏輯門測試儀的設計(電路+程序)

[復制鏈接]
跳轉到指定樓層
樓主
電路原理圖如下:

  1. /*-----------------------------數字集成電路芯片測試儀C程序-清單------------------------------*/
  2. //修改時間:2018
  3. //-------------------------------------------------------------------------------------------
  4. #include<reg52.h>
  5. #include <intrins.h>
  6. #include <stdio.h>
  7. //這是頭文件必須包含
  8. /*==============================宏定義==============================*/
  9. #define LCD_data P0  //數據口
  10. #define M 4    //要測試的芯片好壞的個數
  11. #define N 8
  12. #define input1 P1   //用于檢測的引腳
  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);              //設置(CXPOS,CYPOS)字符位置的DDRAM地址
  22. void charcursornext(void);           //置字符位置為下一個有效位置子程序
  23. void lcdreset(void);                 //SMC1602系列液晶顯示控制器初始化子程序
  24. void delay3ms(void);                //延時3MS子程序
  25. void lcdwc(unsigned char c);          //送控制字到液晶顯示控制器子程序
  26. void lcdwd(unsigned char d);         //送控制字到液晶顯示控制器子程序
  27. unsigned char lcdrd(void);            //讀數據子程序
  28. void lcdwaitidle(void);               //忙檢測子程序
  29. unsigned char data CXPOS;           //列方向地址指針(用于CHARLCDPOS子程序)
  30. unsigned char data CYPOS;           //行方向地址指針(用于CHARLCDPOS子程序)
  31. sbit RSPIN   = P3^5;               //RS對應單片機引腳
  32. sbit RWPIN   = P3^4;              //RW對應單片機引腳
  33. sbit EPIN    = P3^3;               //E對應單片機引腳
  34. /*==============================宏定義==============================*/
  35. unsigned char detect(); //自動檢測引腳
  36. /*=============================定義按鍵=============================*/
  37. sbit key1=P3^0;  // 選擇檢測芯片
  38. sbit key2=P3^1;  // 確定選擇的芯片
  39. sbit key3=P3^2;  // 自動檢測
  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. /*==============================按鍵的標志位=========================*/
  43. unsigned char flag=0;    //要選擇的芯片型號在已定義字符數組中的序號
  44. unsigned char flag1=0;
  45. unsigned char flag2=0;    //用來標示某芯片各通道檢測均完好的標志位
  46. unsigned char k=0;     //返回自動檢測后芯片序號在已定義的數組中的序號
  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. //延時函數
  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腳芯片識別函數=======================*/
  234. unsigned char detect() //14腳芯片識別函數
  235. {
  236.   unsigned char i,output1,output2;
  237. //7474的檢測
  238.   P1=0xff;                          //初始化測試端口
  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的自動檢測
  253.   P1=0xff;                          //初始化測試端口
  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;     //將芯片邏輯結果input1通過&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;       //檢測7492時,先用繼電器江電源供電引腳切換
  277.   P1=0xff;                          //初始化測試端口
  278.   P2=0xff;
  279.   input1=0x3f;         //7492的檢測
  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;       //測試結束,將電源供電引腳切換回原狀態
  290.   return (6);
  291. }
  292. //-------------------------------------------------------------------------------
  293. void charfill(unsigned char c)          //整屏顯示A代表的ASCII字符子程序
  294. {   for(CXPOS=CYPOS=0;1;)
  295.     {   putchars(c);                //定位寫字符
  296.         charcursornext();            //置字符位置為下一個有效位置
  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;                    //置當前X位置為cx
  306.     CYPOS=cy;                    //置當前Y位置為cy
  307.     for(;*s!=0;s++)                 //為零表示字符串結束,退出
  308.     {   putchars(*s);               //寫1個字符
  309.         charcursornext();           //字符位置移到下一個
  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++)                //為零表示字符串結束,退出
  318.     {   putchars(*s);              //寫1個字符
  319.         charcursornext();          //字符位置移到下一個
  320.     }
  321. }
  322. //-------------------------------------------------------------------------------
  323. //子程序名稱:void putchar(unsigned char c).
  324. //功能:在(CXPOS,CYPOS)字符位置寫字符.
  325. //-------------------------------------------------------------------------------
  326. void putchars(unsigned char c)       //在(CXPOS,CYPOS)字符位置寫字符子程序
  327. {
  328.     charlcdpos();                 //設置(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();                   //設置(CXPOS,CYPOS)字符位置的DDRAM地址
  338.     return lcdrd();                  //讀字符
  339. }
  340. //-------------------------------------------------------------------------------
  341. //以下charlcdpos,charcursornext,lcdreset為HD44780兼容芯片的液晶顯示控制器的
  342. //16字符X2行的SMC1602系列標準字符點陣型液晶顯示模塊的接口程序.
  343. //-------------------------------------------------------------------------------
  344. //子程序名稱:void charlcdpos(void).
  345. //功能:設置(CXPOS,CYPOS)字符位置的DDRAM地址.
  346. //-------------------------------------------------------------------------------
  347. void charlcdpos(void)                //設置(CXPOS,CYPOS)字符位置的DDRAM地址
  348. {
  349.     CXPOS&=0X0f;                //X位置范圍(0到15)
  350.     CYPOS&=0X01;               //Y位置范圍(0到1)
  351.     if(CYPOS==0)                 //(第一行)X: 第0----15個字符
  352.         lcdwc(CXPOS|0x80);        //    DDRAM:   0----0FH
  353.     else                          //(第二行)X: 第0----15個字符
  354.         lcdwc(CXPOS|0xC0);        //    DDRAM:  40----4FH
  355. }
  356. //-------------------------------------------------------------------------------
  357. //子程序名稱:void charcursornext(void).
  358. //功能:置字符位置為下一個有效位置.
  359. //-------------------------------------------------------------------------------
  360. void charcursornext(void)             //置字符位置為下一個有效位置子程序
  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);                   //顯示模式設置第一次
  376.     delay3ms();                    //延時3MS
  377.     lcdwc(0x38);                   //顯示模式設置第二次
  378.     delay3ms();                    //延時3MS
  379.     lcdwc(0x38);                        //顯示模式設置第三次
  380.     delay3ms();                         //延時3MS
  381.     lcdwc(0x38);                        //顯示模式設置第四次
  382.     delay3ms();                         //延時3MS
  383.     lcdwc(0x08);                        //顯示關閉
  384.     lcdwc(0x01);                        //清屏
  385.     delay3ms();                         //延時3MS
  386.     lcdwc(0x06);                        //顯示光標移動設置
  387.     lcdwc(0x0C);                        //顯示開及光標設置
  388. }
  389. void delay3ms(void)                     //延時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為內部子程序.
  398. //-------------------------------------------------------------------------------
  399. //子程序名稱:void lcdwc(unsigned char c).
  400. //功能:送控制字到液晶顯示控制器.
  401. //-------------------------------------------------------------------------------
  402. void lcdwc(unsigned char c)             //送控制字到液晶顯示控制器子程序
  403. {
  404.     lcdwaitidle();                       //HD44780液晶顯示控制器忙檢測
  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. //功能:送數據到液晶顯示控制器.
  415. //-------------------------------------------------------------------------------
  416. void lcdwd(unsigned char d)             //送控制字到液晶顯示控制器子程序
  417. {
  418.     lcdwaitidle();                     //HD44780液晶顯示控制器忙檢測
  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. //功能:讀數據到液晶顯示控制器.
  429. //-------------------------------------------------------------------------------
  430. unsigned char lcdrd(void)               //讀數據子程序
  431. {   unsigned char d;
  432.     lcdwaitidle();                       //HD44780液晶顯示控制器忙檢測
  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. //功能:忙檢測.
  445. //-------------------------------------------------------------------------------
  446. void lcdwaitidle(void)                  //忙檢測子程序
  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控制器空閑,則退出檢測
  454.     EPIN=0;
  455. }
復制代碼


評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

沙發
ID:418295 發表于 2018-12-22 01:05 來自手機 | 只看該作者
弄個壓縮包就好了
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产高清视频在线观看 | 欧美综合一区 | 国产精品福利在线观看 | 婷婷激情综合 | 最新一级毛片 | 欧美成人精品激情在线观看 | 中文字幕日韩三级 | 欧州一区二区 | 国产中文区二幕区2012 | 视频一区二区在线 | 日韩高清电影 | 亚洲视频在线观看一区二区三区 | 欧美成人精品一区二区男人看 | 久久综合久色欧美综合狠狠 | 亚洲精品一区二区在线观看 | 91久久国产综合久久91精品网站 | 影音先锋男 | 欧美一级大片免费观看 | 欧美一级在线 | 在线免费观看一区二区 | 台湾佬伊人 | 日韩精品免费播放 | 黄网免费看 | 四虎成人在线播放 | 亚洲一区在线日韩在线深爱 | 97精品视频在线 | 超碰欧美 | 91网在线观看 | 国产在线观 | 成人性生交大片免费看中文带字幕 | 最新免费黄色网址 | 曰批视频在线观看 | 欧美国产视频 | 亚洲一级二级三级 | 91.色| 99久久日韩精品免费热麻豆美女 | 国产精品日韩欧美一区二区 | 美女二区 | 99视频入口 | 欧美人成在线视频 | 精品一区在线 |