把所使用的每一种二进制代码状态都赋于特定的含义,表示一个特定的信号或对象,叫编码。如用四位二进制数的0000~1001这十种状太,分别表示0~9这十个十进制数码,称为8421编码。反过来把代码的特定含义翻译出来,称为译码。
计算机在处理各种文字符号或数码时,必须把这些信息进行二进制编码,在编码时所使用的第一种二进制代码状态都赋予了特定的含义,即表示一个确定的信号或者对象,实现这种功能的电路叫编码器,如用于键盘的BCD码,ASCII码编码器等。
单片机外围电路用译码器较多,所以在这节课我们主要与大家一起来学习下译码器的工作原理(购买了本站产品的朋友,在我们配套的多媒体教学光盘中有相关的教学内容,建议大家观看),把代码的含义‘翻译’成相应的输出信号,以表示其原意。其功能恰恰与编码器相反。
译码器可以将输入代码的状态翻译成相应的输出信号,以高、低电平的形式在各自的输出端口送出,以表示其意愿。译码器有多个输入端和多个输出端。假如输入的端个数为,每个输出端只能有两个状态,则输出端个数最多有2n个。常用译码器输入、输出端头数来称呼译码器,如3线-8线译码器,4线-10线译码器等。我们经常用到的74138就是一个三线-八线译码器,朋友们可以到我们网站的《芯片资料》频道下载74138的中文资料。
编码、译码的概念我们了解下,下面我们就来重点来讲一下三-八译码器的工作原理,这在我们51单片机的接口电路中也是经常用到的。
74138的工作原理如下图所示:
从上图可看出,74138有三个输入端:A0、A1、A2和八个输出端Q0~Q7。当输入端A0、A1、A2的编码为000时,译码器输出为Q0=0,而Q1~Q7=1。即Q0对应于A0、A1、A2为000状态,低电平有效。A0、A1、A2的另外7种组合见后面的真值表。
图中S1、S2、S3为使能控制端,起到控制译码器是否能进行译码的作用。只有S1为高电平,S2、S3均为低电平时,才能进行译码,否则不论输入羰输入为何值,每个输出端均为1。
下图是输入端A0、A1、A2为000,控制端S1=1、S1=0、S2=0的电平示意图(红色数字为端口电平),大家可按下图进行分析,也可以分析输出端另外七种组合时的输出情况。
74138 三线-八线译码器真值表:
(1) I. 初始化(Initialization)。从终端读入字符集大小n,以及n个字符和n个权值,建立哈夫曼树,并将它存放在文件hfmTree中. (2) E. 编码(Encoding)。利用已建立好的哈夫曼树(如不在内存,则从文件hfmTree中读入),对文件ToBeTran中的正文进行编码,然后将结果代码存(传输)到文件CodeFile中. (3) D. 译码(Decoding)。利用已建好的哈夫曼树,对传输到达的CodeFile中的数据代码进行译码,将译码结果存入文件TextFile中. (4) P. 印文件代码(Print)。将文件CodeFile以紧凑格式显示在终端上,每行50个代码。同时将此字符形式的编码文件写入文件CodePrin中。 (5) T. 印哈夫曼树(TreePrinting)。将已在内存中的哈夫曼树以直观的方式(树或凹入表的形式)显示在终端上,同时将此字符形式的哈夫曼树写入文件TreePrint中。 本文来源【学网】网站链接是
01100011111001010 译码:ACAADCABB
打字不易,如满意,望采纳。
答:逻辑结构类型和编辑逻辑结构有四种基本类型:集合结构、线性结构、树状结构和网络结构电文的编码和译码问题主要是利用的是线性结构和树形结构
编码--是将人熟知的物量作一个编制,以便计算机方便运算
译码--是将计算机计算结果,而人又不易识别的物量,翻译过来
求和--是做加法运算,计算机任何复杂的运算都是用加法完成(实现)的
漂移--电路在输入信号没有变化时,输出端发生不规则的变动
你程序停止运行自己调试啊,还要我帮你看嘛?又不是我写的我怎么会看……
但是哈夫曼编码可以不用构建树,会简单很多。这是我昨天写的代码:
#include string
#include vector
using std::string;
using std::vector;
struct Map{
int sym, freq;
string codeword;
};
vectorvectorMap column;
void huffmanCode(vectorMap map){
unsigned len = map.size();
if(len == 1u){
map[0].codeword = "0";
}else{
int i, j, t;
column = vectorvectorMap(len);
Map tran;
for(i = 0; i len; ++i){
tran.sym = -1;
tran.freq = map[i].freq;
column[i].push_back(tran);
tran.sym = map[i].sym;
column[i].push_back(tran);
}
vectorMap temp;
for(i = len - 2; i = 0; --i){
for(j = i + 1; j = i; --j){
for(t = 0; t j; ++t){
if(column[t][0].freq column[t + 1][0].freq){
temp = column[t];
column[t] = column[t + 1];
column[t + 1] = temp;
}
}
}
column[i][0].freq += column[i + 1][0].freq;
for(j = 1; j column[i].size(); ++j){
column[i][j].codeword = "0" + column[i][j].codeword;
}
for(j = 1; j column[i + 1].size(); ++j){
column[i + 1][j].codeword = "1" + column[i + 1][j].codeword;
column[i].push_back(column[i + 1][j]);
}
column.resize(i + 1);
}
for(i = 0; i len; ++i){
for(j = 1; j len + 1; ++j){
if(map[i].sym == column[0][j].sym){
map[i].codeword = column[0][j].codeword;
}
}
}
}
}