搶答器具有數(shù)據(jù)鎖存和顯示功能.當某一路搶答成功時.發(fā)光二極管立即點亮.并在該電路上顯示該路的號數(shù).直到主持人按復(fù)位開關(guān)為止.此時其他人搶答無效。
搶答器具有定時搶答功能.且搶答時間可以由主持人設(shè)定(如97s).當主持人按下“開始”按鈕后.要求定時器立即倒計時.并在顯示器上顯示時間.同時發(fā)出“滴”的聲響。
在設(shè)定的時間內(nèi)搶答.則搶答有效.定時器停止工作.顯示器上顯示選手的編號和搶答時刻的時間.并保持到主持人將系統(tǒng)清零
如果定時器的時間已到.卻沒有選手搶答.則本次搶答無效.系統(tǒng)會短暫的報警.并且封鎖輸入電路禁止選手超時搶答.時間顯示器上顯示00.
16路搶答器仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
壓縮包里面有完整論文:
單片機源碼:
- #include<reg52.h> //包含頭文件,一般情況不需要改動,頭文件包含特殊功能寄存器的定義
- #define DataPort P0 //定義數(shù)據(jù)端口 程序中遇到DataPort 則用P0 替換
- #define uchar unsigned char; //定義數(shù)據(jù)類型 程序中遇到unsigned char 則用uchar替換
- #define uint unsigned int; //定義數(shù)據(jù)類型 程序中遇到unsigned int 則用uint替換
- sbit add=P2^0;
- sbit jian=P2^1;
- sbit beep=P2^2; //定義報警輸入端口
- sbit start=P2^3;
- sbit WEI=P2^7; //定義鎖存使能端口 位鎖存
- sbit DUAN=P2^6; //定義鎖存使能端口 段鎖存
- sbit key1=P1^0;
- sbit key2=P1^1;
- sbit key3=P1^2;
- sbit key4=P1^3;
- sbit key5=P1^4;
- sbit key6=P1^5;
- sbit key7=P1^6;
- sbit key8=P1^7;
- sbit key9=P3^0;
- sbit key10=P3^1;
- sbit key11=P3^2;
- sbit key12=P3^3;
- sbit key13=P3^4;
- sbit key14=P3^5;
- sbit key15=P3^6;
- sbit key16=P3^7;
- uchar code dofly_DuanMa[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};// 顯示段碼值0~9
- uchar code dofly_WeiMa[10]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//分別對應(yīng)相應(yīng)的數(shù)碼管點亮,即位碼
- uchar code table[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
- uchar TempData[8]; //存儲顯示值的全局變量
- //函數(shù)聲明
- void DelayUs2x(unsigned char t);
- void DelayMs(unsigned char t);
- void Delay(unsigned char t);
- void Display(unsigned char FirstBit,unsigned char Num);
- void check1();
- void check2();
- void keyscan();
- uchar n,m,num,t,time;
- bit flag;
- /*---------------------------------------------------
- 主函數(shù)
- ---------------------------------------------------*/
- void main (void)
- {
- EA=1;
- TMOD=0x11;
- TH0=(65536-50000)/256;//這是50ms的
- TL0=(65536-50000)%256;
- ET0=1;
- TR0=0;
- TH1=(65536-50000)/256;//這是50ms的
- TL1=(65536-50000)%256;
- ET1=1;
- TR1=1;
- time=97;
- num=0;
- flag=0;
- while (1) //主循環(huán)
- {
- TempData[2]=dofly_DuanMa[time/10];//分解顯示信息,如要顯示68,則68/10=6 68%10=8
- TempData[3]=dofly_DuanMa[time%10];
- if(num!=0)
- m=1;
- if(start==0)
- {
- DelayMs(10);
- if(start==0)
- {
- flag=1;
- while(!start);
- }
- }
- if(add==0)
- {
- DelayMs(10);
- if(add==0)
- {
- time++;
- while(!add);
- }
- }
- if(jian==0)
- {
- DelayMs(10);
- if(jian==0)
- {
- time--;
- while(!jian);
- }
- }
- if(time>=99)
- time=99;
- if(flag==0)
- {
- if(num!=0)
- m=1;
- keyscan();
- check2();
- }
- if(flag==1)
- {
- TR0=1;
- if(num!=0)
- m=1;
- keyscan();
- check1();
- }
- //主循環(huán)中添加其他需要一直工作的程序
- }
- }
- void timer_t0() interrupt 1
- {
- TH0=(65536-50000)/256;//這是50ms的
- TL0=(65536-50000)%256;
- t++;
- beep=0;
- if(t==20)//設(shè)置為20,就是1s為高1s為低
- {
- beep=1;
- t=0;
- time--;
- TempData[2]=dofly_DuanMa[time/10];//分解顯示信息,如要顯示68,則68/10=6 68%10=8
- TempData[3]=dofly_DuanMa[time%10];
- if(time<=0)
- {
- time=0;
- }
- }
- }
- void timer_t1() interrupt 3
- {
- TH1=(65536-50000)/256;//這是50ms的
- TL1=(65536-50000)%256;
- Display(0,8); //數(shù)碼管顯示函數(shù)
- }
- void check1()
- {
- if(num==1)
- {
- TempData[0]=dofly_DuanMa[num/10];//分解顯示信息,如要顯示68,則68/10=6 68%10=8
- TempData[1]=dofly_DuanMa[num%10];
- TempData[4]=table[0];
- beep=1;
- Display(0,8); //數(shù)碼管顯示函數(shù)
- TR0=0;
- while(m);
- }
- if(num==2)
- {
- TempData[0]=dofly_DuanMa[num/10];//分解顯示信息,如要顯示68,則68/10=6 68%10=8
- TempData[1]=dofly_DuanMa[num%10];
- TempData[4]=table[1];
- beep=1;
- Display(0,8); //數(shù)碼管顯示函數(shù)
- TR0=0;
- while(m);
- }
- if(num==3)
- {
- TempData[0]=dofly_DuanMa[num/10];//分解顯示信息,如要顯示68,則68/10=6 68%10=8
- TempData[1]=dofly_DuanMa[num%10];
- TempData[4]=table[2];
- beep=1;
- Display(0,8); //數(shù)碼管顯示函數(shù)
- TR0=0;
- while(m);
- }
- if(num==4)
- {
- TempData[0]=dofly_DuanMa[num/10];//分解顯示信息,如要顯示68,則68/10=6 68%10=8
- TempData[1]=dofly_DuanMa[num%10];
- TempData[4]=table[3];
- beep=1;
- Display(0,8); //數(shù)碼管顯示函數(shù)
- TR0=0;
- while(m);
- }
- if(num==5)
- {
- TempData[0]=dofly_DuanMa[num/10];//分解顯示信息,如要顯示68,則68/10=6 68%10=8
- TempData[1]=dofly_DuanMa[num%10];
- TempData[4]=table[4];
- beep=1;
- Display(0,8); //數(shù)碼管顯示函數(shù)
- TR0=0;
- while(m);
- }
- if(num==6)
- {
- TempData[0]=dofly_DuanMa[num/10];//分解顯示信息,如要顯示68,則68/10=6 68%10=8
- TempData[1]=dofly_DuanMa[num%10];
- TempData[4]=table[5];
- beep=1;
- Display(0,8); //數(shù)碼管顯示函數(shù)
- TR0=0;
- while(m);
- }
- if(num==7)
- {
- TempData[0]=dofly_DuanMa[num/10];//分解顯示信息,如要顯示68,則68/10=6 68%10=8
- TempData[1]=dofly_DuanMa[num%10];
- TempData[4]=table[6];
- beep=1;
- Display(0,8); //數(shù)碼管顯示函數(shù)
- TR0=0;
- while(m);
- }
- if(num==8)
- {
- TempData[0]=dofly_DuanMa[num/10];//分解顯示信息,如要顯示68,則68/10=6 68%10=8
- TempData[1]=dofly_DuanMa[num%10];
- TempData[4]=table[7];
- beep=1;
- Display(0,8); //數(shù)碼管顯示函數(shù)
- TR0=0;
- while(m);
- }
- if(num==9)
- {
- TempData[0]=dofly_DuanMa[num/10];//分解顯示信息,如要顯示68,則68/10=6 68%10=8
- TempData[1]=dofly_DuanMa[num%10];
- TempData[5]=table[0];
- beep=1;
- Display(0,8); //數(shù)碼管顯示函數(shù)
- TR0=0;
- while(m);
- }
- if(num==10)
- {
- TempData[0]=dofly_DuanMa[num/10];//分解顯示信息,如要顯示68,則68/10=6 68%10=8
- TempData[1]=dofly_DuanMa[num%10];
- TempData[5]=table[1];
- beep=1;
- Display(0,8); //數(shù)碼管顯示函數(shù)
- TR0=0;
- while(m);
- }
- if(num==11)
- {
- TempData[0]=dofly_DuanMa[num/10];//分解顯示信息,如要顯示68,則68/10=6 68%10=8
- TempData[1]=dofly_DuanMa[num%10];
- TempData[5]=table[2];
- beep=1;
- Display(0,8); //數(shù)碼管顯示函數(shù)
- TR0=0;
- while(m);
- }
- if(num==12)
- {
- TempData[0]=dofly_DuanMa[num/10];//分解顯示信息,如要顯示68,則68/10=6 68%10=8
- TempData[1]=dofly_DuanMa[num%10];
- TempData[5]=table[3];
- beep=1;
- Display(0,8); //數(shù)碼管顯示函數(shù)
- TR0=0;
- while(m);
- }
- if(num==13)
- {
- TempData[0]=dofly_DuanMa[num/10];//分解顯示信息,如要顯示68,則68/10=6 68%10=8
- TempData[1]=dofly_DuanMa[num%10];
- TempData[5]=table[4];
- beep=1;
- Display(0,8); //數(shù)碼管顯示函數(shù)
- TR0=0;
- while(m);
- }
- if(num==14)
- {
- TempData[0]=dofly_DuanMa[num/10];//分解顯示信息,如要顯示68,則68/10=6 68%10=8
- TempData[1]=dofly_DuanMa[num%10];
- TempData[5]=table[5];
- beep=1;
- Display(0,8); //數(shù)碼管顯示函數(shù)
- TR0=0;
- while(m);
- }
- if(num==15)
- {
- TempData[0]=dofly_DuanMa[num/10];//分解顯示信息,如要顯示68,則68/10=6 68%10=8
- TempData[1]=dofly_DuanMa[num%10];
- TempData[5]=table[6];
- beep=1;
- Display(0,8); //數(shù)碼管顯示函數(shù)
- TR0=0;
- while(m);
- }
- if(num==16)
- {
- TempData[0]=dofly_DuanMa[num/10];//分解顯示信息,如要顯示68,則68/10=6 68%10=8
- TempData[1]=dofly_DuanMa[num%10];
- TempData[5]=table[7];
- beep=1;
- Display(0,8); //數(shù)碼管顯示函數(shù)
- TR0=0;
- while(m);
- }
- }
- void check2()
- {
- if(num==1)
- {
- TempData[0]=dofly_DuanMa[num/10];//分解顯示信息,如要顯示68,則68/10=6 68%10=8
- TempData[1]=dofly_DuanMa[num%10];
- TempData[2]=0x40;//分解顯示信息,如要顯示68,則68/10=6 68%10=8
- TempData[3]=0x40;
- TempData[4]=table[0];
- Display(0,8); //數(shù)碼管顯示函數(shù)
- TR0=0;
- while(m);
- }
- if(num==2)
- {
- TempData[0]=dofly_DuanMa[num/10];//分解顯示信息,如要顯示68,則68/10=6 68%10=8
- TempData[1]=dofly_DuanMa[num%10];
- TempData[2]=0x40;//分解顯示信息,如要顯示68,則68/10=6 68%10=8
- TempData[3]=0x40;
- TempData[4]=table[1];
- Display(0,8); //數(shù)碼管顯示函數(shù)
- TR0=0;
- while(m);
- }
- if(num==3)
- {
- TempData[0]=dofly_DuanMa[num/10];//分解顯示信息,如要顯示68,則68/10=6 68%10=8
- TempData[1]=dofly_DuanMa[num%10];
- TempData[2]=0x40;//分解顯示信息,如要顯示68,則68/10=6 68%10=8
- TempData[3]=0x40;
- TempData[4]=table[2];
- Display(0,8); //數(shù)碼管顯示函數(shù)
- TR0=0;
- while(m);
- }
- if(num==4)
- {
- TempData[0]=dofly_DuanMa[num/10];//分解顯示信息,如要顯示68,則68/10=6 68%10=8
- TempData[1]=dofly_DuanMa[num%10];
- TempData[2]=0x40;//分解顯示信息,如要顯示68,則68/10=6 68%10=8
- TempData[3]=0x40;
- TempData[4]=table[3];
- Display(0,8); //數(shù)碼管顯示函數(shù)
- TR0=0;
- while(m);
- }
- if(num==5)
- {
- TempData[0]=dofly_DuanMa[num/10];//分解顯示信息,如要顯示68,則68/10=6 68%10=8
- TempData[1]=dofly_DuanMa[num%10];
- TempData[2]=0x40;//分解顯示信息,如要顯示68,則68/10=6 68%10=8
- TempData[3]=0x40;
- TempData[4]=table[4];
- Display(0,8); //數(shù)碼管顯示函數(shù)
- TR0=0;
- while(m);
- }
- if(num==6)
- {
- TempData[0]=dofly_DuanMa[num/10];//分解顯示信息,如要顯示68,則68/10=6 68%10=8
- TempData[1]=dofly_DuanMa[num%10];
- TempData[2]=0x40;//分解顯示信息,如要顯示68,則68/10=6 68%10=8
- TempData[3]=0x40;
- TempData[4]=table[5];
- Display(0,8); //數(shù)碼管顯示函數(shù)
- TR0=0;
- while(m);
- }
- if(num==7)
- {
- TempData[0]=dofly_DuanMa[num/10];//分解顯示信息,如要顯示68,則68/10=6 68%10=8
- TempData[1]=dofly_DuanMa[num%10];
- TempData[2]=0x40;//分解顯示信息,如要顯示68,則68/10=6 68%10=8
- TempData[3]=0x40;
- TempData[4]=table[6];
- Display(0,8); //數(shù)碼管顯示函數(shù)
- TR0=0;
- while(m);
- }
- if(num==8)
- {
- TempData[0]=dofly_DuanMa[num/10];//分解顯示信息,如要顯示68,則68/10=6 68%10=8
- TempData[1]=dofly_DuanMa[num%10];
- TempData[2]=0x40;//分解顯示信息,如要顯示68,則68/10=6 68%10=8
- TempData[3]=0x40;
- TempData[4]=table[7];
- Display(0,8); //數(shù)碼管顯示函數(shù)
- TR0=0;
- while(m);
- }
- if(num==9)
- {
- TempData[0]=dofly_DuanMa[num/10];//分解顯示信息,如要顯示68,則68/10=6 68%10=8
- TempData[1]=dofly_DuanMa[num%10];
- TempData[2]=0x40;//分解顯示信息,如要顯示68,則68/10=6 68%10=8
- TempData[3]=0x40;
- TempData[5]=table[0];
- Display(0,8); //數(shù)碼管顯示函數(shù)
- TR0=0;
- while(m);
- }
- if(num==10)
- {
- TempData[0]=dofly_DuanMa[num/10];//分解顯示信息,如要顯示68,則68/10=6 68%10=8
- TempData[1]=dofly_DuanMa[num%10];
- TempData[2]=0x40;//分解顯示信息,如要顯示68,則68/10=6 68%10=8
- TempData[3]=0x40;
- TempData[5]=table[1];
- Display(0,8); //數(shù)碼管顯示函數(shù)
- TR0=0;
- while(m);
- }
- if(num==11)
- {
- TempData[0]=dofly_DuanMa[num/10];//分解顯示信息,如要顯示68,則68/10=6 68%10=8
- TempData[1]=dofly_DuanMa[num%10];
- TempData[5]=table[2];
- Display(0,8); //數(shù)碼管顯示函數(shù)
- TR0=0;
- while(m);
- }
- if(num==12)
- {
- TempData[0]=dofly_DuanMa[num/10];//分解顯示信息,如要顯示68,則68/10=6 68%10=8
- TempData[1]=dofly_DuanMa[num%10];
- TempData[2]=0x40;//分解顯示信息,如要顯示68,則68/10=6 68%10=8
- TempData[3]=0x40;
- TempData[5]=table[3];
- Display(0,8); //數(shù)碼管顯示函數(shù)
- TR0=0;
- while(m);
- }
- if(num==13)
- {
- TempData[0]=dofly_DuanMa[num/10];//分解顯示信息,如要顯示68,則68/10=6 68%10=8
- TempData[1]=dofly_DuanMa[num%10];
- TempData[2]=0x40;//分解顯示信息,如要顯示68,則68/10=6 68%10=8
- TempData[3]=0x40;
- TempData[5]=table[4];
- Display(0,8); //數(shù)碼管顯示函數(shù)
- TR0=0;
- while(m);
- }
- if(num==14)
- {
- TempData[0]=dofly_DuanMa[num/10];//分解顯示信息,如要顯示68,則68/10=6 68%10=8
- TempData[1]=dofly_DuanMa[num%10];
- TempData[2]=0x40;//分解顯示信息,如要顯示68,則68/10=6 68%10=8
- TempData[3]=0x40;
- TempData[5]=table[5];
- Display(0,8); //數(shù)碼管顯示函數(shù)
- TR0=0;
- while(m);
- }
- if(num==15)
- {
- TempData[0]=dofly_DuanMa[num/10];//分解顯示信息,如要顯示68,則68/10=6 68%10=8
- TempData[1]=dofly_DuanMa[num%10];
- TempData[2]=0x40;//分解顯示信息,如要顯示68,則68/10=6 68%10=8
- TempData[3]=0x40;
- TempData[5]=table[6];
- Display(0,8); //數(shù)碼管顯示函數(shù)
- TR0=0;
- while(m);
- }
- if(num==16)
- {
- TempData[0]=dofly_DuanMa[num/10];//分解顯示信息,如要顯示68,則68/10=6 68%10=8
- TempData[1]=dofly_DuanMa[num%10];
- TempData[2]=0x40;//分解顯示信息,如要顯示68,則68/10=6 68%10=8
- TempData[3]=0x40;
- TempData[5]=table[7];
- Display(0,8); //數(shù)碼管顯示函數(shù)
- TR0=0;
- while(m);
- }
- }
- void keyscan()
- {
- if(key1==0)
- {
- DelayMs(10);
- if(key1==0)
- {
- num=1;
- while(!key1);
- }
- }
- if(key2==0)
- {
- DelayMs(10);
- if(key2==0)
- {
- num=2;
- while(!key2);
- }
- }
- if(key3==0)
- {
- DelayMs(10);
- if(key3==0)
- {
- num=3;
- while(!key3);
- }
- }
- if(key4==0)
- {
- DelayMs(10);
- if(key4==0)
- {
- num=4;
- while(!key4);
- }
- }
- if(key5==0)
- {
- DelayMs(10);
- if(key5==0)
- {
- num=5;
- while(!key5);
- }
- }
- if(key6==0)
- {
- DelayMs(10);
- if(key6==0)
- {
- num=6;
- while(!key6);
- }
- }
- if(key7==0)
- {
- DelayMs(10);
- if(key7==0)
- {
- num=7;
- while(!key7);
- }
- }
- if(key8==0)
- {
- DelayMs(10);
- if(key8==0)
- {
- num=8;
- while(!key8);
- }
- }
- if(key9==0)
- {
- DelayMs(10);
- if(key9==0)
- {
- num=9;
- while(!key9);
- }
- }
- if(key10==0)
- {
- DelayMs(10);
- if(key10==0)
- {
- num=10;
- while(!key10);
- }
- }
- if(key11==0)
- {
- DelayMs(10);
- if(key11==0)
- {
- num=11;
- while(!key11);
- }
- }
- if(key12==0)
- {
- DelayMs(10);
- if(key12==0)
- {
- num=12;
- while(!key12);
- }
- }
- if(key13==0)
- {
- DelayMs(10);
- if(key13==0)
- {
- num=13;
- while(!key13);
- }
- }
- if(key14==0)
- {
- DelayMs(10);
- if(key14==0)
- {
- num=14;
- while(!key14);
- }
- }
- if(key15==0)
- {
- DelayMs(10);
- if(key15==0)
- {
- num=15;
- while(!key15);
- }
- }
- if(key16==0)
- {
- DelayMs(10);
- if(key16==0)
- {
- num=16;
- while(!key16);
- }
- }
- }
- void DelayUs2x(unsigned char t)
- {
- while(--t);
- }
- void DelayMs(unsigned char t)
- {
- while(t--)
- {
- //大致延時1mS
- DelayUs2x(245);
- DelayUs2x(245);
- }
- }
- void Delay(unsigned char t)
- {
- unsigned char x,y;
- for(x=t;x>0;x--)
- for(y=110;y>0;y--);
- }
- /*------------------------------------------------
- 顯示函數(shù),用于動態(tài)掃描數(shù)碼管
- 輸入?yún)?shù) FirstBit 表示需要顯示的第一位,如賦值2表示從第三個數(shù)碼管開始顯示
- 如輸入0表示從第一個顯示。
- Num表示需要顯示的位數(shù),如需要顯示99兩位數(shù)值則該值輸入2
- ------------------------------------------------*/
- void Display(unsigned char FirstBit,unsigned char Num)
- {
- unsigned char i;
-
- for(i=0;i<Num;i++)
- {
- DataPort=0; //清空數(shù)據(jù),防止有交替重影
- DUAN=1; //段鎖存
- DUAN=0;
- DataPort=dofly_WeiMa[i+FirstBit]; //取位碼
- WEI=1; //位鎖存
- WEI=0;
- DataPort=TempData[i]; //取顯示數(shù)據(jù),段碼
- DUAN=1; //段鎖存
- DUAN=0;
- DelayMs(2); // 掃描間隙延時,時間太長會閃爍,太短會造成重影
- }
- }
復(fù)制代碼
全部資料51hei下載地址:
16路搶答器.zip
(270.95 KB, 下載次數(shù): 275)
2018-5-7 16:04 上傳
點擊文件名下載附件
程序和仿真
|