跳到主要内容

使用单片机的8通道抢答器电路

在本项目中,我将向您展示使用单片机(8051)设计和工作原理的8通道抢答器电路,它可以在抢答或游戏节目中告诉我们哪支队伍首先按下了按钮。

抢答器通常用于教育机构和游戏节目等场所,组织者需要知道谁首先按下了按钮。传统的系统需要人工干预来决定哪支队伍按下了按钮,这种系统可能会出现错误甚至偏袒。

当两名成员几乎同时按下按钮时,会出现另一个问题,很难判断谁先按下了抢答器。

在本项目中,我设计了一个自动抢答器系统,当多支队伍按下抢答器时,系统会精确地计算两次按钮按下的延迟,并显示相应的数字。

alt text
alt text
alt text

我使用8051单片机设计了该电路,它扫描来自按钮的输入,并在显示设备(7段显示器)上显示相应的数字。这是一个简单的电路,使用最少的元件,没有任何复杂性。尽管该系统仅设计用于8支队伍,但可以通过添加另一组8个按钮来增加更多队伍。

1. 抢答器电路的工作原理

使用单片机的8通道抢答器电路是一个简单的嵌入式系统,输入设备为一组8个按钮,单片机作为主控制器,输出设备为蜂鸣器和显示器。

整个操作由单片机通过用C语言编写的程序完成,并将程序烧录到单片机中。当按下其中一个按钮时,蜂鸣器开始响铃,并在7段显示器上显示相应的数字。

2. 使用单片机的8人抢答器电路图

alt text

3. 所需元件

  • AT89C51(8051单片机)
  • 7段显示器(本项目中使用共阳极)
  • 按钮 - 10个
  • 10KΩ电阻 - 2个
  • 100Ω电阻 - 8个
  • 470Ω电阻 - 2个
  • 2N2222 NPN晶体管 - 2个
  • 5V蜂鸣器
  • 1N4007二极管
  • 10μF电容
  • 33pF电容 - 2个
  • 11.0592 MHz晶体
  • 8051编程器
  • 5V电源

4. 设计过程

整个设计过程涉及五个步骤。

  1. 第一步是设计电路。
  2. 第二步是使用任何软件绘制原理图。
  3. 第三步是使用高级语言(如C语言或汇编语言)编写代码,然后在Keil µVision等软件平台上进行编译。
  4. 第四步是将代码烧录到单片机中。
  5. 最后,第五步是测试电路。

5. 抢答器电路设计

该电路涉及使用五个主要元件 - 8051单片机、SPST按钮、蜂鸣器和共阳极7段显示器。在此使用的单片机是AT89C51,这是由Atmel(现为Microchip)制造的8位单片机。

复位电路设计:复位电阻的选择是使得复位引脚处的电压(跨接此电阻)至少为1.2V,且施加到此引脚的脉冲宽度大于100ms。在此,我们选择一个10KΩ的电阻和一个10μF的电容。

振荡器电路设计:振荡器电路使用11.0592 MHz的晶振和两个33pF的陶瓷电容设计。晶振连接到单片机的第18脚和第19脚。

单片机接口设计:一组8个按钮连接到单片机的P1端口,蜂鸣器连接到P3.3端口。7段显示器连接到单片机,使得所有输入引脚连接到P2端口。

单片机代码:可以使用C语言或汇编语言编写代码。在此,我使用Keil µVision软件用C语言编写程序。通过以下步骤完成:

  1. 在Keil窗口中创建一个新项目并选择目标(单片机)。
  2. 在项目下创建一个新文件并编写代码。
  3. 将代码保存为.c扩展名,并将其添加到目标文件夹下的源文件组中。
  4. 编译代码并创建hex文件。

一旦代码编译完成并生成了hex文件,下一步是将代码烧录到单片机中。这可以通过8051单片机编程器完成。

#include<reg51.h>

#define SEGMENT P2 // PORT2 to Segments of 7-Segment Display
#define SWITCH P1 // Input Switches (buttons) to PORT1

sbit buzz=P3^0; // Buzzer
sbit rst=P3^3; // Reset Switch (Reset the display) - not the microcontroller
sbit digit=P3^7; // 7-Segment Display Common Pin (to enable)


void delay (int); // Delay function

int x=0,y,z;
unsigned char ch[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x98}; // Hexadecimal values from 0 to 9.

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()
{
SWITCH=0xff;
SEGMENT=0xff;
digit=1;
buzz=0;
rst=1;

while(1)
{
while(SWITCH==0xff); // wait until any button is pressed.

while (SWITCH==0xfe) // Button 1 is pressed.
{
SEGMENT=ch[1];
buzz=1;
delay(1000); // Activate buzzer for 1 second.
buzz=0;
while(rst!=0); // display the digit until the reset is pressed.
}

while (SWITCH==0xfd) // Button 2 is pressed.
{
SEGMENT=ch[2];
buzz=1;
delay(1000);
buzz=0;
while(rst!=0);
}

while (SWITCH==0xfb) // Button 3 is pressed.
{
SEGMENT=ch[3];
buzz=1;
delay(1000);
buzz=0;
while(rst!=0);
}

while (SWITCH==0xf7) // Button 4 is pressed.
{
SEGMENT=ch[4];
buzz=1;
delay(1000);
buzz=0;
while(rst!=0);
}

while (SWITCH==0xef) // Button 5 is pressed.
{
SEGMENT=ch[5];
buzz=1;
delay(1000);
buzz=0;
while(rst!=0);
}

while (SWITCH==0xdf) // Button 6 is pressed.
{
SEGMENT=ch[6];
buzz=1;
delay(1000);
buzz=0;
while(rst!=0);
}

while (SWITCH==0xbf) // Button 7 is pressed.
{
SEGMENT=ch[7];
buzz=1;
delay(1000);
buzz=0;
while(rst!=0);
}

while (SWITCH==0x7f) // Button 8 is pressed.
{
SEGMENT=ch[8];
buzz=1;
delay(1000);
buzz=0;
while(rst!=0);
}

SEGMENT=0xff;
rst=1;

}
}

6. 抢答器电路的工作原理

一旦电路通电,编译器将初始化堆栈指针和具有非零初始值的变量,并执行其他初始化过程,然后调用主函数。它随后检查是否有按钮被按下。

换句话说,单片机扫描其P1端口的任何输入引脚是否为零或处于低电平。如果按下按钮,将调用显示函数并传递相应的数字。然后单片机向连接到7段显示器的端口发送相关信号。

单片机会使蜂鸣器响1秒,然后关闭,但数字将继续在7段显示器上显示,直到按下RST按钮。

7. 抢答器电路的应用

  1. 该电路可用于学校、学院和其他机构组织的抢答比赛中。
  2. 它也可用于其他游戏节目。
  3. 它可以用于公共场所(如银行、餐厅)作为数字排队显示系统。