仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
本文设计出以AT89C51单片机为核心的八路抢答器。直接采用了数字显示器显示和LED亮灯显示,并可以利用复位电路进行复位的设计思想,它能根据不同的抢答输入信号,经过单片机的控制处理并产生不同的与输入信号相对应的输出信号,最后通过LED数码管显示相应的路数,即使两组的抢答时间相差几微秒,也可分辨出是哪组优先按下的按键,它充分利用了单片机系统的优点,具有结构简单、功能强大、可靠性好、实用性强的特点。 本设计是以八路抢答为基本理念。考虑到依需设定显示亮灯和选手号的功能,利用51单片机及外围接口实现的抢答系统,利用单片机的可以通过段码和位码控制的原理,将软、硬件有机地结合起来,使得系统能够正确地进行计时,同时使数码管能够正确地显示时间。用开关做键盘输出,LED指示电路发生提示。
工作原理
基本功能设计1. 同时供8名选手比赛,分别用8个按钮 K1 ~ K8 表示。 2. 设置一个系统抢答控制开关K0,和系统复位开关,由主持人控制。 3. 抢答器具有锁存与显示功能。即选手按动按钮,锁存相应的编号,扬声器发出声响提示,并在七段数码管上显示选手号码。选手抢答实行优先锁存,优先抢答选手的编号一直保持到主持人将系统清除为止。 4. 抢答器还具有LED指示显示电路,对应选手号,相应的LED就会亮起。 硬件设计与原理
以AT89C51单片机为核心,起着控制作用。系统包括数码管显示电路、复位电路、时钟电路、按键输入电路和LED灯显示电路。设计思路分为六个模块:复位电路、晶振电路模块、AT89C51、数码管显示电路、按键输入电路和LED灯显示电路这六个模块。
C语言源程序
#include<reg51.h> typedefunsigned char uchar; typedefunsigned int uint; #define KEYP1 #define DATAP0 sbitLED1=P2^0; sbitLED2=P2^1; sbitLED3=P2^2; sbitLED4=P2^3; sbitLED5=P2^4; sbitLED6=P2^5; sbit LED7=P2^6; sbitLED8=P2^7; sbitWEI1=P3^6; sbitWEI2=P3^7; sbitstart=P3^4; sbitstop=P3^5; ucharnum,temp,work_mode; uchar codelab[11]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d, 0x07,0x7f,0x6f,0x71}; voiddelay10ms(); voiddelay5ms(); void display_num(); voidinit_INT0(); voidinit_INT1(); voidkey_process(); voiddisplay_led(); voidinit_port();
void main() { init_INT0(); init_INT1(); init_port(); while(1) { EX1=1; while(work_mode) { display_num(); display_led(); } while(!work_mode) { EX1=0; num=0; P2=0xFF; WEI1=1; WEI2=1; DATA=~lab[10]; } } }
voidinit_port() { WEI1=0; WEI2=0; }
voiddelay10ms() { unsigned chara,b,c; for(c=1;c>0;c--) for(b=38;b>0;b--) for(a=130;a>0;a--); }
voiddelay5ms() { unsigned chara,b,c; for(c=1;c>0;c--) for(b=18;b>0;b--) for(a=130;a>0;a--); }
voiddisplay_num() { WEI1=0; WEI2=0; DATA=~lab[num/10]; WEI1=1; delay5ms();
WEI2=0; WEI1=0; DATA=~lab[num%10]; WEI2=1; delay5ms(); WEI2=0; WEI1=0; }
voidinit_INT0() { EX0=1; IT0=1; EA=1; }
voidinit_INT1() { EX1=1; IT1=1; EA=1; }
voidINT1_SIR()interrupt 2 { EA=0; temp=KEY; key_process(); EA=1; }
voidINT0_SIR()interrupt 0 { EA=0; if(!(start&stop)) delay10ms(); if(!(start&stop)) { if((!start)&stop)work_mode=1; if((!start)&start)work_mode=0; } EA=1; }
voidkey_process() { switch(temp) { case(~0x01):num=1;EX1=0;break; case(~0x02):num=2;EX1=0;break; case(~0x04):num=3;EX1=0;break; case(~0x08):num=4;EX1=0;break; case(~0x10):num=5;EX1=0;break; case(~0x20):num=6;EX1=0;break; case(~0x40):num=7;EX1=0;break; case(~0x80):num=8;EX1=0;break; default:break; } }
voiddisplay_led() { switch(num) { case1:LED1=0;break; case2:LED2=0;break; case3:LED3=0;break; case4:LED4=0;break; case5:LED5=0;break; case6:LED6=0;break; case7:LED7=0;break; case8:LED8=0;break; default:P2=0xFF;break; }
}
|