二进制如何转换为电信号?


16

我刚开始涉足电子领域,已经着迷了。最近几天与Arduino一起玩,我知道二进制是不同电压的代表-例如+ 5V代表1和GND代表0

我一直在尝试发现微控制器在物理层面上是如何将二进制转换为这些电压的。我似乎在任何地方都找不到描述。谁能分享他们的知识或使我指向描述其工作原理的地方/好书?


1
我不记得是哪一个,而是看一下这个视频。好内容。
Abdullah kahraman 2012年

2
实际上,微控制器不会将二进制转换为变化的电压。二进制是电压。+ 5V表示为“高”或“ 1”。0V表示为“低”或“ 0”。去看看电子开关,或更详细些;MOSFET。
abdullah kahraman 2012年

您不是在问“模拟到数字”或“数字到模拟”的转换,对不对?
abdullah kahraman 2012年

3
反过来可能会有所帮助。“二进制”是我们人类喜欢推理的一种符号数学实体。逻辑电路可以表示具有不同电压的二进制。我们设计逻辑电路,以便当我们将这些电压解释为二进制数时,电路对电压电平的处理将具有一致的逻辑意义。
JustJeff 2012年

1
@abdullahkahraman你是正确的,我不认为我说的是DAC。感谢您的视频链接,它非常有用。通过这种方式,您还向我介绍了MIT OCW网站,该网站看起来将是学习的绝佳资源。谢谢!
马特2012年

Answers:


18

我想以稍微不同的方式重申KellenJB的部分答案:

从二进制1和0到5 V和0 V之类的电压都没有转换。微控制器或任何物理电路仅在该电压下工作。

当我们在脑海中就电路的工作原理形成简化模型时,这些电压在我们的头脑中被“转换”为二进制1和0。


2
是。是的,是的,是的,(是的)是的。
JustJeff 2012年

1
我要补充一点,将其设置为0时,电压仅需要接近0或低于阈值(例如<0.8v),并且要比阈值大1(例如> 2.0v)。阈值因用于构建设备的技术和其情况下的工作电源电压5v而异。
肯尼2012年

1
谢谢大家 因此,一旦计算机开始运行,根本就没有二进制机器代码的实际传递?二进制代码作为固件上传时,然后可能存储在内存中,当处理器“访问”该二进制代码时,该二进制代码会响应一个与二进制相对应的电压周期?(希望这是有道理的)
Matt

要“上载”,代码必须已经是某种物理形式:电线上的电压,某些操纵杆(或键盘上的键)的位置,等等。在存储器中,这些位作为电荷的累积存储在电容器上,这也会在电容器上产生电压。
Photon 2012年

1
我的观点是,屏幕上或打印在纸上的形状仅仅是光或墨水斑点,直到我们的思想将它们解释为一或零。想象一下一个用未知字母印出的字母(例如西里尔字母或泰语)。直到俄罗斯或泰国人来解释它并知道它代表什么,这只是墨水。但是这种哲学上的区别可能使我们脱离了话题。
Photon 2012年

11

实际上并没有发生“转换”。二进制1和0只是底层电压的虚拟表示。实际上,在许多系统中,高电压可能意味着0,而低电压则意味着1。这样做有一些原因,但是您可能更想尽早开始研究。

要了解逻辑中发生的情况,最好检查一下晶体管。晶体管可以用于很多事情,但简单来说,您可以将其视为开关。从概念上讲,您可以像在墙上的电灯开关那样思考它,但是它不是通过物理移动开关来控制,而是通过电流变化来控制。您可以将点亮的灯视为1,将熄灭的灯视为0。现在,您可以开始将这些开关组合成不同的集合,以创建不同的逻辑元素(例如AND,OR,NOR等)。

我知道我的回答还不够详细,但我希望它能回答您的问题。如果您需要更多说明,我将愿意添加更多细节,只是不想让您不知所措。


谢谢大家的好评!我是否会想到,以简单的方式,微处理器以一定的时钟速度运行,并在每个周期通过这些用作逻辑门的晶体管发送指令集(与二进制值有关的电压?),这是对的吗?然后,晶体管根据组合的逻辑(或NAND等)产生相关的输出?
马特

1
简单地说...是的。这里有很多抽象层。很难用一个答案来解释这里发生的所有事情,因为在理解所有内容之前,它需要很多抽象层次。可以轻松地上几门大学课程来教授全部内容。您可以只接受表面上的东西,也可以准备大量学习。
Kellenjb 2012年

谢谢@kellenjb,您的帮助很大。鼓励我学习更多!
马特

10

简短的答案是它不“转换”,电压二进制的(或二进制)。就像在纸上写一个数字一样,标记是数字的表示,或者是算盘上的数,石头的位置是数字的表示。

二进制是一个数字系统,就像十进制(或八进制,十六进制等)一样

十进制(base-10)有10个符号(0123456789)二进制(base-2)只有两个(01)

在任何基数中的序列10表示第一幂的基数,因此在十进制10中表示10 ^ 1 = 10,在二进制中则表示2 ^ 1 =2。接着,十进制100表示​​10 ^ 2 = 100,并且用二进制表示2 ^ 2 =4。依此类推。

