什么是编码?

就像取名字,用来区分一系列不同的事物,但是这个名字不是用汉语或者其他语言取得,而是使用的二进制代码
在逻辑电路中,信号都是以高低电平的形式给出的,编码器(Encoder)的作用就是,将输入的每一个高低电平信号编成对应的二级制代码。

介绍一个实实在在的编码器

这次咱们以一个3位二进制编码器为例,简单分析一下它。

目标

74HC148,一个非常常见的CMOS 8-3 线优先编码器。
这里是一个中文版的数据手册,大家可以看看:https://www.semiee.com/file/Siyom/Siyom-74HC148.pdf
image.png

基本特点

这里的编码器,其外形就是咱们常见的那种16引脚的芯片:
image.png
这芯片,有8个线性输入端,3个输出信号端,这也是为什么叫她8-3编码器。
image.png
I 0— I 7为输入信号, A2,A1,A0为三位二进制编码输出信号, EI是使能输入端, EO使能输出端, G S为片优先编码输出端。
image.png
它的真值表如下:
image.png
真值表的逻辑方程可以这样编辑:

A2 =(I4+I5+I6+I7)EI A1 = (I2I4I5+I3I4I5+I6+7)· EI A0 = (I1I2I4I6+I3I4I6+I5I6+I7)· EI

当使能输入 EI=1时,所有输出端群被封锁在高电平。
当使能输入EI=0时,允许编码,在I0~I7输入中,输入 I7优先级最高,其余依次为: I6,I5,I4,I3,I2,I1,I0等级排列。
使能输出端EO的逻辑方程为:

EO =I0· I1· I2· I3· I4· I5· 67· EI,

此逻辑表达式表明当所有的编码输入端都是高电平(即没有编码输入),且EI=0时,EO才为零;
表明EO的低电平输出信号表示“电路工作,但无编码输入。
扩展片优先编码输出端 G S的逻辑方程为:

GS = (I0+I1+I2+I3+I4+I5+I6+I7)· EI,

此时表明只要任何一个编码输入段有低电平信号输入,且EI=0,GS即为低电平。
GS的低电平输出信号表示“电路工作,而且有编码输入。”(GS=0)

说了这多,这个编码器内部究竟是什么样子的呢?
image.png
没错,就是这样,真的是上学时候的噩梦,好在考试不考,哈哈哈哈哈哈!
最后给一段代码,感兴趣的朋友可以去验证以下:

//在arudino 中调试通过 //将A0,A1,A2,接入IO 4,7,8 //如数据不稳定可以将digitalRead改为digitalReadt程序消抖进行对比。 void setup() { // put your setup code here, to run once: Serial.begin(9600);

define HC148A0 8

pinMode (4, INPUT); pinMode (7, INPUT); pinMode (8, INPUT); } void loop() {

int a = 0; Serial.print(“ A2 “); Serial.print(“A1”); Serial.print(“ A0 “); int n8 = digitalRead(8); delay(2); int n7 = digitalRead(7); delay(2); int n4 = digitalRead(4); bitWrite(a, 0, n4); bitWrite(a, 1, n7); bitWrite(a, 2, n8); Serial.print(n8, BIN); Serial.print(“ “); Serial.print(n7, BIN); Serial.print(“ “); Serial.print(n4, BIN);Serial.print(“ = “); Serial.println(a);

delay(100); } bool digitalReadt(int testpin) { bool digval = digitalRead(testpin); //消抖 delay(5); while (digval != digitalRead(testpin)) { delay(5); digval = digitalRead(testpin); delay(5); } return digval; }