国产免费AV|泡泡玛特欧洲总部将设在伦敦|中文天堂网www新版资源在线|一本久道综合在线中文|国精产品一二三产区的使用方法|香蕉鱼在线观看|www.27eee
ELEOK
標(biāo)題:
一款基于51單片機(jī)技術(shù)的電子搶答器protues仿真
[打印本頁]
作者:
coolice
時間:
2020-1-22 23:54
標(biāo)題:
一款基于51單片機(jī)技術(shù)的電子搶答器protues仿真
本文介紹用單片機(jī)技術(shù)設(shè)計(jì)的電子搶答器,除能完成基本的搶答功能外,還可進(jìn)行加分、減分、存貯顯示各組分?jǐn)?shù)、答題限時搶答限時等功能.主要有選手搶答部分、主持人控制部分和數(shù)碼管顯示部分。優(yōu)點(diǎn)是利用單片機(jī)來設(shè)計(jì)搶答器,使以上問題得以解決,即使兩組的搶答時間相差幾微秒,也可分辨出哪組優(yōu)先答題。硬件電路簡單,功能齊全,操作方便,是一款即先進(jìn)又實(shí)用的電子搶答器.
一、使用說明:首先由主持按下開始鍵,單片機(jī)開始倒計(jì)時,選手們才可以開始搶答,單片機(jī)從30秒開始倒計(jì)時,如果在30秒內(nèi)無人搶答,則自動放棄,進(jìn)入下一題,若有人搶答,則單片機(jī)會自動檢測是幾號首先搶答,做出判斷,之后數(shù)碼管會顯示,然后單片機(jī)重新倒計(jì)時,從90秒開始,若在90秒內(nèi)回答完并回答正確,主持人可以按加分鍵,則所的分?jǐn)?shù)會顯示在選手的數(shù)碼管上,若回答錯誤,則主持人可以通過減分鍵進(jìn)行減分,然后進(jìn)入下一題。
1.jpg
(144.59 KB)
下載附件
2020-1-22 23:52 上傳
#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) //倒計(jì)時函數(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ù)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秒 //燈倒計(jì)時
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() //鍵盤函數(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; //燈逐個滅,數(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ì)時
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ì)時
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ì)時
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ù)制代碼
搶答器文檔及其proteus仿真資料.zip
(30.71 KB, 售價: 1 E幣)
2020-1-22 23:53 上傳
點(diǎn)擊文件名下載附件
售價: 1 E幣
[記錄]
[
購買
]
歡迎光臨 ELEOK (http://www.afoofa.cn/)
Powered by Discuz! X5.0