用电子来表示十进制是可能的,但很复杂,因此他们选择了可以用简单的0和1(或开/关)表示的二进制。对此
有一些变化,例如三元(3状态)系统,当然还有模拟计算。在晶体管出现之前,有机械打孔机(谷歌知道很多,如果有时间的话,一些非常有趣的读物)
最早的二进制数字计算机是用真实的开关(电子继电器)制成的。的楚泽Z3(1941)是一个例子:

祖斯Z3

此后,使用真空管代替继电器(可以在没有移动机械部件的情况下切换得更快),由真空管代替继电器进行切换。的ENIAC是与真空管由早期的计算机的一个例子。

然后在60年代,晶体管问世,并在IC之后不久。晶体管执行的功能与早期机器中的继电器/阀门相同,但更小,更快,功耗更低。

二进制计算机电路基本工作方式背后的实际理论根本没有改变,就像我们没有改变数学中数字处理方式一样-算法有所改进,但基本规则保持不变。

因此,如果您知道二进制的工作原理,并且有一个简单的电路可以将1或0存储为两个不同的电压电平(例如5V和0v),并且可以执行其他简单的逻辑功能(如AND和OR),那么,您可以将它们全部结合起来做更复杂的事情。
由于所有这些二进制电路只是最基本的开关,因此您可以通过在两种状态(例如机械/继电器/阀/晶体管/?)之间交替的任何东西来实现相同的目的。

举一个以二进制存储数字的例子,假设我们有8个开关(它们的类型不重要)
,1表示5V,0表示0V。
我们要存储数字123。

十进制为123 =(1 X 10 ^ 2)+(2 * 10 ^ 1)+(3 x 10 ^ 0)
二进制为01111011 =(0 x 2 ^ 7)+(1 x 2 ^ 6) +(1×2 ^ 5)+(1×2 ^ 4)+(1×2 ^ 3)+(0×2 ^ 2)+(1×2 ^ 1)+(1×2 ^ 0)
因此,所有我们要做的是将开关0、1、3、4、5、6设置为5V,将开关7和2设置为0V。这以二进制形式“存储”数字123。该设置将被称为“寄存器”。

如果您想了解更多有关如何组合开关以形成更复杂的电路的信息,请阅读有关数字逻辑的好书,或者咨询google。

这个网站开始似乎还不错。


0

您正在运行的程序正在使用代表1和0的电压。该数字部分的所有内容都接近地或接近电源电压(在您的示例中为5V)。假设使用0xFF加载处理器寄存器时,可以说您正在芯片中的某个位置创建8个独立的5Volt信号。然后将该寄存器值存储在与输出端口相关的控制寄存器中时,设备上的输出引脚上的处理器寄存器中的5V信号会导致创建其他5V信号,这些信号连接到设备的外部引脚。


0

电压只是表示二进制文件的一种方式。这是一种非常有效的实用转换,可以使用不同的晶体管配置实现二进制逻辑。

通常以电子方式实现二进制逻辑的方式是使用CMOS(http://en.wikipedia.org/wiki/CMOS)技术,在该技术中,两个MOS晶体管成对互补设置,以形成CMOS门。但是,还有其他二进制逻辑的电子实现,例如使用TTL(http://en.wikipedia.org/wiki/Transistor –transistor_logic)或继电器。但是您可以使用任何真正的纸张,纸制机器人山羊皮: http //www.robives.com/category/product_tags/logic_goats。电子CMOS实施恰好是一种高效且实用的方法。

在这些简单的CMOS门中,您可以构建更复杂的逻辑门:NAND和NOR是标准的非门。其中,您可以构建所有内容,包括二进制逻辑,加法器,寄存器文件,内存。通过这些,您可以构建一个ALU,直到完整的微处理器。

如果您想了解更多信息,可以阅读一本关于数字逻辑的书,我碰巧拥有并喜欢这本书:

http://www.amazon.com/Digital-Systems-Principles-Applications-11th/dp/0135103827/ref=sr_1_1?s=books&ie=UTF8&qid=1326877355&sr=1-1

了解VCPU的构建的一种实用的好方法就是使用VHDL和FPGA自己构建一个。您可以获得便宜的FPGA开发板,并且该软件通常是免费的(有限制的许可证)。我有些勤勉,这是相当实惠的:

http://www.digilentinc.com/


-3

简而言之,在给定范围内(通常为5至12伏),最高有效位在该范围的前半部分为0,在另一范围为1。通过将二分之一进一步除以此类推,直到计算出所有位,来计算下一个最高有效位。

因此,二进制只是关于定期测量的升高和降低电压。

这是一个简化的示例。在1V至256V的范围内,让我们使用伪代码将137(模拟)转换为二进制(数字):

// used this way: analogToNumeric(137, 256);
function convert(var number, var length) {
    if (number > length) { return(ERROR); }
    function convert(var half, var binary) {
        if (half < 2) { return(binary); }
        elseif (number < half) {
            return(convert((half / 2), append(binary, 0)));
        } else {
            return(convert((half / 2), append(binary, 1)));
        }
    } return(convert((length / 2), list()));
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.