至少六路搶答器,每路配備LED和搶答鍵,數碼管顯示倒計時,蜂鳴器發出提示音。 1.“開始鍵”按下,啟動20s倒計時,20s內無人搶答,一次長音提示,禁止搶答; 2.20s倒計時內有搶答鍵按下,對應LED點亮,一次短音提示,其他搶答鍵禁用; 3.若第一次搶答選手答錯,可二次搶答,但第一次搶答選手不可二次搶答; 4.“開始鍵”未按下,若“搶答鍵”按下,對應LED點亮,三次短音提示犯規; 5.加分項:選手搶答成功10s后,啟動回答倒計時60s功能,倒計時結束兩次短音提示。
這周做的搶答器,一鍵到底 不用按復位 五個功能都實現,可以穿插實現,代碼有注釋 就是寫的長了些,沒有分塊,在一個.c里
下面放了一個今天剛拍的照片
- #include <reg52.h> //頭文件
- #include <intrins.h>
- #define uchar unsigned char //uchar 代替 unsigned char
- #define uint unsigned int //同上
- void delayms(uint); //延時函數ms
- void display(uchar,uchar);//數碼管顯示
- void keypros(); //鍵盤(包含全功能)
- void delays(uint xs);//延時s
- void Play(uchar t);//提示音
- /*譯碼器*/
- sbit LSA=P1^5;
- sbit LSB=P1^6;
- sbit LSC=P1^7;
- /*按鍵*/
- sbit key_tt=P1^4; //正確
- sbit key_start=P3^6; //一次
- sbit key_start_second=P3^7; //二次
- sbit key1=P3^0; //選手1
- sbit key2=P3^1;
- sbit key3=P3^2;
- sbit key4=P3^3;
- sbit key5=P3^4;
- sbit key6=P3^5; //選手6
- /*蜂鳴器*/
- sbit beep=P2^6;
- /*LED*/
- sbit led1=P2^0; //選手1
- sbit led2=P2^1;
- sbit led3=P2^2;
- sbit led4=P2^3;
- sbit led5=P2^4;
- sbit led6=P2^5; //選手6
- uchar num1,num=60,miaoshi,miaoge,m=1,n=1,p=0,d=0,w1=1,w2=1,w3=1,w4=1,w5=1,w6=1;
- uchar code table[]={0x3f,0x06,0x5b,0x4f,
- 0x66,0x6d,0x7d,0x07,//共陰極數碼管數組 包含0~F
- 0x7f,0x6f,0x77,0x7c,
- 0x39,0x5e,0x79,0x71};
- void shumaguan(int i) //數碼管位選譯碼器
- {
- switch(i)
- {
- case 0:
- LSA=0;LSB=0;LSC=0;break;
- case 1:
- LSA=1;LSB=0;LSC=0;break;
- case 2:
- LSA=0;LSB=1;LSC=0;break;
- case 3:
- LSA=1;LSB=1;LSC=0;break;
- case 4:
- LSA=0;LSB=0;LSC=1;break;
- case 5:
- LSA=1;LSB=0;LSC=1;break;
- case 6:
- LSA=0;LSB=1;LSC=1;break;
- case 7:
- LSA=1;LSB=1;LSC=1;break;
- }
- }
-
- void Play(uchar t)//提示音
- {
- uint i;
- for(i=0;i<500;i++)
- {
- beep = ~beep;
- delayms(t);
- }
- beep = 0;
- }
-
- void delayms(uint xms) //延時ms 不準確
- {
- uint i,j;
- for(i=xms;i>0;i--)
- for(j=110;j>0;j--);
- }
-
- void delays(uint xs) //延時2s 不準確
- {
- uint i,z;
- uchar j; //定義兩個循環變量i、j
- for(z=xs;z>0;z--)
- for (i = 4165; i > 0; i--) //外層循環1000次
- for (j = 1240; j > 0; j--) ; //內層循環124次
- }
- void main()
- {
-
- TMOD=0x01; //設置定時器0為工作方式1
- TH0=(65536-45872)/256; //裝初值
- TL0=(65536-45872)%256;
- EA=1; //開總中斷
- ET0=1; //開定時器0中斷
- TR0=1; //啟動定時器0
-
- while(1)
- {
- //加分項 這里為了方便查看效果,60秒倒計時 改為18秒倒計時
- if(num==53&&(d==1||d==2||d==3||d==4||d==5||d==6))
- {
- Play(1);
- delayms(500);
- Play(1);
- delayms(500);
-
- EA=0; //開總中斷
- }
-
- display(miaoshi,miaoge);
- keypros(); //按鍵函數
- }
- }
- void display(uchar miaoshi,uchar miaoge)//顯示子函數
- {
- miaoshi=num/10;
- miaoge=num%10;
-
- shumaguan(0);
- P0=table[miaoshi];
- delayms(1);
- P0=0x00;
-
- shumaguan(1);
- P0=table[miaoge];
- delayms(1);
- P0=0x00;
- }
- void keypros() //按鍵函數
- {
-
- /*正常情況*/
- if (key_start==0) //檢測按鍵是否按下
- {
- delayms(10); //消除抖動
- if(key_start==0) //再次判斷按鍵是否按下,“開始鍵”按下
- {
- led1=1;
- led2=1;
- led3=1;
- led4=1;
- led5=1;
- led6=1;
- TR0=1;
- m=0;//初始值為1 只有按下開始鍵 m=0 不按下開始鍵 就搶答,犯規
- num=20;
- n=0;//標志位 只允許一個人搶答
- EA=1;
- }
- while(!key_start) //檢測按鍵是否松開
- display(miaoshi,miaoge);
- }
-
- if(num==0)//功能1 p標志位 只進行一次
- {
- if(p==0)
- {
- Play(1);
-
- Play(1);
-
- Play(1);
- delayms(500);
- TR0=0;//無人搶答 關閉倒計時
- n=1;//關閉搶答
- p=1;
- }
- }
-
- if(n==0)//只允許一個人搶答
- {
- m=0;//
-
- if(key1==0&&n==0) //檢測按鍵是否按下 只有n=0才能搶答,保證只有一個人搶答
- {
- delayms(10); //消除抖動
- if(key1==0&&n==0) //再次判斷按鍵是否按下
- {
- if(w1==1)// w1初始值為1;如果按下了二次搶答按鈕,w1=0,則不執行以下程序
- {
- TR0=0;
- led1=0;
- Play(1);
- n=1;//按下按鈕,標志位為1,不執行其他搶答程序
-
- /*以下 加分項*/
- delays(5);
-
- num=60;
- TR0=1;
- d=1;//說明 選手1 按下按鈕
- }
- }
-
- }
- if(key2==0&&n==0) //檢測按鍵是否按下
- {
- delayms(10); //消除抖動
- if(key2==0&&n==0) //再次判斷按鍵是否按下
- {
- if(w2==1)//如果二次按鈕按下,w2=0 說明答錯了 不進行下一次搶答
- {
- TR0=0;
- led2=0;
- Play(1);
- n=1;
- delays(1);
- //這個時間要改 5 才是10秒
- num=60;
- TR0=1;
- d=2; //選手2按下按鈕
- }
- }
-
- }
-
- if(key3==0&&n==0) //檢測按鍵是否按下
- {
- delayms(10); //消除抖動
- if(key3==0&&n==0) //再次判斷按鍵是否按下
- {
- if(w3==1)
- {
- TR0=0;
- led3=0;
- Play(1);
- n=1;
- delays(1);
- //這個時間要改 5 才是10秒
- num=60;
- TR0=1;
- d=3;
- }
- }
-
- }
-
- if(key4==0&&n==0) //檢測按鍵是否按下
- {
- delayms(10); //消除抖動
- if(key4==0&&n==0) //再次判斷按鍵是否按下
- {
- if(w4==1)
- {
- TR0=0;
- led4=0;
- Play(1);
- n=1;
- delays(1);
- //這個時間要改 5 才是10秒
- num=60;
- TR0=1;
- d=4;
- }
- }
-
- }
-
- if(key5==0&&n==0) //檢測按鍵是否按下
- {
- delayms(10); //消除抖動
- if(key5==0&&n==0) //再次判斷按鍵是否按下
- {
- if(w5==1)
- {
- TR0=0;
- led5=0;
- Play(1);
- n=1;
- delays(1);
- //這個時間要改 5 才是10秒
- num=60;
- TR0=1;
- d=5;
- }
- }
-
- }
-
- if(key6==0&&n==0) //檢測按鍵是否按下
- {
- delayms(10); //消除抖動
- if(key6==0&&n==0) //再次判斷按鍵是否按下
- {
- if(w6==1)
- {
- TR0=0;
- led6=0;
- Play(1);
- n=1;
- delays(1);
- //這個時間要改 5 才是10秒
- num=60;
- TR0=1;
- d=6;
- }
- }
-
- }
-
- }
-
- /*犯規情況功能4*/
- if(m==1)//不按下開始鍵 m=1
- {
- if (key_start!=0) //檢測按鍵是否按下 未按下則執行下面
- {
- led1=1;
- led2=1;
- led3=1;
- led4=1;
- led5=1;
- led6=1;
- if(key1==0&&key_start!=0) //開始鍵未按下,按下搶答器 執行下面
- {
復制代碼
|