完成搶答器系統(tǒng)的軟硬件設(shè)計與調(diào)試,系統(tǒng)主要功能要求如下:
1. 在給定電路圖基礎(chǔ)上,完成8路搶答器設(shè)計;
2. 搶答成功后,顯示組號,同時蜂鳴器響一聲;
3. 搶答成功后,顯示20秒答題倒計時,計時時間到蜂鳴器響一聲;
3. 根據(jù)答題正確與否進行加、減分并顯示累計分數(shù)。
4. 設(shè)主持人復(fù)位鍵;主持人加、減分鍵;
#include<reg51.h>
sbit key1=P0^0;
sbit key2=P0^1;
sbit key3=P0^2;
sbit key4=P0^3;
sbit key5=P0^4;
sbit key6=P0^5;
sbit key7=P0^6;
sbit key8=P0^7;
sbit k1=P3^6;
sbit k2=P3^7;
sbit k3=P3^3;
sbit wy=P3^4;
sbit wk_key=P3^5;
sbit ghr_key=P3^2;
bit qd_hd,speaker_permit;
bit grade_hxj;
unsigned char duanma[13]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0xa3,0xa1};
unsigned char fenshu[10]={0,0,0,0,0,0,0,0,0,0};
unsigned char weima[6]={0x01,0x02,0x04,0x08,0x10,0x20};
unsigned char xianshi[6]={0,0,0,0,0,0};
unsigned char saomiao_jishu, jishi,jishu,jishu1,jishu2,zuhao=0,fuhao1,jishu3,f_speaker;
unsigned char jishi,miao,fen;
unsigned int jishi1;
unsigned char data_out;
void chushihua (void)
{
zuhao=0; //組號 顯示 0,
TMOD=0X11;
EA=1; //設(shè)置初值;計時為0。
ET1=1;TR1=1;
ET0=1;TR0=1;
TH1=(65536-1000)/256;
TL1=(65536-1000)%256;
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
jishi=0;grade_hxj=0;
qd_hd=0;
speaker_permit=1;
}
void dtsm(void) //動態(tài)掃描子程序
{
fen=fenshu[zuhao] ;
xianshi[0]=duanma[zuhao/10];
xianshi[1]=duanma[zuhao%10];
xianshi[2]=duanma[miao/10];
xianshi[3]=duanma[miao%10];
xianshi[4]=duanma[fen/10];
xianshi[5]=duanma[fen%10];
saomiao_jishu++;
if(saomiao_jishu==6)
{
saomiao_jishu=0;
}
P2= weima[saomiao_jishu];//位碼
P1=xianshi[saomiao_jishu];//段碼
}
void preemptive_answer(void) //搶答子程序
{
if(qd_hd==0) //允 許 搶 答
{
if(key1==0)
{
zuhao=1; miao=20;qd_hd=1;
speaker_permit=0;grade_hxj=1;
}
if(key2==0)
{
zuhao=2; miao=20;qd_hd=1;
speaker_permit=0;grade_hxj=1;
}
if(key3==0)
{
zuhao=3; miao=20;qd_hd=1;
speaker_permit=0;grade_hxj=1;
}
if(key4==0)
{
zuhao=4; miao=20;qd_hd=1;
speaker_permit=0;grade_hxj=1;
}
if(key5==0)
{
zuhao=5; miao=20;qd_hd=1;
speaker_permit=0;grade_hxj=1;
}
if(key6==0)
{
zuhao=6; miao=20;qd_hd=1;
speaker_permit=0;grade_hxj=1;
}
if(key7==0)
{
zuhao=7; miao=20;qd_hd=1;
speaker_permit=0;grade_hxj=1;
}
if(key8==0)
{
zuhao=8; miao=20;qd_hd=1;
speaker_permit=0;grade_hxj=1;
}
}
if(k3==0) //開始
{
miao=10;qd_hd=0 ;
}
if(qd_hd==1) //計 數(shù)
{
jishu2++;
if(jishu2==200)
{
jishu2=0;
miao--;
if((miao==19)||(miao==0))
{
speaker_permit=1;
}
if(miao==1)speaker_permit=0;
if(miao==0xff)miao=0;
}
}
if(wk_key==0) //復(fù) 位
{
zuhao=0;
miao=0;
qd_hd=0;
fen=0;
grade_hxj=0;
}
if(grade_hxj==1)
{
if(k1==0) //加 分
{
fenshu[zuhao]=fenshu[zuhao]+1;
fen=fenshu[zuhao];
while(k1==0);
}
if(k2==0) //減 分
{
fenshu[zuhao]=fenshu[zuhao]-1;
fen=fenshu[zuhao];
while(k2==0);
}
}
}
void zd(void) interrupt 3 //蜂鳴 (中斷)
{
TH1=(65536-8000)/256;
TL1=(65536-8000)%256;
jishu2++;
if(jishu2==250)
{
jishu2=0;
miao--;
if(miao==0xff)miao=0;
}
if(miao==0)qd_hd=1;
dtsm();
preemptive_answer();
}
void zd1(void) interrupt 1 //蜂鳴(中斷)
{
TH0=(65536-1000)/256;
TL0=(65536-1000)%256;
if(speaker_permit==0)
{
f_speaker++;
if(f_speaker==1)
{
f_speaker=0;
ghr_key=~ghr_key;
}
}
if(wy==0)
{
zuhao++;
if(zuhao==9)
{
zuhao=0;
fen=fenshu[zuhao] ;
}
while(wy==0);
}
}
void main(void)
{
chushihua();
while(1);
}