返回列表 发帖

数制与编码/数值转换-数字电路基础

  • 概述
    计算机最基本的功能就是对数进行计算和处理,每一个数在机器中是用器件的物理状态来表示的,计算机是用器件的两种物理状态来表示数的变化,即利用器件的高电平“1”和器件的低电平“0”这两种状态;不同的0和1组合就可表示不同的数或值。如:10001000就表示88H;而计算机在对数进行处理时只认0和1,所以就有以下的不同数制的转换。
  • 数制的分类
    1。基数:指某一种数制所用到的数码的个数,如:N=M.r;r就表示基数,当r取不同的值时,就形成不同的进制数,最常用的有十进制数(r=10),十六进制数如上88H(r=16),八进制(R=8),计算机中使用的二进制(r=2).
    2。十进制数
       生活中我们常用它;如:10元钱、55路车等;它的基数为10,即数码个数有十个,10个不同的数:0、1、2、3、4、5、6、7、8、9;
        十进制计数制的规律:有0-9十个不同的数码;R=10,在加减运算中,采用“逢十进一”和“借一当十”的规则。
    3。十六进制数
       R=16,表示有十六个数码组成,即:0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F;“逢十六进一”和”借一当十六“。
    4。二进制数
       R=2,只能取两个数码,即:0、1;“逢二进一”和“借一当二”。
  • 数制的详细使用

    1 十进制数Decimal Number

    在日常生活中我们表示数的多少用的是十进制数即0123456789它遵循逢十进一借一当十的原则通常我们把计数符号的个数叫做基数十进制的基数就是十

    比如一个十进制数5847=5*1000+8*100+4*10+7*1它的每一个数码都有一个系数1000100101这个系数叫做权或位权十进制数虽然非常符合我们的使用习惯但计算机中却无法采用因为计算机只能有两种状态01所以我们还得应用二进制数

    2 二进制数Binary Number

    二进制的基数为二01它遵循的是逢二进一借一当二的进借位原则也就是当某位计数到两个数时就向高位进同时本位变为

    比如二进制数1100=1*23+1*22+0*21+0*20二进制数只有01两个数正好代表了计算机中电路的两种工作状态所以它在计算机中被广泛应用下面是二进制的加法和乘法运算规则

    加法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转换成十进制为255D

    2 十进制数转换为非十进制数

    十进制数转换为非十进制数时可将其分为整数部分和小数部分分别进行转换最后将结果合并为目的数为了简单我这里只讲整数部分的转换这种转换叫做除基取余法具体做法是用欲转换数制的基数去除十进制数的整数部分第一次除所得余数为目的数的最低位把得到的商再除以该基数所得余数为目的数的次低位依次类推继续上面的过程直至商位为0此时所得余数为目的数的最高位

    比如将十进制数53D转换成二进制数为53D=110101B

    253

    2261

    2130

    261

    230

    211

    0 1

    2 二进制数与十六进制数之间的转换

    四位二进制共有16种组合而这16种组合正好与十六进制数的16个基数一致所以每4位二进制数对应一位十六进制数我们只要把二进制数的整数部分自右向左每4位一组最后不足4位的用0补足小数部分自左向右每4位一组最后不足4位的在右面补0再将每4位二进制数对应的十六进制数写出即可相反如果将十六进制数转换为二进制数只需将每位十六进制数写成对应的4位二进制数即可

    比如将1101011B转换成十六进制数为D6H再比如将F0FH转换成二进制数为111100001111B

     

    十进制数

    二进制数

    十六进制数

    0

    0000

    0

    1

    0001

    1

    2

    0010

    2

    3

    0011

    3

    4

    0100

    4

    5

    0101

    5

    6

    0110

    6

    7

    0111

    7

    8

    1000

    8

    9

    1001

    9

    10

    1010

    A

    11

    1011

    B

    12

    1100

    C

    13

    1101

    D

    14

    1110

    E

    15

    1111

    F

    16

    10000

    10

    上面的表格就是二进制数十进制数和十六进制数之间的对应关系

    三立即数的写法

    在教程里我们讲到MOV R7#250MOV R7#OFFH#250#0FFH原来是十进制数250D和十六进制数FFH的区别在单片机中通常我们把这个数称之为立即数那么如果我在编写指令时把立即数#0FFH写成二进制数即11111111或用十进制写法255是不是可以呢当然可以立即数既可以是二进制数也可以是十进制数或十六进制数讲到这里你应该明白了为什么我们前面的实验把#0FFH送到P3口会使P3.7-P3.0变为高电平这里再重复一遍那就是当用十六进制格式表示一个立即数时如果高位的数字为A-F时高位前面要加上个0请大家务必记住了这是一个常识问题可很多书上都不提所以很多人在做实验时往往会编译出错

    这里简单地讲了一下关于数制以及二进制十进制和十六进制数的关系大家可以在以后的实际使用中领会。。。。。

    下面讲一下常用到三个概念:

     
  • 位的含义:在二进制中的每一个0或1,就表示二进制的一个位,“位”,用BIT表示。如89C51的P1接口有8个引脚,外接8只发光二极管,假设要P1口接地(即“0”电平)8个LED才亮,这时就可以这样理解P1的8个引脚为8位二进制数,这样就有8种“0”和“1”的状态,就可以控制外接的8个LED发光管的亮和灭。

  • 字长
    每8个二进制数组合在一起就称为一个字节;如:10010001,即一个字节由八位二进制数组成。
    字长:即二进制的位数,它表示计算机的速度,即每计算一次所能处理的二进制数的位数(个数),象89C51为8位机,而家用电脑以达到32位甚至64位的字长处理能力。

字节的含义:
  8位二进制数就称之为一个字节(BYTE)。1024个字节称为1K。这就要说到存储器。

存储器的工作原理:(在教程里也有详细的讲解)
存储器是计算机不可缺少的重要组成部分。计算机所使用的指令和数据都存放在存储器中,单片机的存储器分为:RAM数据存储器和ROM程序存储器,顾名思义数据存储器是存放程序运行时的数据,是数据交换的地方,又称为随机读写存储器;程序存储器是存放你编写的程序,如你写的MOV A,#30H;这一句经过编译后,在通过编程器烧进如89C51中时就是存放在ROM中,所以ROM又称只读存储器,即指存放在程序存储器中程序或数据在程序运行时是不能修改的。

*、存储器构造

存储器就是用来存放数据的地方。它是器件的物理状态即上面所讲的“0”和“1”两种电平的高低来存放数据的,也就是说,它存放的实际上是电平的高、低,而不是我们所习惯认为的123这样的数字。

12.gif

让我们看图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,总即公交车道,谁都可以走。而十六根地址线也是连在一起的,称之为地址总线。

13.gif (2.39 KB)

13.gif

TOP

返回列表

最新关注 关闭


关于论坛注册,最新修改,请网友们注意

由于最近大量垃圾信息出现在我们的论坛,为了营造一个良好的氛围,目前论坛只开发邀请注册,你可以点击以下链接自动邀请注册(如果有人使用了点击下一个试一试) ...


查看
珩源工控论坛热诚欢迎您联系我们进行合作!

Powered by Discuz! 7.2© 2001-2009 Comsenz Inc.

珩源工控论坛 ( 桂ICP备19004328号) |论坛统计|WAP| 客服中心-www.hymcu.com
  

GMT+8, 2024-11-1 10:24, Processed in 1.074316 second(s), 6 queries, Gzip enabled.