利用继电器实现 0 的显示
至此, 有了继电器及它带来的一个反向控制的能力, 显示 0 就不成为问题了.
当然, 它不单纯是反向控制, 也可以正向控制, 综合的讲, 应该说它实现了一种 间接控制.
现在, 用一个继电器取代前面那个抽象模块, 利用间接控制的手段, 就能够实现没电时显示 0 了:
继电器显示 0 和 1 的综合对比及问题 在线可互动操作示例
但我们发现一个新的问题, 无论控制的开关跳到哪一端, 0 和 1 都是始终亮着的.
这不符合我们的预期, 我们设想的是它要么显示 0, 要么显示 1.
奇怪的是, 先前用它控制单个 LED 灯时则又没有问题:
为什么从普通 LED 换成 7 段 LED 数码管就不行了呢? 这个问题与继电器的悬空电压及 LED 数码管的实现方式不匹配有点关系.
我们先说解决方案, 有两种:
- 引入下拉电阻(pull-down resistor)
- LED 数码管采用共阴极(或共阳极)连接方式.
引入下拉电阻修复同时点亮的问题
如果不打算改变 LED 数码管的布局, 则需要在开关的另一端引入一个电阻(缺省 1k 欧姆)然后接地, 这样就 OK 了:
继电器普通方式显示 0 和 1 的综合对比 在线可互动操作示例
看来还是少不了要接地, LED 上没有接地时, 只能在外面去接了.
这背后的原因与模拟器对继电器的实现方式有关, 详细解释请参考: 继电器使用的注意事项及疑惑解答
共阴极方式连接
不难注意到单个 LED 灯的情况是有回路存在的(接地), 所以一种解决方式是使用前面提到的 LED 共阴极连接方式, 如此一来就正常了:
继电器共阴极显示 0 和 1 的综合对比 在线可互动操作示例
可以看到, 同一时刻只有一个 LED 数码管亮起来, 并准确反映了控制开关的状态, 这正是我们想要达成的效果.
当然, 这种方式会改变 LED 数码管的布局, 并且多了一个接地端.
另外此处与前面直接接电源情况不同, 因为经过了继电器(本身带电阻), 所以这里无需再通过一个电阻, 也不会导致前面提到的电流超出的异常.
关于 circuitjs 异常及其处理, 参考 模拟器异常处理