数制与编码/数值转换-数字电路基础
|
数制的详细使用 1 十进制数Decimal Number在日常生活中我们表示数的多少用的是十进制数即 0123456789它遵循逢十进一借一当十的原则通常我们把计数符号的个数叫做基数十进制的基数就是十比如一个十进制数 5847=5*1000+8*100+4*10+7*1它的每一个数码都有一个系数1000100101这个系数叫做权或位权十进制数虽然非常符合我们的使用习惯但计算机中却无法采用因为计算机只能有两种状态0和1所以我们还得应用二进制数2 二进制数Binary Number二进制的基数为二 0和1它遵循的是逢二进一借一当二的进借位原则也就是当某位计数到两个数时就向高位进同时本位变为比如二进制数 1100=1*23+1*22+0*21+0*20二进制数只有0和1两个数正好代表了计算机中电路的两种工作状态所以它在计算机中被广泛应用下面是二进制的加法和乘法运算规则加法 0+0=01+0=0+1=11+1=10乘法 0*0=01*0=0*1=01*1=1二进制数虽然在计算机中处理很方便但当位数较多时就不容易记忆和书写了所以计算机中又有了十六进制数 3 十六进制数Hexadecimal Number十六进制也遵循两个规则一是有十六个基数即 0123456789ABCDEF另一个规则是逢十六进一借一当十六比如我们前面提到的 #0FFH就是一个十六进制数#--我们已经明白了它表示的是传递数的本身H叫数制简码它表示这个数是十六进制数为什么前面我在标题后面都加了英文注释相信大家也应该明白了吧这里随便提一下二进制简码B和十进制简码D通常是可以省略的我们以后的课程中用到的数都是这样写的那么0FFH这个十六进制数的表示方法是怎么样的呢用十进制就是表示0FFH=F*161+F*160即等于255大家也许会疑问这里的0到哪里去了呢原来在单片机中当我们用十六进制格式表示一个数时如果高位的数字为A-F时高位前面就得加上个0不然编译软件会出错就象#0FFH二进制之间的转换 十进制有使用比较习惯的特点二进制有易于表示和运算方便的特点十六进制又有表示位数较多的特点但有时我们常常要把十进制数转换成二进制数或十六进制数来处理把二进制数逆转换成十六进制数如何进行这种转换呢下面就举几个例子 1 十进制数与非十进制数之间的转换1 非十进制数转换为十进制数具体做法是将一个非十进制数按权展开成一个多项式每项是该位数码与相应权值之积把多项式按十进制的规则进行计算求和所得的结果就是该数的十进制形式 比如二进制数 1011B转换成十进制为1*23+0*22+1*21+1*20=8+2+1=11D再比如十六进制数FFH转换成十进制为255D2 十进制数转换为非十进制数十进制数转换为非十进制数时可将其分为整数部分和小数部分分别进行转换最后将结果合并为目的数为了简单我这里只讲整数部分的转换这种转换叫做除基取余法具体做法是用欲转换数制的基数去除十进制数的整数部分第一次除所得余数为目的数的最低位把得到的商再除以该基数所得余数为目的数的次低位依次类推继续上面的过程直至商位为0此时所得余数为目的数的最高位 53D转换成二进制数为53D=110101B 2 └532 └2612 └1302 └612 └302 └110 1 2 二进制数与十六进制数之间的转换四位二进制共有16种组合而这16种组合正好与十六进制数的16个基数一致所以每4位二进制数对应一位十六进制数我们只要把二进制数的整数部分自右向左每4位一组最后不足4位的用0补足小数部分自左向右每4位一组最后不足4位的在右面补0再将每4位二进制数对应的十六进制数写出即可相反如果将十六进制数转换为二进制数只需将每位十六进制数写成对应的4位二进制数即可 比如将 1101011B转换成十六进制数为D6H再比如将F0FH转换成二进制数为111100001111B
上面的表格就是二进制数十进制数和十六进制数之间的对应关系 三立即数的写法 在教程里我们讲到MOV R7#250和MOV R7#OFFH中#250和#0FFH原来是十进制数250D和十六进制数FFH的区别在单片机中通常我们把这个数称之为立即数那么如果我在编写指令时把立即数#0FFH写成二进制数即11111111或用十进制写法255是不是可以呢当然可以立即数既可以是二进制数也可以是十进制数或十六进制数讲到这里你应该明白了为什么我们前面的实验把#0FFH送到P3口会使P3.7-P3.0变为高电平这里再重复一遍那就是当用十六进制格式表示一个立即数时如果高位的数字为A-F时高位前面要加上个0请大家务必记住了这是一个常识问题可很多书上都不提所以很多人在做实验时往往会编译出错 这里简单地讲了一下关于数制以及二进制十进制和十六进制数的关系大家可以在以后的实际使用中领会。。。。。 下面讲一下常用到三个概念:
8位二进制数就称之为一个字节(BYTE)。1024个字节称为1K。这就要说到存储器。
*、存储器构造 存储器就是用来存放数据的地方。它是器件的物理状态即上面所讲的“0”和“1”两种电平的高低来存放数据的,也就是说,它存放的实际上是电平的高、低,而不是我们所习惯认为的123这样的数字。
让我们看图2。这是一个存储器的示意图:一个存储器就象一座大楼,一个楼里有八个房间(一个字节是8位正好对应的),每个房间就是用来存放“电荷”的0或1,电荷通过与它相连的电线传进来或释放掉,至于电荷在房间里是怎样存的,就不用我们操心了,你可以把电线想象成水管,房间里的电荷就象是水,那就好理解了,我们只要控制阀门就可使水流进/流出,这就是图3中的控制线的作用。存储器中的每个房间就是一个放数据的地方,我们称之为一个“单元”,每个房间的门牌号就是“地址”。我们只要学会使用控制线、地址的选择等就可以向存储器中写数据或读数据,至于存储器内部是如何分配和工作的我们使用者不需搞清。所以译码原理只作了解。
2、存储器译码 那么,我们怎样来控制各个单元的控制线呢?这个还不简单,把每个单元元的控制线都引到集成电路的外面不就行了吗?事情可没那么简单,一片27512存储器中有65536个单元,把每根线都引出来,这个集成电路就得有6万多个脚?不行,怎么办?要想法减少线的数量。 我们有一种方法称这为译码,简单介绍一下:一根线可以代表2种状态,2根线可以代表4种状态,3根线可以代表几种,256种状态又需要几根线代表?8种,8根线,所以65536种状态我们只需要16根线就可以代表了。
3、存储器的选片及总线的概念 至此,译码的问题解决了,让我们再来关注另外一个问题。送入每个单元的八根线是用从什么地方来的呢?它就是从计算机上接过来的,一般地,这八根线除了接一个存储器之外,还要接其它的器件,如图4所示。这样问题就出来了,这八根线既然不是存储器和计算机之间专用的,如果总是将某个单元接在这八根线上,就不好了,比如这个存储器单元中的数值是0FFH另一个存储器的单元是00H,那么这根线到底是处于高电平,还是低电平?所以我们要让它们分离。办法当然有,当外面的线接到集成电路的引脚进来后,不直接接到各单元去,中间再加一组开关(参考图4)就行了。平时我们让开关打开着,如果确实是要向这个存储器中写入数据,或要从存储器中读出数据,再让开关接通就行了。这组开关由三根引线选择:读控制端、写控制端和片选端。要将数据写入片中,先选中该片,然后发出写信号,开关就合上了,并将传过来的数据(电荷)写入片中。如果要读,先选中该片,然后发出读信号,开关合上,数据就被送出去了。注意图4,读和写信号同时还接入到另一个存储器,但是由于片选端不同,所以虽有读或写信号,但没有片选信号,所以另一个存储器不会“误会”而开门,造成冲突。那么会不同时选中两片芯片呢?只要是设计好的系统就不会。 从上面的介绍中我们已经看到,用来传递数据的八根线并不是专用的,而是很多器件大家共用的,所以我们称之为数据总线,总线英文名为BUS,总即公交车道,谁都可以走。而十六根地址线也是连在一起的,称之为地址总线。 |
返回单片机与电子制作网首页
版权所有(C):单片机与电子制作网站;若转载请注明出处www.wenqi89s51.com