0

我正在学习 8051 汇编编程。我在我的书中读到“为了使端口成为输入端口,端口必须通过将 1 写入其所有位来进行编程。” 但这不是错的吗?

如果我将所有位设置为 1,并想在输入1010时输入,我将按下连接到第 2 引脚和第 4 引脚的按钮以输入 1010,但端口将读取所有 1。我在 Keil uVision Simulation 上试过,发现了这个问题。

这是一个问题还是我误解了它?

org 00h

Reset:

mov P0,#00h
mov P1,#00h
mov P2,#00h
mov P3,#00h

TakeInput:

jb P2.0,Addition// in assembler simulation, this condition is true if I set P2 to #0ffh, which is not required. The user should set this bit for making this condition true

sjmp TakeInput


Addition:

移动 A,P0 添加 A,P1

mov P3,A

acall Delay

ajmp Reset


Delay:

mov R0,#1

here:

mov R1,#1

again:

djnz R1,again

djnz R0,here

ret

end

如果我不将所有端口重置为 0,则默认情况下依赖于端口值的跳转指令变为 true。

4

1 回答 1

1

这是正确的方法,你的模拟肯定有问题。8051引脚有这种电路:

引脚电路

来源

请注意上拉Vcc是可选的,请查看特定芯片的数据表。

该电路的工作原理是,如果您将引脚设置为0,则输出将被拉至地,并且只能被读取为0因为从外部您无法将其拉高。如果要允许输入两个电平,则必须将引脚设置为1。在这种情况下,您可以:

  1. 如果您有内部上拉,则保持输出浮动(读作1
  2. 将输出拉到Vcc(读作1
  3. 将输出拉到地(读作0

因此,如果您连接一个按钮,您应该对其进行接线,以便将引脚拉到地。如果需要,添加一个外部上拉电阻。

更新 以明确这一点:如果您按照上述说明连接按钮(即按下按钮将引脚接地),则输入将被读取为1好像按钮没有被按下,并且0好像按钮按下了。这是连接按钮的常用方法。

插图使用MCU 8051 IDE。请注意,两个开关连接到端口 1 的引脚 7 和 6(即两个最高位),一个是打开的,另一个是关闭的(按下)。


如果端口位设置为零,则无论开关的状态如何,输入都将为零: 端口位设置为 0


如果端口位设置为 1,则输入将1用于打开和0关闭开关: 端口位设置为 1

通向最左侧开关的红色接线表示P1.7处于处于状态Vcc(因为输出处于处于1状态且未被开关拉低)。

于 2013-03-14T12:37:57.957 回答