一、 要求:
1、可供16組進行搶答。
2、具有定時搶答功能,并以倒計時方式現實,范圍10-60秒,默認是59s,可以添加按鍵來設計答題時間
3、主持人控制,主持人控制搶答開始和結束。
4、搶答成功后顯示搶答端序號和搶答時間,蜂鳴器響。
5、超過設定時間,無人搶答,本次搶答無效,報警,禁止搶答。
加注:12M晶振,數碼管共陽
二、電路圖
93a54475gdb2ad60697e6&690.jpg (97.3 KB, 下載次數: 194)
下載附件
2014-9-6 01:22 上傳
三、C51程序
//16路搶答器
//12M晶振
//P0---段碼 ,P1---位碼 ,P2---鍵盤接口
//調試:小代電子工作室
#include
#define uchar unsigned char
#define uint unsigned int
sbit FMQ=P3^7; //聲音報警
sbit KS=P1^6; //開始按鍵
sbit DT4=P1^0; //第四位選、
sbit DT3=P1^1; //第三位選
sbit DT2=P1^2; //第二位選
sbit DT1=P1^3; //第一位選
uchar scan0;
uchar scan1;
uchar key; //鍵值
uchar keycode;
uint m;
uint a;
uchar hao=0,sec_dat=0,sec_data,time; //對時間參數定義類型
uchar BZ=0,BZ1=0,BZ2=0; //標志位
// 1 2 3 A 4 5 6 B 7 8 9 10 11 12 13 14
ucharx[16]={0xee,0xde,0xbe,0x7e,0xed,0xdd,0xbd,0x7d,0xeb,0xdb,0xbb,0x7b,0xe7,0xd7,0xb7,0x77};//鍵值
uchar s[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90 };//數碼管顯示碼 共陽
//uchar s[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};//數碼管顯示碼 共陰
//******************************
//延時函數
//*******************
void delay1ms(uint i)
{
uchar j;
while(i--)
{
for(j=0;j<125;j++){;} //1ms基準延遲程序
}
}
//****************************
//初始化函數
//****************************
void Init(){
TMOD=0x02; //定時器0,方式2
TH0=155; //定時器初值
TL0=155;
ET0=1; //開定時器中斷
//TR0=1; //開定時器
EA=1; //總中斷開關
KS=1; //開始按鍵
FMQ=0; //關蜂鳴器
key=17; //按鍵值初始化,非搶答序號,搶答序號為1-16.
a=10;
}
//******************
//定時器函數
//功能:定時器中斷函數,對時間定時,100us中斷一次
//參數:hao:100us;sec_dat:10ms;sec_data:1s
//********************
timer0()interrupt 1 using 1 //使用定時器0對時間計時
{
hao++; //參數hao加到10就是10ms,到100為10ms
if(hao==100){ //10ms
hao=0;
sec_dat++; //10ms sec_dat表示10ms
if(sec_dat==100){ //1s
sec_dat=0;
sec_data++; //sec_data表示1s
if(sec_data==50){TR0=0;BZ1=0;BZ=1;BZ2=0;}//搶答時間到,50s,關閉定時器,本次搶答無效
}
}
}
//*************************
//顯示開始函數 參數1為時間
//***************************8
void disp(){
DT1=1;
DT2=0;
DT3=0;
DT4=0;
P0=s[(50-sec_data)/10];
// P1=0x08;
delay1ms(2);
DT1=0;
DT2=1;
DT3=0;
DT4=0;
P0=s[(50-sec_data)];
// P1=0x04;
delay1ms(2);
DT1=0;
DT2=0;
DT3=1;
DT4=0;
P0=s[0]; // - 共陽
//P0=0x40; // - 共陰
//P1=0x02;
delay1ms(2);
DT1=0;
DT2=0;
DT3=0;
DT4=1;
P0=s[0]; // - 共陽
//P0=0x40; // - 共陰
//P1=0x01;
delay1ms(2);
}
//*************************
//顯示函數 參數1為時間,參數2為按鍵鍵值
//***************************8
void disp1(){
DT1=1;
DT2=0;
DT3=0;
DT4=0;
P0=s[(50-sec_data)/10];
//P1=0x08;
delay1ms(2);
DT1=0;
DT2=1;
DT3=0;
DT4=0;
P0=s[(50-sec_data)];
//P1=0x04;
delay1ms(2);
DT1=0;
DT2=0;
DT3=1;
DT4=0;
P0=s[(key+1)/10];
// P1=0x02;
delay1ms(2);
DT1=0;
DT2=0;
DT3=0;
DT4=1;
P0=s[(key+1)];
// P1=0x01;
delay1ms(2);
}
//************************************
//矩陣鍵盤掃描函數,返回按鍵值
//********************************
uchar scan() //掃描鍵值的子程序
{
P2=0x0f;
scan0=P1;
delay1ms(20);
if(scan0!=0x0f) //判鍵是否按下
{
scan0=P2;
if(scan0!=0x0f) //二次判鍵是否按下
{
P2=0xf0; //線反轉法的核心
delay1ms(20);
scan1=P2;
keycode=scan0|scan1; //組合成鍵編碼
for(m=0;m<16;m++)
{
if(keycode==x[m]) //查表得鍵值
{
key=m;
}
}
}
}
return(key);
}
|