基于51单片机的抢答器设计,利用AT89C51作为系统主控,数码管进行显示倒计时,独立按键作为主持人按钮,同时为了抢答及时,采用外部中断扩展的方式进行抢答按键的设计,同时为了节省IO的,利用74HC595进行设计,如下图:
一、硬件设计
1、显示器件
本次使用三个二位数码管进行显示,显示的内容分别是抢答倒计时、抢答选手号、回答倒计时三个数据,数码管的选型为共阴型,即低电平选中。
2、外部中断扩展
由于抢答有时效性的要求,如果使用简单的循环扫描按键,这势必会导致有时候抢答不及时,甚至抢答卡顿,影响抢答额的公平性,但是AT89C51有且只有两个外部中断,于是需要使用外部中断扩展来实现功能,如下图,每个按键按下的时候都会触发INT0中断,而INT0刚好有最高优先级,且在外部中断引脚处各自连接了一个二极管,目的是为了防止除低电平以外的信号输入在外部中断上。
3、74HC595
74HC595是一种串转并的芯片,它可以将输入的字节信号转换为八位电平信号,通过该方式,用三根数据线实现八个IO口的控制,大大节省了IO口,针对本次设计IO口紧张的情况是效果显著的。
二、软件设计
1、数码管驱动
本次设计的数码管是共饮数码管了,因此首先需要获取到共阴数码管的段码表并用数组存储起来,方便日后进行显示,同时共阴数码管是低电平选中,在程序中也是要体现的。
#include <REGX52.H>
#include "74HC595.h"
//10在Data[]里的索引是空0x00
unsigned char nixie_Buf[9]={0,16,16,16,16,16,16,16,16};
unsigned char Data[]={0x3f,0x30,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7C,0x39,0x5E,0x79,0x71,0x00,0x40};
//将需要显示的值传递进来
void nixie(unsigned char Location,number)
{
//把数组nixie_Buf的Location位换成number
nixie_Buf[Location]=