跳到主要内容

2位上下计数器电路

1. 电路概述

通常,您可以在计分板上看到数字显示屏,当按下按钮时会显示分数。计分板的核心是2位上下计数器电路。2位数字显示在两个七段显示器上。

在本项目中,我将向您展示如何使用8051单片机和ATmega8单片机构建2位上下计数器电路。

2. 2位上下计数器电路原理

2位上下计数器电路的主要原理是通过按下按钮来增加七段显示器上的数值。当按下按钮1时,显示器上的数值增加1;当按下另一个按钮时,显示器上的数值减少1。

由于只使用了2个显示器,显示器上的数值可以在0到99之间增加和减少。如果要显示3位数字,则需要使用3个显示器,即三个七段显示器。虽然有许多电路可用于2位上下计数器,但使用单片机可以减少电路板上的元件数量和空间,不过需要进行简单的编程。

alt text
alt text
alt text

3. 电路图

3.1 使用8051单片机的电路

alt text

3.1.1 所需元件

  • AT89C51(8051单片机)
  • 2个七段显示器(共阳极)
  • 2个2N2222 NPN晶体管
  • 3个按钮
  • 2个10KΩ电阻
  • 2个470Ω电阻
  • 8个100Ω电阻
  • 11.0592 MHz晶振
  • 2个33pF电容
  • 10μF/16V电容
  • 1KΩ×8电阻排
  • 迷你面包板
  • 5V电源
  • 8051编程器

3.2 使用ATmega8单片机的电路

alt text

3.2.1 所需元件

  • ATmega8单片机
  • 2个七段显示器(共阳极)
  • 2个10KΩ电阻
  • 2个330Ω电阻
  • 2个按钮

4. 2位7段上下计数器电路设计

2位上下计数器由两个七段显示器组成,连接到ATMEGA8单片机。七段显示器有8个引脚和一个公共引脚。

七段显示器主要有两种类型:1)共阴极;2)共阳极。这里使用的显示器是共阳极显示器。通常对于共阳极显示器,公共引脚应连接到VCC,而对于共阴极显示器,公共引脚应接地。

在七段显示器中,有七个段,它们类似于七个LED。七个引脚属于这七个段,而最后一个引脚是显示器角落的点。对于共阳极显示器,将逻辑1分配给段引脚可以使特定段亮起。在共阴极显示器的情况下,为了使段亮起,段引脚应分配逻辑0。每个段从“a”开始命名,最后一个段点为“h”。

在我们的电路中,七段显示器通过330欧姆的限流电阻连接到单片机。还连接了两个处于下拉模式的按钮。

将按钮连接到下拉模式的必要性是避免按钮的浮动状态,即未知状态。如果按钮以拉下模式连接,这可以确保按钮最初处于逻辑0状态。

5. 如何操作2位上下计数器电路?

  • 最初,为电路供电。
  • 七段显示器上显示的值为“00”。
  • 按下电路中的按钮1。七段显示器上的值增加到“01”。
  • 再次按下按钮1。显示器上的值变为“02”。
  • 现在,按下第二个按钮。你可以看到值减少到“01”。
  • 显示器上的值可以增加到99,在99之后如果按下按钮1,它将从“01”开始增加。如果在减少到“00”后按下第二个按钮,它将显示“00”。只有在至少将值增加到“01”之后,才能更改此值。

6. 编程算法

  • 将单片机的相应端口声明为输入或输出。
  • 声明一个包含七段代码的数组,即如果要显示数字1,则应传递的二进制值如下:
    dp  g  f   e   d   c   b  a
    1 1 1 1 1 0 0 1
    这是因为要显示“1”,b和c段应分配逻辑0。我使用的是共阳极7段显示器。因此,将二进制值0b11111001或十六进制值0xf9分配给要显示“1”的特定端口。数组应包含0到9的二进制或十六进制值。
  • 使用if else循环检查按钮的状态。
    • 如果第一次按下按钮1,第一个七段显示器(在左侧)应显示0,另一个应显示1。因此,输出为“01”。
    • 如果第二次按下按钮1,第二个按钮上的值应增加1。
    • 如果按下第二个按钮,第一个段上的值应减少1。

8051 单片机代码

#include<reg51.h>

#define SEGMENT P0

sbit switch1=P3^0;
sbit switch2=P3^1;
sbit digit1=P2^0;
sbit digit2=P2^1;

void delay (int);

int x=0,y,z;
unsigned char ch[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x98};

void delay (int d)
{
unsigned char i;
for(;d>0;d--)
{
for(i=250;i>0;i--);
for(i=248;i>0;i--);
}
}

void main()
{
switch1=1;
switch2=1;
digit1=1;
digit2=1;

while(1)
{
if(switch1==0)
{
x++;
delay(200);
}
else if(switch2==0)
{
x--;
delay(200);
}
y=x/10;
SEGMENT=ch[y];
digit1=0;
delay(10);
digit1=1;

z=x%10;
SEGMENT=ch[z];
digit2=0;
delay(10);
digit2=1;
}
}

ATmega8 单片机代码

/*
* updown_counter.c

* Author: ADMIN
*/
/*#define F_CPU 8000000UL*/
#include <avr/io.h>
#include <util/delay.h>

int main(void)
{
DDRB = 0x00;
DDRC = 0xff;
DDRD = 0xff;
unsigned int i,x=0,y,z;
unsigned char arr1[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x18};
while(1)
{
if((PINB&0x01)==0x01)
{
x++;
_delay_ms(200);
}
else if ((PINB&0x02)==0x02)
{
x--;
_delay_ms(200);
}

{
y=x/10;
z=x%10;
PORTC=0x01;
PORTD=arr1[y];
_delay_ms(400);
PORTC=0x02;
PORTD=arr1[z];
_delay_ms(800);

}

}
}

7. 2位上下计数器电路应用场景

  • 该电路可用于计分板。
  • 上下计数器可用于统计通过某一点的物体数量。
  • 它还可用于统计进入房间的人数。

8. 电路限制

该特定的上下计数器电路仅限于2位数字,即0-99。如果需要超过3位数字,则需使用另一个显示器,这将需要控制器的更多引脚。