找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2159|回复: 1
收起左侧

51单片机的集成逻辑门测试仪的设计(电路+程序)

[复制链接]
ID:142045 发表于 2018-12-21 08:22 | 显示全部楼层 |阅读模式
电路原理图如下:
1.jpg
  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 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:418295 发表于 2018-12-22 01:05 来自手机 | 显示全部楼层
弄个压缩包就好了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表