這款實(shí)用性強(qiáng)的8路單片機(jī)搶答器,使用的是AT89S52單片機(jī),四位數(shù)碼管作為搶答、回答時(shí)間的倒計(jì)時(shí)以及計(jì)分顯示用。該制作從實(shí)用性出發(fā),8個(gè)按鍵都是分開(kāi)來(lái)做的,做出來(lái)的東西是能夠使用的而不是模型。
這款實(shí)用性強(qiáng)的8路單片機(jī)搶答器主要的功能:可以顯示搶答、回答時(shí)間的倒計(jì)時(shí),可以調(diào)節(jié)搶答、回答時(shí)間,能夠提示犯規(guī)搶答,可以計(jì)分,可以實(shí)現(xiàn)軟復(fù)位。
全部資料打包下載地址
實(shí)用性強(qiáng)的8路單片機(jī)搶答器.rar
(169.95 KB, 下載次數(shù): 37)





源程序如下:
- /*八路搶答器-----能夠顯示搶答、回答時(shí)間倒計(jì)時(shí),能夠調(diào)節(jié)搶答、回答時(shí)間,能夠報(bào)警犯規(guī)搶答,可以計(jì)分,可以實(shí)現(xiàn)軟復(fù)位*/
- #include<reg52.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit fmq=P3^6;
- sbit Key_Start=P3^4;//開(kāi)始鍵,時(shí)間設(shè)置時(shí)+
- sbit Key_Stop=P3^5;//停止鍵,時(shí)間設(shè)置時(shí)-
- sbit Key_Restart=P3^0;//復(fù)位鍵
- sbit Key_set_Q=P3^2;//搶答時(shí)間設(shè)置鍵
- sbit Key_set_H=P3^3;//回答時(shí)間設(shè)置鍵
- sbit led=P3^7;//搶答LED提示
- uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0xff,0xc6,0xf0,0xb6};//段碼表
- uchar code table_char[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xc7,0xc0,0x92,0x86,0xbf,0xb7,0xff,0xb9,0x8f};//0-9 L O S E -
- uchar table_score[9]={0,50,50,50,50,50,50,50,50};//記分?jǐn)?shù)組,初設(shè)值50分
- void delay(uint z);//延時(shí)函數(shù)聲明
- void init();//初始化函數(shù)聲明
- void display(uchar XuanShou,uchar time);//顯示數(shù)字函數(shù)聲明
- void display_char(uchar char_1,uchar char_2,uchar char_3,uchar char_4 );//顯示字符函數(shù)聲明
- void display_set(uchar char_1,uchar time,uchar char_2);//時(shí)間設(shè)置閃動(dòng)顯示函數(shù)聲明
- void display_score(uchar xs_num);//分?jǐn)?shù)查詢(xún)顯示函數(shù)
- void beep();//蜂鳴器函數(shù)
- void beep_last();//蜂鳴器特殊報(bào)警
- void LED();//提示燈函數(shù)
- uchar QiangDa_time,HuiDa_time,QiangDa_time_temp=20,HuiDa_time_temp=30;//搶答時(shí)間、回答時(shí)間變量
- uchar count_0,count_1;//定時(shí)中計(jì)數(shù)用的
- uint shan_count=0;//閃動(dòng)顯示計(jì)數(shù)用
- void main()
- {
- uchar AnJian,ShuJu,XuanShou_num;
- Top:init();//初始化
- XuanShou_num=1;//為分?jǐn)?shù)查詢(xún)做好準(zhǔn)備
- while(1)
- {
- display(10,0);//顯示一杠
- ShuJu=P1;
- if(ShuJu!=0xff)//犯規(guī)搶答??!
- {
- // delay(10);
- // if(ShuJu!=0xff)
- // {
- AnJian=ShuJu;
- switch(AnJian)//取出選手編號(hào)
- {
- case 0xfe : XuanShou_num=1;break;//1111 1110
- case 0xfd : XuanShou_num=2;break;//1111 1101
- case 0xfb : XuanShou_num=3;break;//1111 1011
- case 0xf7 : XuanShou_num=4;break;//1111 0111
- case 0xef : XuanShou_num=5;break;//1110 1111
- case 0xdf : XuanShou_num=6;break;//1101 1111
- case 0xbf : XuanShou_num=7;break;//1011 1111
- case 0x7f : XuanShou_num=8;break;//0111 1111
- default : goto LOSE;//無(wú)法顯示了,有兩個(gè)以上的鍵同時(shí)按下了?。〔贿^(guò)這種概率相當(dāng)小
- }
- while(1)
- {
- display_char(13,14,14,XuanShou_num);//閃動(dòng)顯示犯規(guī)選手并且報(bào)警
- if(shan_count==50)
- {
- beep();
- }
- if(Key_Stop==0)
- {
- delay(10);
- if(Key_Stop==0)
- {
- beep();
- table_score[XuanShou_num]--;//扣分
- }
- }
- while(!Key_Stop)
- {
- display_char(14,14,1,16);//按鍵不放開(kāi)的情況下顯示-1
- shan_count=1;//調(diào)用的是閃動(dòng)顯示函數(shù),但是不讓其閃動(dòng)
- }
- if(Key_Restart==0)
- {
- delay(10);
- if(Key_Restart==0)
- {
- beep();
- goto Top;//熱復(fù)位
- }
- }
- }
- // }
- }
- if(Key_Start==0)
- {
- delay(10);
- if(Key_Start==0)//主持人按下?lián)尨疰I,搶答正式開(kāi)始!
- {
- QiangDa_time=QiangDa_time_temp;
- HuiDa_time=HuiDa_time_temp;
- beep();
- TR1=1;//搶答時(shí)間開(kāi)始倒計(jì)時(shí)
- break;//跳出犯規(guī)搶答查詢(xún)循環(huán)
- }
- }
- //一下為查分程序測(cè)試
- if(Key_Stop==0)
- {
- delay(10);
- if(Key_Stop==0)//進(jìn)入分?jǐn)?shù)查詢(xún)顯示
- {
- beep();
- while(!Key_Stop);
- while(1)
- {
- display_score(XuanShou_num);
- if(Key_Start==0)
- {
- delay(10);
- if(Key_Start==0)
- {
- XuanShou_num++;
- if(XuanShou_num==9) XuanShou_num=1;
- }
- }
- while(!Key_Start);//等待按鍵釋放
- if(Key_Stop==0)
- {
- delay(10);
- if(Key_Stop==0)
- {
- XuanShou_num--;
- if(XuanShou_num==0) XuanShou_num=8;
- }
- }
- while(!Key_Stop);//等待按鍵釋放
- if(Key_Restart==0)
- {
- delay(10);
- if(Key_Restart==0)
- {
- beep();
- goto Top;//熱復(fù)位
- }
- }
- }
- }
- }
- }
- while(1) //查詢(xún)是否有按鍵按下,進(jìn)入搶答循環(huán)
- {
- display(10,QiangDa_time);//顯示搶答倒計(jì)時(shí)
- if(QiangDa_time==0)
- {
- // beep();
- TR1=0;//關(guān)閉定時(shí)器1
- LOSE: while(1)
- {
- display_char(10,11,12,13); //顯示lose 字符
- if(Key_Restart==0)
- {
- delay(10);
- if(Key_Restart==0)//熱復(fù)位鍵,從頭開(kāi)始下一輪
- {
- beep();
- goto Top;
- }
- }
- }
- }
- ShuJu=P1;//把P1口的數(shù)據(jù)送給變量
- if(ShuJu!=0xff)//有按鍵按下
- {
- // delay(10);
- // if(ShuJu!=0xff)//確定有按鍵按下
- // {
- AnJian=ShuJu;//傳遞數(shù)據(jù)掃描值
- // TR0=1;//啟動(dòng)定時(shí)器0
- TR1=0;//關(guān)閉定時(shí)器1
- break;//不再進(jìn)行查詢(xún)是否有按鍵按下了
- // }
- }
- }
- switch(AnJian)//取出選手編號(hào)
- {
- case 0xfe : XuanShou_num=1;beep();LED();break;//1111 1110
- case 0xfd : XuanShou_num=2;beep();LED();break;//1111 1101
- case 0xfb : XuanShou_num=3;beep();LED();break;//1111 1011
- case 0xf7 : XuanShou_num=4;beep();LED();break;//1111 0111
- case 0xef : XuanShou_num=5;beep();LED();break;//1110 1111
- case 0xdf : XuanShou_num=6;beep();LED();break;//1101 1111
- case 0xbf : XuanShou_num=7;beep();LED();break;//1011 1111
- case 0x7f : XuanShou_num=8;beep();LED();break;//0111 1111
- default : goto LOSE;//無(wú)法顯示了,有兩個(gè)以上的鍵同時(shí)按下了??!不過(guò)這種概率相當(dāng)小
- }
- TR0=1;//啟動(dòng)定時(shí)器0(在這里啟動(dòng)比在前面好)
- while(1)
- {
- display(XuanShou_num,HuiDa_time);//顯示選手編號(hào)和回答倒計(jì)時(shí)
- if(HuiDa_time==0)
- {
- TR0=0;//關(guān)閉定時(shí)器0
- goto LOSE;//跳到顯示lose字符那里
- }
- if(Key_Stop==0)
- {
- delay(30);
- if(Key_Stop==0)//停止鍵按下
- {
- beep();
- TR0=0;//關(guān)閉定時(shí)器0,選手開(kāi)始回答
- while(!Key_Stop);
- while(1) //在顯示選手回答倒計(jì)時(shí)時(shí)只有在stop按鍵按下時(shí),才可按復(fù)位鍵
- {
- display(XuanShou_num,HuiDa_time);//顯示選手編號(hào)和回答倒計(jì)時(shí)
- if(Key_Start==0)
- {
- delay(10);
- if(Key_Start==0)
- {
- beep();
- table_score[XuanShou_num]++;//加分
- }
- }
- while(!Key_Start)
- {
- display_char(17,18,1,16);//按鍵不放開(kāi)的情況下顯示+1
- shan_count=1;//調(diào)用的是閃動(dòng)顯示函數(shù),但是不讓其閃動(dòng)
- }
- if(Key_Stop==0)
- {
- delay(10);
- if(Key_Stop==0)
- {
- beep();
- table_score[XuanShou_num]--;//扣分
- }
- }
- while(!Key_Stop)
- {
- display_char(14,14,1,16);//按鍵不放開(kāi)的情況下顯示-1
- shan_count=1;//調(diào)用的是閃動(dòng)顯示函數(shù),但是不讓其閃動(dòng)
- }
- if(Key_Restart==0)
- {
- delay(10);
- if(Key_Restart==0)//熱復(fù)位鍵,從頭開(kāi)始下一輪
- {
- beep();
- goto Top;
- }
- }
- }
- }
- }
- // else
- /* if(Key_Restart==0)
- {
- delay(10);
- if(Key_Restart==0)//熱復(fù)位鍵,從頭開(kāi)始下一輪
- {
- beep();
- goto Top;
- }
- } */
- }
-
- }
- void delay(uint z)//1ms基準(zhǔn)延時(shí)
- {
- uint x,y;
- for(x=z;x>0;x--)
- for(y=110;y>0;y--);
- }
- void init()//初始化函數(shù)
- {
- // P1=0xff
- EA=1;//開(kāi)總中斷;
- TMOD=0x11;//定時(shí)器工作方式1,16位定時(shí)計(jì)數(shù)器
- TH0=(65536-50000)/256;//50us
- TL0=(65536-50000)%256;
- ET0=1;//開(kāi)定時(shí)器0中斷(暫時(shí)不啟動(dòng)定時(shí)器)
- // TMOD=0x01;//定時(shí)器工作方式1,16位定時(shí)計(jì)數(shù)器
- TH1=(65536-50000)/256;//50us
- TL1=(65536-50000)%256;
- ET1=1;//開(kāi)定時(shí)器0中斷(暫時(shí)不啟動(dòng)定時(shí)器)
- EX0=1;//啟動(dòng)外中斷0
- EX1=1;//啟動(dòng)外中斷1
- P1=0xff;//讀P1口的數(shù)據(jù)要先置1準(zhǔn)備
- count_0=0;//定時(shí)器中的計(jì)數(shù)清零
- count_1=0;
- shan_count=0;
- }
- void display(uchar XuanShou,uchar time)//顯示數(shù)字的函數(shù)
- {
- P2=0x7f;//0111 1111最后一位數(shù)碼管亮
- P0=table[XuanShou];//選手編號(hào)
- delay(1);
- P2=0x7f;//0111 1111
- P0=0xff;//消余輝
- delay(1);
-
- P2=0xdf;//1101 1111
- P0=table[time%10];//時(shí)間的個(gè)位
- delay(1);
- P2=0xdf;//0111 1111
- P0=0xff;//消余輝
- delay(1);
-
- P2=0xef;// 1110 1111
- P0=table[time/10];//時(shí)間的十位
- delay(1);
- P2=0xef;//0111 1111
- P0=0xff;//消余輝
- delay(1);
- }
- void display_char(uchar char_1,uchar char_2,uchar char_3,uchar char_4 )//閃動(dòng)!顯示字符的函數(shù)
- {
- shan_count++;
- if(shan_count==150) shan_count=0;
- if(shan_count>0&&shan_count<50)
- {
- P2=0x7f;//0111 1111
- P0=table_char[char_4];
- delay(1);
- P2=0x7f;//0111 1111
- P0=0xff;
- delay(1);
-
- P2=0xbf;//1011 1111
- P0=table_char[char_3];
- delay(1);
- P2=0xbf;//1011 1111
- P0=0xff;
- delay(1);
-
- P2=0xdf;//1101 1111
- P0=table_char[char_2];
- delay(1);
- P2=0xdf;//1101 1111
- P0=0xff;
- delay(1);
-
- P2=0xef;//1110 1111
- P0=table_char[char_1];
- delay(1);
- P2=0xef;//1110 1111
- P0=0xff;
- delay(1);
- }
- else
- {
- P2=0x7f;//0111 1111
- P0=0xff;
- delay(1);
- P2=0xbf;//
- P0=0xff;
- delay(1);
- P2=0xdf;//
- P0=0xff;
- delay(1);
- P2=0xef;//
- P0=0xff;
- delay(1);
- }
- }
- void display_set(uchar char_1,uchar time,uchar char_2)//時(shí)間設(shè)置的閃動(dòng)顯示
- {
- shan_count++;
- if(shan_count==120) shan_count=0;
- if(shan_count>0&&shan_count<40)
- {
- P2=0x7f;//0111 1111最后一位數(shù)碼管亮
- P0=table[char_2];//顯示一個(gè)符號(hào)
- delay(1);
- P2=0x7f;//0111 1111
- P0=0xff;//消余輝
- delay(1);
- P2=0xbf;//1011 1111
- P0=table[time%10];//時(shí)間的個(gè)位
- delay(1);
- P2=0xbf;//1011 1111
- P0=0xff;//消余輝
- delay(1);
-
- P2=0xdf;//1101 1111
- P0=table[time/10];//時(shí)間的十位
- delay(1);
- P2=0xdf;//1101 1111
- P0=0xff;//消余輝
- delay(1);
-
- P2=0xef;// 1110 1111
- P0=table[char_1];//顯示一個(gè)符號(hào)
- delay(1);
- P2=0xef;//1110 1111
- P0=0xff;//消余輝
- delay(1);
- }
- else
- {
- P2=0x7f;//0111 1111
- P0=table[char_2];
- delay(1);
- P2=0xbf;//
- P0=0xff;
- delay(1);
- P2=0xdf;//
- P0=0xff;
- delay(1);
- P2=0xef;//
- P0=table[char_1];
- delay(1);
- }
- }
- void display_score(uchar xs_num)//分?jǐn)?shù)查詢(xún)顯示函數(shù)
- {
- P2=0x7f;//0111 1111最后一位數(shù)碼管亮
- P0=table[(table_score[xs_num]%10)];//分?jǐn)?shù)的個(gè)位
- delay(1);
- P2=0x7f;//0111 1111
- P0=0xff;//消余輝
- delay(1);
- P2=0xbf;//1011 1111
- P0=table[(table_score[xs_num]/10)];//分?jǐn)?shù)的十位
- delay(1);
- P2=0xbf;//1011 1111
- P0=0xff;//消余輝
- delay(1);
-
- P2=0xdf;//1101 1111
- P0=table_char[15];//間隔符號(hào)
- delay(1);
- P2=0xdf;//1101 1111
- P0=0xff;//消余輝
- delay(1);
-
- P2=0xef;// 1110 1111
- P0=table[xs_num];//選手編號(hào)
- delay(1);
- P2=0xef;//1110 1111
- P0=0xff;//消余輝
- delay(1);
- }
- void beep() //有源蜂鳴器函數(shù)
- {
- fmq=0;
- delay(80);
- fmq=1;
- }
- void beep_last()//最后一聲特殊聲調(diào)
- {
- fmq=0;
- delay(300);
- fmq=1;
- }
- void LED()
- {
- led=0;
- delay(150);
- led=1;
- }
- void T0_time() interrupt 1//定時(shí)器0中斷函數(shù)_回答時(shí)間
- {
- TH0=(65536-50000)/256;//50ms
- TL0=(65536-50000)%256;//馬上重裝初值,以免有誤差
- if(count_0==20)
- {
- count_0=0;
- HuiDa_time--;
- if(HuiDa_time<=5)
- {
- if(HuiDa_time==0)
- {
- beep_last();//最后一聲特殊警告
- }
- beep();
- }
- }
- count_0++;
-
- }
- void T1_time() interrupt 3//定時(shí)器1中斷函數(shù)_搶答時(shí)間
- {
- TH1=(65536-50000)/256;//50us
- TL1=(65536-50000)%256;//馬上重裝初值,這樣在后面調(diào)用beep()函數(shù)時(shí)就不會(huì)影響定時(shí)器的準(zhǔn)確計(jì)時(shí)了
- if(count_1==20)
- {
- count_1=0;
- QiangDa_time--;
- if(QiangDa_time<=5)
- {
- if(QiangDa_time==0)
- {
- beep_last();//最后一聲警告
- }
- else
- beep();
- }
- }
- count_1++;
- }
- void EX0_set_QiangDa_time() interrupt 0 //外中斷0,設(shè)置搶答時(shí)間
- {
- delay(10);//消抖一下
- if(Key_set_Q==0)
- {
- beep();
- while(1)
- {
- // display(11,QiangDa_time_temp);
- // delay(100);//閃動(dòng)效果
- display_set(12,QiangDa_time_temp,13);//調(diào)用時(shí)間設(shè)置閃動(dòng)顯示函數(shù),效果為 [時(shí)間]
- if(Key_Start==0)//時(shí)間+1鍵
- {
- delay(10);
- if(Key_Start==0)
- {
- QiangDa_time_temp++;
- if(QiangDa_time_temp==100)
- {
- QiangDa_time_temp=1;
- }
- }
- }
- while(!Key_Start);//等待按鍵釋放
- // else
- if(Key_Stop==0)//時(shí)間-1鍵
- {
- delay(10);
- if(Key_Stop==0)
- {
- QiangDa_time_temp--;
- if(QiangDa_time_temp==0)
- {
- QiangDa_time_temp=99;
- }
- }
- }
- while(!Key_Stop);//等待按鍵釋放
- // else
- if(Key_Restart==0)
- {
- if(Key_Restart==0)
- {
- beep();
- break;
- }
- }
- }
- }
- }
- void EX1_set_HuiDa_time() interrupt 2 //外中斷1,設(shè)置回答時(shí)間
- {
- delay(10);//消抖一下
- if(Key_set_H==0)
- {
- beep();
- while(1)
- {
- display_set(12,HuiDa_time_temp,13);//調(diào)用時(shí)間設(shè)置閃動(dòng)顯示函數(shù),效果為 [時(shí)間]
- if(Key_Start==0)//時(shí)間+1鍵
- {
- delay(10);
- if(Key_Start==0)
- {
- HuiDa_time_temp++;
- if(HuiDa_time_temp==100)
- {
- HuiDa_time_temp=1;
- }
- }
- }
- while(!Key_Start);//等待按鍵釋放
- // else
- if(Key_Stop==0)//時(shí)間-1鍵
- {
- delay(10);
- if(Key_Stop==0)
- {
- HuiDa_time_temp--;
- if(HuiDa_time_temp==0)
- {
- HuiDa_time_temp=99;
- }
- }
- }
- while(!Key_Stop);//等待按鍵釋放
- // else
- if(Key_Restart==0)
- {
- if(Key_Restart==0)
- {
- beep();
- break;
- }
- }
- }
- }
- }
復(fù)制代碼
|