仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
0.png (17.26 KB, 下載次數(shù): 25)
下載附件
2019-6-16 01:34 上傳
本文設(shè)計出以AT89C51單片機為核心的八路搶答器。直接采用了數(shù)字顯示器顯示和LED亮燈顯示,并可以利用復(fù)位電路進行復(fù)位的設(shè)計思想,它能根據(jù)不同的搶答輸入信號,經(jīng)過單片機的控制處理并產(chǎn)生不同的與輸入信號相對應(yīng)的輸出信號,最后通過LED數(shù)碼管顯示相應(yīng)的路數(shù),即使兩組的搶答時間相差幾微秒,也可分辨出是哪組優(yōu)先按下的按鍵,它充分利用了單片機系統(tǒng)的優(yōu)點,具有結(jié)構(gòu)簡單、功能強大、可靠性好、實用性強的特點。 本設(shè)計是以八路搶答為基本理念。考慮到依需設(shè)定顯示亮燈和選手號的功能,利用51單片機及外圍接口實現(xiàn)的搶答系統(tǒng),利用單片機的可以通過段碼和位碼控制的原理,將軟、硬件有機地結(jié)合起來,使得系統(tǒng)能夠正確地進行計時,同時使數(shù)碼管能夠正確地顯示時間。用開關(guān)做鍵盤輸出,LED指示電路發(fā)生提示。
工作原理
基本功能設(shè)計1. 同時供8名選手比賽,分別用8個按鈕 K1 ~ K8 表示。 2. 設(shè)置一個系統(tǒng)搶答控制開關(guān)K0,和系統(tǒng)復(fù)位開關(guān),由主持人控制。 3. 搶答器具有鎖存與顯示功能。即選手按動按鈕,鎖存相應(yīng)的編號,揚聲器發(fā)出聲響提示,并在七段數(shù)碼管上顯示選手號碼。選手搶答實行優(yōu)先鎖存,優(yōu)先搶答選手的編號一直保持到主持人將系統(tǒng)清除為止。 4. 搶答器還具有LED指示顯示電路,對應(yīng)選手號,相應(yīng)的LED就會亮起。 硬件設(shè)計與原理
以AT89C51單片機為核心,起著控制作用。系統(tǒng)包括數(shù)碼管顯示電路、復(fù)位電路、時鐘電路、按鍵輸入電路和LED燈顯示電路。設(shè)計思路分為六個模塊:復(fù)位電路、晶振電路模塊、AT89C51、數(shù)碼管顯示電路、按鍵輸入電路和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; }
}
|