抢答器(功能很全)
功能很全,具有:6位抢答,分数显示,抢答有效时间显示和设定(每一次抢答前都可设定),答题时间显示并设置(每次均可设置),分数有负数显示,音乐,答题时间到报警,分数加减功能,具体自己验证
连接图如下:
程序如下:
#include
#include #define uchar unsigned char #define uint unsigned int #define tt 3 sbit jia = P2^6; sbit jian =P2^7; uint n;
//-----------------------------,,,,,,,,,, sbit per1=P1^0; sbit per2=P1^1; sbit per3=P1^2; sbit per4=P1^3; sbit per5=P1^4; sbit per6=P1^5; sbit zcr=P1^6;
//------------------------------ sbit led1=P3^0; //低有效 sbit led2=P3^1;
sbit led3=P3^2; sbit led4=P3^3; sbit led5=P3^4; sbit led6=P3^5; sbit zcr_led=P3^6; sbit speaker=P3^7; bit qd; bit pt;
uchar code seg_table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; uchar gro_num; uchar key_num; int data fenshu[7]; uchar shi,ge;
uchar aa,bb,a,b,c=0,d=10,e=5,f=30; void hhhhhh();
unsigned char er=0,ff,gg=0,ww; //n为节拍常数变量 unsigned char code music_tab[] ={
0x17,0x03, 0x16,0x03, 0x17,0x01, 0x16,0x03, 0x17,0x03,
0x16,0x03, 0x15,0x01, 0x16,0x02,
0x16,0x0D, 0x17,0x03, 0x10,0x03,
0x10,0x0E, 0x15,0x04, 0x16,0x03,
0x17,0x01, 0x16,0x03, 0x15,0x01,
0x10,0x03, 0x15,0x03, 0x17,0x03,
0x16,0x03, 0x15,0x03, 0x16,0x01,
0x17,0x03, 0x16,0x03, 0x17,0x03,
0x16,0x03, 0x15,0x01, 0x16,0x02,
0x16,0x0D, 0x17,0x03, 0x10,0x03,
0x10,0x0E, 0x15,0x04, 0x19,0x03,
0x19,0x01, 0x19,0x03, 0x17,0x01,
0x16,0x03, 0x16,0x03, 0x17,0x03,
0x16,0x03, 0x15,0x03, 0x15,0x00,
0x10,0x03, 0x16,0x03, 0x0F,0x01, 0x17,0x03, 0x16,0x02, 0x10,0x03, 0x17,0x01, 0x10,0x03, 0x16,0x03, 0x0F,0x01, 0x1A,0x03, 0x16,0x02, 0x10,0x03, 0x15,0x03, 0x15,0x03, 0x17,0x03, 0x16,0x03, 0x16,0x0D, 0x15,0x03, 0x16,0x03, 0x15,0x03, 0x15,0x03, 0x17,0x03, 0x19,0x03, 0x16,0x0D, 0x10,0x0D,
};
void delay1 (unsigned char m) //控制频率延时 {
unsigned i=3*m; while(--i); }
void delayms(unsigned char ff) //豪秒延时子程序 {
while(--ff); //采用while(--a) 不要采用while(a--); }
void delay(uint t)//延时数-------------- { uint s; while(t--) for(s=0;s
void jiance()//模拟系统检测函数
{ unsigned char p,m; //m为频率常数变量 unsigned char i=0; TMOD&=0xf0; TMOD|=0x10;
TH1=0xd8;TL1=0xef; IE=0x8a; TH0=0x3c;
TL0=0xb0;
a=1;TR0=1;aa=40;ww=1; while(1) {
a: p=music_tab[i]; if(p==0x00) break; else if(p==0xff) { i=i+1;delayms(30);TR1=0; goto a;} else { m=music_tab[i++]; er=music_tab[i++];}
gg=0; TR1=1; while(er!=0)
//开定时器1
{ speaker=~speaker;delay1(m); } TR1=0; if(aa==0) break; //关定时器1 } }
void wuda() {
P0= seg_table[aa]; P2=0xfe; delay(tt); }
void dati1() { if(a==2)
{ P2=0xfe;P0=seg_table[b]; delay(tt) ; }
P2=0xfb ;
P0=seg_table[shi]; delay(tt); P2=0xf7;
P0=seg_table[ge]; delay(tt); if(c==1) {P2=0xfd; P0=0x40; delay(tt);} if(a!=2)
{ P2=0xfe; P0=seg_table[gro_num]; delay(tt); } }
void init() //初始化--------------------- { uchar i; speaker=0; gro_num=0;
gg=1; qd=0; TH0=0x3c; TL0=0xb0; TMOD=0x11; TH1=0x3c; TL1=0xb0; TR1=0; EA=1; ET0=1; ET1=1; TR0=0; aa=e; bb=30; shi=ge=0; for(i=0;i
void disp() { switch(gro_num) { case 1:led1=!led1;break; case 2:led2=!led2;break; case 3:led3=!led3;break; case 4:led4=!led4;break; case 5:led5=!led5;break; case 6:led6=!led6;break; default: break; } }
bit ZCR_Key( )//主持人按键-------------- { zcr=1; if(zcr==0) { delay(5); zcr=1; if(zcr==0)
pt=!pt; } while(zcr==0); zcr_led=!zcr_led; //按键释放后灯 } return(pt); }
void jjfen()///记分函---------------- {
if(fenshu[gro_num]>0 )
{ shi=fenshu[gro_num]/10; ge=fenshu[gro_num]%10; dati1(); if(!jia) { delay(3); if(!jia) fenshu[gro_num]++; shi=fenshu[gro_num]/10;
ge=fenshu[gro_num]%10; while(!jia) dati1(); } if(!jian) { delay(3); if(!jian) fenshu[gro_num]--; shi=fenshu[gro_num]/10; ge=fenshu[gro_num]%10; while(!jian) dati1(); } }
if(fenshu[gro_num]==0) { shi=fenshu[gro_num]/10;
ge=fenshu[gro_num]%10; dati1(); if(!jia) { delay(3); if(!jia) fenshu[gro_num]++; shi=fenshu[gro_num]/10; ge=fenshu[gro_num]%10; while(!jia) dati1(); } if(!jian) { delay(3); if(!jian) fenshu[gro_num]--; fenshu[gro_num]=0-fenshu[gro_num]; shi=fenshu[gro_num]/10; ge=fenshu[gro_num]%10; while(!jian) {c=1; dati1();} c=0; fenshu[gro_num]=0-fenshu[gro_num]; } }
if(fenshu[gro_num]
fenshu[gro_num]=0-fenshu[gro_num]; shi=fenshu[gro_num]/10; ge=fenshu[gro_num]%10; while(!jia) dati1(); fenshu[gro_num]=0-fenshu[gro_num]; } if(!jian) { delay(3); if(!jian) fenshu[gro_num]--;
fenshu[gro_num]=0-fenshu[gro_num] ; shi=fenshu[gro_num]/10; ge=fenshu[gro_num]%10; while(!jian) dati1(); fenshu[gro_num]=0-fenshu[gro_num]; } c=0; } }
//????????
void scan_key() //组号判别--------------------- { P1=0x3f; if(P1!=0x3f) { delay(5); P1=0x3f; if(P1!=0x3f) { key_num=P1^0x3f; switch(key_num) { case 1: { gro_num=1; qd=1; break; }
} }
} }
void main() {
init(); jiance(); init(); nn: while(1)
case 2: { gro_num=2; qd=1; break; }
case 4: { gro_num=3; qd=1; break; }
case 8: { gro_num=4; qd=1; break; }
case 16: { gro_num=5; qd=1; break; }
case 32: { gro_num=6; qd=1; break; }
default : break;
{
while(ZCR_Key( )==0) { P2=0x00; P0=0x40; jia=1; jian=1; zcr=1; if(jia==0) {
delay(3); if(jia==0) { while(jia==0); while(zcr) { P2=0xfe;P0=seg_table[e]; delay(2); if(jia==0&&e0) { e--; while(jian==0);} } while(zcr==0);
} }
if(jian==0) { delay(3); if(jian==0) {while(jian==0); while(zcr)
{ while(zcr&&jia&&jian) { P2=0xfb;P0=seg_table[f/10];delay(3); P2=0xf7;P0=seg_table[f%10];delay(3); if(jia==0&&f=0) { f--; while(jian==0);}
}
}
while(zcr==0);
}
}
}
aa=e;
b=f;
if(ZCR_Key( ))
{
speaker=1;TR1=1;
a=1; TR0=1;
while( gro_num==0)
{ wuda();
scan_key( );
if(aa==0)
{
TR0=0;
pt=0;
aa=e;
speaker=1;
zcr_led=1;
P0=0x40;
P2=0x00;
delay(1500);
speaker=0 ;
goto nn;
}
}
TR0=0;
speaker=1;TR1=1;
aa=e;
disp();
while(qd)
{ a=0;TR0=1;
jjfen();
qd=ZCR_Key( );
if(b==d)
{a=2;
while(qd)
{
jjfen();
qd=ZCR_Key( );
if(b==0)
TR0=0;speaker=1;TR1=1;speaker=1;TR1=1; }
}
}
}
qd=0;
gro_num=0;
P3=0x7f;
P2=0x00;
P0=0x40;
}
}
void Timer0_Ser_Fun( ) interrupt 1 using 1
{ if(a==1)
{
TH0=0x3c;
TL0=0xb0;
n++;
if(n==20)
{ aa--;n=0;}
if(ww)
{ switch(aa)
{case 36:
{P0=0x01;
P2=0x00 ;
P3=0x7e;}
break;
case 31:
{P3=0x7d;
P0=0x40;}
break;
case 26:
P0=0x08;}
break;
case 21:
{ P3=0x77;
P0=0x30; }
break;
case 16:
{P3=0x6f;
P0=0x06;}
break;
case 11:
{P3=0x5f;
P0=0x7f;}
break;
case 6:
{P3=0xbf;
P0=0x00;
P2=0xff; }
break;
case 1:
P3=0x7f;
break;
case 0: {TR0=0;aa=0;ww=0;}
break;
default : break;
}
}
}
if(a==0)
{
TH0=0x3c;
TL0=0xb0;
n++;
if(n==20)
{ b--;n=0;}
}
if(a==2)
{
TH0=0x3c;
n++;
if(n==20)
{speaker=1;TR1=1;b--;n=0;}
}
}
void Timer0_Ser_Fu( ) interrupt 3 using 0
{ if(gg==0)
{TH1=0xd8;
TL1=0xef;
er--;
}
else
{TH1=0x3c;
TL1=0xb0;
bb--;
if(bb==0)
{
speaker=0;
TR1=0;
bb=15;
}
} //加这个中断原因是为了主持人按键后喇叭发言且不 } //影响组员按键;
来自周口师范学院物理系