用中规模十进制计数器74HC160实现9翻1计数器实验数据,技术脉冲为1到13,输出位Q3到Q0,并用数码管显示
时间: 2024-02-16 20:02:47 浏览: 96
好的,根据您的问题,我可以给出以下参考答案:
首先,74HC160是一个4位同步可重置计数器,可以用来实现9翻1计数器。其真值表如下所示:
| CP1 | CP0 | MR | Q3 | Q2 | Q1 | Q0 |
|----|----|----|----|----|----|----|
| 0 | 0 | X | Q3 | Q2 | Q1 | Q0 |
| 0 | 1 | X | Q3 | Q2 | Q1 | Q0+1|
| 1 | 0 | X | Q3 | Q2 | Q1+1| 0 |
| 1 | 1 | X | Q3 | Q2+1| 0 | 0 |
| X | X | 1 | 0 | 0 | 0 | 0 |
其中,CP1和CP0分别是计数器的两个时钟输入,MR是计数器的复位输入,Q3到Q0是计数器的四个输出位。
在本题中,需要实现一个9翻1计数器,即计数器从0开始计数,每计数到9时就回到1重新开始计数。因此,可以使用以下的计数器电路:
1. 将CP0接入技术脉冲,CP1接入一个2分频电路的输出,以便产生周期为26的计数脉冲。
2. 将MR接入一个复位电路,以便在上电或手动复位时将计数器清零。
3. 将计数器的Q3到Q0输出接入四个数码管的段选输入,以便显示计数器的值。
根据以上电路,可以编写如下的实验程序:
```c
#include <reg52.h>
sbit Clock = P1^0; // 技术脉冲输入
sbit Reset = P1^1; // 复位输入
sbit D1 = P2^0; // 数码管1段选控制
sbit D2 = P2^1; // 数码管2段选控制
sbit D3 = P2^2; // 数码管3段选控制
sbit D4 = P2^3; // 数码管4段选控制
unsigned char Count = 0; // 计数器值
void Display(unsigned char Value) {
static unsigned char Code[] = {
0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F
};
D1 = D2 = D3 = D4 = 1;
P0 = Code[Value % 10];
D1 = 0;
P0 = Code[Value / 10 % 10];
D2 = 0;
P0 = Code[Value / 100 % 10];
D3 = 0;
P0 = Code[Value / 1000 % 10];
D4 = 0;
}
void main() {
Clock = 0;
Reset = 1;
TMOD = 0x01;
TH0 = 0xFC;
TL0 = 0x66;
ET0 = 1;
EA = 1;
TR0 = 1;
while (1) {
Display(Count);
}
}
void Timer0() interrupt 1 {
TH0 = 0xFC;
TL0 = 0x66;
Clock = ~Clock;
if (Clock) {
Count++;
if (Count == 10) {
Count = 1;
}
}
Reset = 0;
asm nop;
Reset = 1;
}
```
在上述程序中,使用定时器0产生周期为26的计数脉冲,将计数器的输出接入Display函数进行数码管显示。当计数器值达到9时,将其重置为1重新开始计数。数码管显示函数使用了一个常量数组Code来存储0到9的数码管段选值,通过位移和取模运算进行数码管显示。
阅读全文