|
摘 要:本文介紹用單片機(jī)技術(shù)設(shè)計(jì)的電子搶答器,除能完成基本的搶答功能外,還可進(jìn)行加分、減分、存貯顯示各組分?jǐn)?shù)、答題限時(shí)搶答限時(shí)等功能.主要有選手搶答部分、主持人控制部分和數(shù)碼管顯示部分。優(yōu)點(diǎn)是利用單片機(jī)來設(shè)計(jì)搶答器,使以上問題得以解決,即使兩組的搶答時(shí)間相差幾微秒,也可分辨出哪組優(yōu)先答題。硬件電路簡(jiǎn)單,功能齊全,操作方便,是一款即先進(jìn)又實(shí)用的電子搶答器.
一、使用說明:首先由主持按下開始鍵,單片機(jī)開始倒計(jì)時(shí),選手們才可以開始搶答,單片機(jī)從30秒開始倒計(jì)時(shí),如果在30秒內(nèi)無人搶答,則自動(dòng)放棄,進(jìn)入下一題,若有人搶答,則單片機(jī)會(huì)自動(dòng)檢測(cè)是幾號(hào)首先搶答,做出判斷,之后數(shù)碼管會(huì)顯示,然后單片機(jī)重新倒計(jì)時(shí),從90秒開始,若在90秒內(nèi)回答完并回答正確,主持人可以按加分鍵,則所的分?jǐn)?shù)會(huì)顯示在選手的數(shù)碼管上,若回答錯(cuò)誤,則主持人可以通過減分鍵進(jìn)行減分,然后進(jìn)入下一題。- #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:時(shí)間,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) //倒計(jì)時(shí)函數(shù)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) //倒計(jì)時(shí)函數(shù)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 //定時(shí)器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秒 //燈倒計(jì)時(shí)
- 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 //定時(shí)器2中斷
- {
- P0=xs[n];
- P2=px2[n];
- P3=px3[n];
- n++;
- if(n>10)n=0;
- TH0=0Xfe;
- TL0=0X00;
- }
- ////////////////////////////////////////////////////////////////
- char jianpan() //鍵盤函數(shù)
- {
- 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; //數(shù)碼管顯示
- 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; //燈逐個(gè)滅,數(shù)碼管減一
- while(t) //30秒內(nèi)
- { 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)
- { //重新倒計(jì)時(shí)
- 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)
- { //重新倒計(jì)時(shí)
- 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; //重新倒計(jì)時(shí)
- 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
- }
復(fù)制代碼
|
-
捕獲.JPG
(146.47 KB, 下載次數(shù): 154)
下載附件
2020-1-8 21:03 上傳
-
-
搶答器文檔及其proteus仿真資料.zip
2020-1-8 21:02 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
30.71 KB, 下載次數(shù): 18, 下載積分: 黑幣 -5
|