野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 14315|回复: 0

简单数字电路测试

[复制链接]
发表于 2020-6-3 22:13:37 | 显示全部楼层 |阅读模式
本帖最后由 ID-v9L2fa 于 2020-6-3 22:15 编辑

proteus8.9+stm32f103对74HC00(四与非门)、74HC02(四或非门)、74HC04(六非门)进行简单测试
一、设计要求:
主芯片:STM32F103R6
IC测试座:DIP18 (18个引脚)
有四只开关:分别为“向上选择”、“向下选择”、“确定”、“退出”
用一个LCD12864显示操作和结果的界面
二、展示内容:
LCD12864显示内容:
第一屏:见图  显示可检测的器件的列表,被选中的型号反白显示
第二屏:见图  标题为被检测的器件的型号+testing…,下面有两行,第一行显示器件是否完好,如果有故障,在第二排显示是哪个部件出现故障。最后一排有状态显示,三种内容,没有测量时显示“开始测量”,正在测量时显示“测量中…”,测量完成后,显示“测量结束”
三、操作说明:
(1)开机,显示第一屏
(2)按“向上选择”和“向下选择”,可以依次选中列表中的器件,再按下“确认”键,可以选中该器件,进入第二屏,最下显示“开始测量”
(3)按“确认”键,开始测量,测量完成后,最下显示“测量结束”,并把结果在第二行和第三行的提示后显示。
(4)按“退出”键,回到第一屏。
四、测试芯片:
(1)74HC00         四与非门
(2)74HC02         四或非门
(3)74HC04         六非门
五、效果展示:


部分代码展示(检测函数)(因水平有限,且半夜赶出来的,未优化代码,欢迎大佬指正哈)
  1. u16 pinout[3][4]={{0xE493,0xEDB7,0xF6DB,0xDB6F},{0xE493,0xD24B,0xC927,0xDB6F},{0xEAAB,0xD557,0xEAAB,0xD557}};
  2. int test[16];
  3. void testing(int dis)    //该函数为设置引脚电位函数
  4. {
  5. int i,flage;
  6. for(flage=0;flage<4;flage++)
  7. {
  8.   GPIO_Write(GPIOB,pinout[dis][flage]);
  9.   for(i=0;i<16;i++)
  10.   {
  11.    if(i<8)
  12.    {
  13.     IC74HC251_OE1_0;
  14.     IC74HC251_OE2_1;
  15.    }
  16.    else
  17.    {
  18.     IC74HC251_OE1_1;
  19.     IC74HC251_OE2_0;
  20.    }
  21.    if(i==0 || i==2 || i==4 ||i==6 || i==8 || i==10 || i==12 || i==14)
  22.    {
  23.     IC74HC251_S0_0;
  24.    }
  25.    else
  26.    {
  27.     IC74HC251_S0_1;
  28.    }
  29.    if(i==0 || i==1 || i==4 ||i==5 || i==8 || i==9 || i==12 || i==13)
  30.    {
  31.     IC74HC251_S1_0;
  32.    }
  33.    else
  34.    {
  35.     IC74HC251_S1_1;
  36.    }
  37.    if(i==0 || i==1 || i==2 ||i==3 || i==8 || i==9 || i==10 || i==11)
  38.    {
  39.     IC74HC251_S2_0;
  40.    }
  41.    else
  42.    {
  43.     IC74HC251_S2_1;
  44.    }
  45.    test[i]=GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0);
  46.    }
  47.   compare(dis,flage);
  48. }
  49. }
  50. int error[4][16];
  51. int errpart[6];
  52. void compare(int dis,int flage)     //该函数为比对函数
  53. {
  54. int i,j,winflage=0,position=80;
  55. u16 n=pinout[dis][flage];
  56. int a[16];
  57. for (i = 0; i != 16; ++i)
  58. {
  59.   a[i] = n % 2;
  60.   n /= 2;
  61. }
  62. for(i=0;i<16;i++)
  63. {
  64.   if(test[i]==a[i])
  65.   {
  66.    error[flage][i]=0;
  67.   }
  68.   else
  69.   {
  70.    error[flage][i]=1;
  71.   }
  72. }
  73. if(flage==3)
  74. {
  75.   for(i=0;i<4;i++)
  76.   {
  77.    for(j=0;j<16;j++)
  78.    {
  79.     if(error[i][j]==0)
  80.     {
  81.      winflage++;
  82.      if(winflage==64)
  83.      {
  84.       LCD_DIS_Char(3,50,"TRUE",MIDDLE,0);
  85.      }
  86.     }
  87.     else
  88.     {
  89.      if(dis==2)
  90.      {
  91.       if(j<5 && j>2){errpart[0]=1;}
  92.       if(j<7 && j>4){errpart[1]=1;}
  93.       if(j<9 && j>6){errpart[2]=1;}
  94.       if(j<11 && j>8){errpart[3]=1;}
  95.       if(j<13 && j>10){errpart[4]=1;}
  96.       if(j<15 && j>12){errpart[5]=1;}
  97.      }
  98.      else
  99.      {
  100.       if(j<6 && j>2){errpart[0]=1;}
  101.       if(j<9 && j>5){errpart[1]=1;}
  102.       if(j<12 && j>8){errpart[2]=1;}
  103.       if(j<15 && j>11){errpart[3]=1;}
  104.      }
  105.     }
  106.    }
  107.   }
  108.   if(winflage!=64){
  109.    LCD_DIS_Char(4,50,"FLASE",MIDDLE,0);
  110.    j=0;
  111.    for(i=0;i<6;i++)
  112.    {
  113.     if(errpart[i]==1)
  114.     {
  115.      position=position+(i-j)*8;  
  116.      LCD_DIS_Number(6,position,i+1,MIDDLE);
  117.     }else
  118.      j++;
  119.    }
  120.   }
  121. }
  122. }
复制代码
完整仿真及其代码:
proteus stm32 74HC00(02、04)简单数字电路测试.zip (7.56 MB, 下载次数: 8)

ps:要是下载不了,可以去这两个地方看
51单片机论坛:http://www.51hei.com/bbs/dpj-189295-1.html
csdn:https://editor.csdn.net/md/?articleId=106525336



回复

使用道具 举报

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

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-5-30 20:08 , Processed in 0.042714 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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