仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
0.png (17.26 KB, 下載次數: 25)
下載附件
2019-6-16 01:34 上傳
本文設計出以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; }
}
|