8位二进制计数器项目实战:从单寄存器到双寄存器应用
立即解锁
发布时间: 2025-08-24 00:50:19 阅读量: 1 订阅数: 5 

### 8位二进制计数器项目实战:从单寄存器到双寄存器应用
#### 1. 项目17:移位寄存器8位二进制计数器 - 硬件部分
在这个项目中,我们使用的是74HC595移位寄存器。它是一个8位串行输入、串行或并行输出的移位寄存器,带有输出锁存器。这意味着我们可以将数据串行输入到移位寄存器,然后并行输出。串行输入是指一次输入1位数据,而并行输出则是一次输出多个位(这里是8位)。
当锁存器(LATCH)设置为低电平(LOW)时,数据可以输入到芯片;当锁存器设置为高电平(HIGH)时,数据会被输出。我们逐位将数据(以1和0的形式)输入到移位寄存器,然后一次性输出8位数据。每输入一位新数据,之前的数据就会依次移位。如果在锁存器设置为高电平之前输入了第9位数据,那么最先输入的那一位数据将被移出并丢失。
移位寄存器通常用于串行到并行的数据转换。在本项目中,输出的数据是1和0(对应0V和3.3V),因此可以用它来控制一组8个LED的开关。
该移位寄存器只需要Arduino的三个输入引脚,具体的引脚连接如下表所示:
| Arduino引脚 | 595引脚 | 描述 |
| --- | --- | --- |
| 8 | 12 | 存储寄存器时钟输入 |
| 11 | 14 | 串行数据输入 |
| 12 | 11 | 移位寄存器时钟输入 |
为了方便描述,我们将引脚12称为时钟引脚(Clock Pin),引脚14称为数据引脚(Data Pin),引脚11称为锁存引脚(Latch Pin)。可以把锁存器想象成一个门,当门放下(低电平)时,595芯片内的数据无法输出,但可以输入数据;当门升起(高电平)时,数据不能再输入,但移位寄存器中的数据会被释放到8个引脚(QA - QH或Q0到Q7,具体取决于数据手册)。时钟引脚只是一个0和1的脉冲信号,而数据引脚则是从Arduino向595芯片发送数据的地方。
使用移位寄存器时,锁存引脚和时钟引脚必须先设置为低电平。锁存引脚会一直保持低电平,直到8位数据全部设置完毕。这样可以将数据输入到存储寄存器(存储寄存器是芯片内部用于存储1或0的地方)。然后在数据引脚提供高电平或低电平信号,接着将时钟引脚设置为高电平,此时数据引脚提供的数据会被存储到存储寄存器中。完成后,再将时钟引脚设置为低电平,然后在数据引脚提供下一位数据。重复这个过程8次,就可以将一个完整的8位数字输入到595芯片中。最后,将锁存引脚设置为高电平,数据会从存储寄存器转移到移位寄存器,并从Q0到Q7(引脚15、1到7)输出。
这个过程的事件序列如下表所示:
| 引脚 | 状态 | 描述 |
| --- | --- | --- |
| Latch | LOW | 锁存器放下,允许数据输入 |
| Data | HIGH | 第一位数据(1) |
| Clock | HIGH | 时钟变为高电平,数据存储 |
| Clock | LOW | 准备下一位数据,防止新数据输入 |
| Data | HIGH | 第二位数据(1) |
| Clock | HIGH | 第二位数据存储 |
| ... | ... | ... |
| Data | LOW | 第八位数据(0) |
| Clock | HIGH | 存储数据 |
| Clock | LOW | 防止新数据存储 |
| Latch | HIGH | 并行输出8位数据 |
下面是使用移位寄存器的流程mermaid图:
```mermaid
graph LR
A[开始] --> B[设置Latch和Clock为LOW]
B --> C[输入第一位数据到Data]
C --> D[设置Clock为HIGH,存储数据]
D --> E[设置Clock为LOW]
E --> F{是否输入8位数据}
F -- 否 --> C
F -- 是 --> G[设置Latch为HIGH,输出数据]
G --> H[结束]
```
#### 2. 项目17:移位寄存器8位二进制计数器 - 代码部分
项目的代码乍一看可能比较复杂,但将其分解后会发现并没有那么难。
首先,初始化三个变量来表示要使用的三个引脚:
```cpp
int latchPin = 8;
int clockPin = 12;
int dataPin = 11;
```
然后,在`setup`函数中,将这些引脚设置为输出模式:
```cpp
void setup() {
pinMode(latchPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(dataPin, OUTPUT);
}
```
主循环部分是一个从0到255的`for`循环。在每次循环中,将锁存引脚设置为低电平以允许数据输入,调用`shiftOut`函数并传入循环变量`i`的值,然后将锁存引脚设置为高电平以锁定并输出数据,最后延迟半秒后开始下一次循环:
```cpp
void loop() {
// 从0到255计数
for (int i = 0; i < 256; i++) {
// 设置锁存引脚为低电平,允许数据流动
digitalWrite(latchPin, LOW);
shiftOut(i);
// 设置锁存引脚为高电平,锁定并发送数据
digitalW
```
0
0
复制全文
相关推荐










