单片机跑起来第二章:二进制
扫描二维码
随时随地手机看文章
将“二进制”单独拿出来作为一节来讲,是因为它是一个极为基础的概念。但是很多人对二进制并没有形象的认识,甚至有一些已经入门、稍有开发经验的人对它的理解仍然比较模糊。所以振南认为有必要将它以一种更为形象、通俗而又深刻的方式着重来进行阐述,以便给我们以后的学习打下坚实的基础。
我们人类自古以来都在沿用一种被认为非常自然的计数方式,即十进制。它的原理非常简单,即“满十进一”(为什么是十进制,究其根源是因为我们有十根手指)。如果”XY”是一个十进制的2位数的话,那么它的每一个位上将可能出现0~9这十个数字。某一位当前是9,如果再+1便会归0,同时向它的更高一位进1。这就是计数的基础原理(不论进制如何都是如此)。
既然人类已经习惯了使用了十进制,那为什么要在单片机中使用二进制呢?把它设计成十进制不好吗?在计算机问世的初期,或是在一些技术狂热分子中确实有人尝试制造出其它进制的计算机。但不论使用何种进制,振南前面所介绍的CPU体系中的各种基本内容都是必须要遵循和实现的,比如寻指令与执行、总线的操作等等。好,那振南就以总线操作中的一个环节—“CPU向地址总线给出要访问的存储器中的存储单元的地址”为例,用十进制来进行实现。
假设要访问的地址是(3456)10,请看图1.20。
图1.20 CPU以十进制方式向存储器产生地址
很明显,要以十进制方式传输3456这个数值,我们就需要用4条地址线,每一条地址线上分别传输3、4、5、6这四个数字。敢问大家,这该如何传呢?一条线如何能表达0~9这十个数字呢?有人说:“可以啊!我把5V等分为10份,0V~0.5V代表0,0.5V~1V代表1,依此类推,4.5V~5V代表9。”不错,很聪明,这就是传说中的“模拟计算机”的作法。它的信号线上传输的是模拟电压信号,而非数字信号。
虽然上面所说的方法是可行的,但有很多因素决定了人们不会去这样作:
电路的实现上难度比较大,模拟电路的设计比数据逻辑电路要复杂的多;
传输速度不高,模拟信号的产生与采集接收比数字信号要慢;
稳定性和抗干扰能力比较弱,仅仅靠0.5V的压差来确定传输的数值,极易出现错误;
功耗很难降低,模拟电路的复杂度和规模以及其它因素注定其功耗较大。
……
针对于第3条,有人曾经提出过疑问:“我可以把电压抬高啊,可以将5V定义为10V或20V,这样压差不就拉开了吗?”聪明,不过你考虑过功耗的问题吗?
我们还是用二进制的方式来进行实现吧。(3456)10转化为二进制是(110110000000)2,请看图1.21。
图1.21 CPU以二进制方式向存储器产生地址
二进制是满二进一,将一个十进制的数值转化为二进制其位数一定会变多,所以我们就需要更多的地址线。二进制数的每一位上只能表示0和1这两个数字,这对应于地址线上使用两个电平即可实现,比如0V和5V(实际可能是0V~2.xV表示0,2.xV~5V表示1)。这样作的好处是显而易见的,电路设计的难度下降了很多,而且抗干扰能力也比较强。更重要的是,信号的传输速率可以作到比较高,最终实现计算机系统整体性能的提升。另外,二进制也使得芯片的功耗可以大幅度地降低,因为我们可以将高电平定义为3.3V、1.8V,甚至是1.2V。(高电平电压定义得越低,单片机信号从低电平爬升到高电平的速度越快。因此,降低电平电压将有利于时钟频率的提高。)
综上所述,大家应该已经比较深刻地认识到计算机系统中使用二进制的重要意义了。二进制是计算机的根基,是底层CPU硬件以及很多相关电路实现的基础。所以,在我们所作的与单片机相关的很多开发和研究工作中,会大量涉及到二进制的概念和应用。