基本功能 1、同時供 8 名選手或 8個代表隊參加比賽,分別用 8個按鈕 K1 ~ K8 表示。 2、設置一個系統搶答控制開關 K0,該開關由主持人控制。 3、搶答器具有鎖存與顯示功能。即選手按動按鈕,鎖存相應的編號,揚聲器發出聲響提示,并在七段數碼管上顯示選手號碼。選手搶答實行優先鎖存,優先搶答選手的編號一直保持到主持人將系統清除為止。 4、搶答器具有定時搶答功能,且一次搶答的時間由主持人設定(如 10秒)。當 主持人啟動 "開始"鍵后,定時器進行減計時。 5、參賽選手在設定的時間內進行搶答,搶答有效,定時器停止工作,顯示器上顯示選手的編號和搶答的時間,并保持到主持人將系統清除為止。在這段時間如果定時時間已到,無人搶答,本次搶答無效,系統報警并禁止搶答,定時顯示器上顯示FFF。 源代碼如下
- #include<reg51.h>
- typedef unsigned char uchar;
- typedef unsigned int uint;
- sbit K0=P3^0;// 開始搶答按鍵
- sbit beep=P3^7;// 蜂鳴器
- sbit D0=P3^1;// 指示燈
- sbit K1=P1^0;//1 號選手搶答按鍵
- sbit K2=P1^1;//2 號選手搶答按鍵
- sbit K3=P1^2;//3 號選手搶答按鍵
- sbit K4=P1^3;//4 號選手搶答按鍵
- sbit K5=P1^4;//5 號選手搶答按鍵
- sbit K6=P1^5;//6 號選手搶答按鍵
- sbit K7=P1^6;//7 號選手搶答按鍵
- sbit K8=P1^7;//8 號選手搶答按鍵
- sbit S1=P3^2;// 答 題 計 時 鍵
- sbit S2=P3^3;// 開始搶答時間調整鍵
- sbit S3=P3^4;// 答題計時時間調整鍵
- char s;
- uchar num=0;
- char time1;// 搶答時間
- char time2;// 答題限時時間
- uint m,n;//T0,T1 定時器定一秒時
- bit flag1,flag2,flag3,flag4; // 標志位
- bit aa,bb;// 時間調整標志位
- // 延時子函數
- void delay(uint z)
- {
- uint x,y; for(x=z;x>0;x--)
- for(y=120;y>0;y--);
- }
-
- uchar code table1[]={
- // 共陰數碼管段碼值
- 0x3f,0x06,0x5b,0x4f,
- 0x66,0x6d,0x7d,0x07,
- 0x7f,0x6f,0x77,0x7c,
- 0x39,0x5e,0x79,0x71
- };
- uchar code table2[]={
- // 共陰數碼管位碼值
- 0xfe,0xfd, 0xfb,0xf7
- };
- // 初始化子函數
- void init()
- {
- TMOD=0x11;
- TH0=(65536-2000)/256;
- TL0=(65536-2000)%256;
- TH1=(65536-2000)/256;
- TL1=(65536-2000)%256;
- ET0=1;
- ET1=1;
- EA=1;
- P0=0x00;
- time1=10;
- time2=10;
- flag2=1;
- }
- // 開始鍵掃描子函數
- void key1()
- {
- uchar i=100;
- if(K0==0)
- {
- delay(10);
- if(K0==0)
- {
- while(K0==0&&i)
- {
- i--;
- delay(10);
- }
- TR0=1;
- s=time1;
- m=0;
- flag1=1;
- flag2=1;
- flag3=1;
- num=0;
- beep=1;
- D0=1;
- flag4=0; // 清除違規標志位
- aa=0;
- bb=0;
- }
- }
- }
- // 選手搶答按鍵掃描子函數
- void key()
- {
- uchar i=100;
- if(K1==0)
- {
- delay(10);
- if(K1==0)
- {
- while(K1==0&&i)
- {
- i--;
- delay(10);
- }
- num=1; // 數碼管顯示 1 號 "1"
- TR0=0; // 關閉定時器 0, 時間停止
- TR1=1; // 打開定時器 1, 使揚聲器響一聲
- flag2=0; // 關閉開始鍵標志位 , 使再按其他七個鍵不會響應
- }
- }
- if(K2==0) // 下面七個鍵的處理同上
- {
- delay(10);
- if(K2==0)
- {
- while(K2==0&&i)
- {
- i--;
- delay(10);
- }
- num=2;
- TR0=0;
- TR1=1;
- flag2=0; // 重 要
- }
- }
- if(K3==0)
- {
- delay(10);
- if(K3==0)
- {
- while(K3==0&&i)
- {
- i--;
- delay(10);
- }
- num=3;
- TR0=0;
- TR1=1;
- flag2=0;
- }
- }
- if(K4==0)
- {
- delay(10);
- if(K4==0)
- {
- while(K4==0&&i)
- {
- i--;
- delay(10);
- }
- num=4;
- TR0=0;
- TR1=1;
- flag2=0;
- }
- }
- if(K5==0)
- {
- delay(10);
- if(K5==0)
- {
- while(K5==0&&i)
- {
- i--;
- delay(10);
- }
- num=5;
- TR0=0;
- TR1=1;
- flag2=0;
- }
- }
- if(K6==0)
- {
- delay(10);
- if(K6==0)
- {
- while(K6==0&&i)
- {
- i--;
- delay(10);
- }
- num=6;
- TR0=0;
- TR1=1;
- flag2=0;
- }
- }
- if(K7==0)
- {
- delay(10);
- if(K7==0)
- {
- while(K7==0&&i)
- {
- i--;
- delay(10);
- }
- num=7;
- TR0=0;
- TR1=1;
- flag2=0;
- }
- }
- if(K8==0)
- {
- delay(10);
- if(K8==0)
- {
- while(K8==0&&i)
- {
- i--;
- delay(10);
- }
- num=8;
- TR0=0;
- TR1=1;
- flag2=0;
- }
- }
- }
- // 數碼管顯示子函數
- void display()
- {
- if(flag1==1) // 開始鍵按下 , 開始計時搶答
- {
- if(num!=0) // 如果有人搶答 , 則顯示相應的幾號
- {
- P0=table1[num]; // 顯示幾號搶到了
- P2=table2[0]; delay(2); P0=0;
- P2=0xff;
復制代碼 限于篇幅,全部程序請從附件下載
|