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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2851|回復: 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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 午夜精品久久 | 韩国精品一区 | 日韩高清中文字幕 | 国产区精品在线观看 | 一二三区在线 | 亚洲精品久久久久中文字幕二区 | 欧美激情一区二区三区 | 日韩一区精品 | 国产精品久久久久久久久免费丝袜 | 久久中文字幕一区 | 一区二区三区高清不卡 | 免费国产视频 | 欧美性高潮 | 免费激情网站 | 天天操夜夜骑 | 亚洲激情综合网 | 成人免费网站 | 精品国产免费人成在线观看 | 久久久妇女国产精品影视 | 91天堂网| 国产精品国产精品国产专区不片 | 国产精品成av人在线视午夜片 | 国产精品入口久久 | 国产精品96久久久久久 | 一区二区三区电影网 | 成人av大全| 夜夜精品浪潮av一区二区三区 | 亚洲精品乱码8久久久久久日本 | 日韩视频一区在线观看 | 97精品超碰一区二区三区 | 国产精品欧美一区二区三区 | 亚洲国产精品久久久久婷婷老年 | 色婷婷综合久久久中字幕精品久久 | 欧美三级电影在线播放 | 成人免费精品视频 | 免费一级黄色电影 | 国产一区二区在线免费 | av综合站| 一区二区三区亚洲 | 免费国产一区二区视频 | 天天草天天操 |