|
摘 要:本文介紹用單片機技術設計的電子搶答器,除能完成基本的搶答功能外,還可進行加分、減分、存貯顯示各組分數、答題限時搶答限時等功能.主要有選手搶答部分、主持人控制部分和數碼管顯示部分。優點是利用單片機來設計搶答器,使以上問題得以解決,即使兩組的搶答時間相差幾微秒,也可分辨出哪組優先答題。硬件電路簡單,功能齊全,操作方便,是一款即先進又實用的電子搶答器.
一、使用說明:首先由主持按下開始鍵,單片機開始倒計時,選手們才可以開始搶答,單片機從30秒開始倒計時,如果在30秒內無人搶答,則自動放棄,進入下一題,若有人搶答,則單片機會自動檢測是幾號首先搶答,做出判斷,之后數碼管會顯示,然后單片機重新倒計時,從90秒開始,若在90秒內回答完并回答正確,主持人可以按加分鍵,則所的分數會顯示在選手的數碼管上,若回答錯誤,則主持人可以通過減分鍵進行減分,然后進入下一題。- #include<reg52.h>
- Static unsigned char dm[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
- static unsigned char px2[11]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0xff,0xff,0xff};
- static unsigned char px3[11]={0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xdf,0xbf,0x7f};
- static unsigned char xs[11]={0xc0,0xa4,0xc0,0xa4,0xc0,0xa4,0xc0,0xa4,0xc0,0xb0,0xc0};
- static unsigned char dj[4]={0};
- static unsigned char n,r;
- static unsigned char t=30; //t:時間,k:溢出
- static unsigned char k,k2=0;
- static unsigned char kk,p;
- static unsigned char fen1=20,fen2=20,fen3=20,fen4=20;
- ///////////////////////////////////////////////////////
- void djxs1(unsigned char t) //倒計時函數1
- {
- unsigned char i;
- if(t>23) dj[3]=~((~dj[3])>>1);
- if((t>16)&&(t<24)) dj[2]=~((~dj[2])>>1);
- if((t>8)&&(t<17)) dj[1]=~((~dj[1])>>1);
- if((t>0)&&(t<9)) dj[0]=~((~dj[0])>>1);
- for(i=0;i<4;i++)
- {
- SBUF=dj[i];
- while(!TI){}
- TI=0;
- }
- }
- /////////////////////////////////////////////
- void djxs2(unsigned char t) //倒計時函數2
- {
- unsigned char i;
- if(t>69) dj[3]=~((~dj[3])>>1);
- if((t>48)&&(t<70)) dj[2]=~((~dj[2])>>1);
- if((t>24)&&(t<49)) dj[1]=~((~dj[1])>>1);
- if((t>0)&&(t<25)) dj[0]=~((~dj[0])>>1);
- for(i=0;i<4;i++)
- {
- SBUF=dj[i];
- while(!TI){}
- TI=0;
- }
- }
- //////////////////////////////////////////////////////////
- void t1(void)interrupt 3 //定時器1中斷
- {
- TH1=0X15;
- TL1=0XA0;
- k++;
- if(k>20)
- {
- k=0;
- k2++;
- // if(t==90)
- // for(r=0;r<4;r++)dj[r]=0;
- if(kk)djxs1(t);
- if(p&&(k2==3)){k2=0;djxs2(t);} //3秒
- //1秒 //燈倒計時
- t--;
- xs[9]=dm[t/10];
- xs[10]=dm[t%10];
- if(t==0){for(r=0;r<4;r++)
- dj[r]=0;
- TR1=0;
- xs[9]=dm[3];
- xs[8]=dm[0];}
- }
- }
- ////////////////////////////////////////////////////////////
- void t0(void)interrupt 1 //定時器2中斷
- {
- P0=xs[n];
- P2=px2[n];
- P3=px3[n];
- n++;
- if(n>10)n=0;
- TH0=0Xfe;
- TL0=0X00;
- }
- ////////////////////////////////////////////////////////////////
- char jianpan() //鍵盤函數
- {
- unsigned char x,d=500;
- P1=0xff;
- while(P1==0xff);
- x=P1;
- while(d--);
- d=500;
- while(P1!=0xff);
- return x;
- }
- ////////////////////////////////////////////////////////
- main()
- {unsigned char x,y,m;
- // unsigned char k;
- IE=0X8a;
- //TMOD=0X01;
- TMOD=0X11;
- TH0=0Xfe;
- TL0=0Xb8;
- TR0=1; //數碼管顯示
- TH1=0X15;
- TL1=0XA0;
- loop: TR1=0;
- t=30;
- xs[8]=dm[0];
- xs[9]=dm[3];
- xs[10]=dm[0];
- for(m=0;m<4;m++)
- {dj[m]=0;
- }
- for(m=0;m<4;m++)
- {
- SBUF=dj[m];
- while(!TI){}
- TI=0;
- } //燈全亮
- while(1)
- {
- x=jianpan(); //掃描鍵盤
- switch(x)
- {
- case 0xef: //開始鍵按下
- { kk=1;
- p=0;
- t=30; //音樂
- TR1=1; //燈逐個滅,數碼管減一
- while(t) //30秒內
- { y=jianpan();
- //if(y&&0x0f!=0x0f)
- for(m=0;m<4;m++)
- {
- dj[m]=0;}
- k2=0;
- t=90;
- p=1;
- switch(y)
- {
- case 0xfe:{xs[8]=dm[1]; //一鍵按下
- kk=0;t=90;k2=0;
- while(1)
- { //重新倒計時
- if(P1==0xdf){fen1+=5;
- xs[0]=dm[fen1%10]; //加分
- xs[1]=dm[fen1/10];goto loop;}
- if(P1==0xbf){fen1-=5;
- xs[0]=dm[fen1%10]; //減分
- xs[1]=dm[fen1/10];goto loop;}
- }
- break;} //顯示一
- case 0xfd:{xs[8]=dm[2]; //二鍵按下
- kk=0;t=90;k2=0;
- while(1)
- {
- if(P1==0xdf){fen2+=5;
- xs[2]=dm[fen2%10];
- xs[3]=dm[fen2/10];goto loop;}
- if(P1==0xbf){fen2-=5;
- xs[2]=dm[fen2%10];
- xs[3]=dm[fen2/10];goto loop;}
- }
- break;} //顯示二
- case 0xfb:{xs[8]=dm[3]; //三鍵按下
- kk=0;t=90;k2=0;
- while(1)
- { //重新倒計時
- if(P1==0xdf){fen3+=5;
- xs[4]=dm[fen3%10];
- xs[5]=dm[fen3/10];goto loop;}
- if(P1==0xbf){fen3-=5;
- xs[4]=dm[fen3%10];
- xs[5]=dm[fen3/10];goto loop;}
- }
- break;} //顯示三
- case 0xf7:{xs[8]=dm[4]; //四鍵按下
- kk=0;t=90;k2=0; //重新倒計時
- while(1)
- {
- if(P1==0xdf){fen4+=5;
- xs[6]=dm[fen4%10];
- xs[7]=dm[fen4/10];goto loop;}
- if(P1==0xbf){fen4-=5;
- xs[6]=dm[fen4%10];
- xs[7]=dm[fen4/10];goto loop;}
- }
- break;} //顯示四
- default:break;
- }
- }
- goto loop;} //無人搶答
- default:break;} //開始switch
- } //總while
- }
復制代碼
|
|