|
十四路搶答器原理圖 Altium Designer畫(huà)的(51hei附件中可下載工程文件):
單片機(jī)搶答器代碼如下:
- #include<reg51.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit start=P3^0; //主持人按鍵開(kāi)始
- sbit reset=P3^1; //復(fù)位
- //sbit m1=P3^1; //主持人按鍵答對(duì)加分,按一下加一分
- //sbit m2=P3^2; //答錯(cuò)減分
- sbit add1=P3^2; //搶答時(shí)間調(diào)整,加1
- sbit dec1=P3^7; //搶答時(shí)間調(diào)整,減1
- sbit add2=P3^4; //答題時(shí)間調(diào)整,加1
- sbit dec2=P3^5; //答題時(shí)間調(diào)整,減1
- sbit k1=P1^0;
- sbit k2=P1^1;
- sbit k3=P1^2;
- sbit k4=P1^3;
- sbit k5=P1^4;
- sbit k6=P1^5;
- sbit k7=P1^6;
- sbit k8=P1^7; //選手按鍵
- sbit beep=P3^6; //蜂鳴器
- bit qd; //搶答標(biāo)志位,=1時(shí)開(kāi)啟搶答
- bit dt; //答題標(biāo)志位,=1時(shí)開(kāi)啟答題
- //時(shí)間計(jì)算
- #define Imax 14000 //此處為晶振為11.0592時(shí)的取值,
- #define Imin 8000 //如用其它頻率的晶振時(shí),
- #define Inum1 1450 //要改變相應(yīng)的取值。
- #define Inum2 700
- #define Inum3 3000
- //解碼變量
- unsigned char Im[4]={0x00,0x00,0x00,0x00};
- //全局變量
- uchar f;
- unsigned long m,Tc;
- unsigned char IrOK;
- //uchar code tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77}; //0-9代碼 abcdefg dp
- unsigned char code tab[]={0x5F,0x44,0x9D,0xD5,0xC6,0xD3,0xDB,0x45,0xDF,0xD7,0xCE,0xC7,0xDC}; //數(shù)字0-9的編碼 G C DP D E B F A
- uchar shiwei,gewei,xuanshou,count,p,second;
- uchar qd_time=30,dt_time=60; //搶答時(shí)間,默認(rèn)30S,答題時(shí)間,默認(rèn)60S
- uint t,n,a,a1,a2,a3,a4,a5,a6,a7,a8;
- void Timer()
- {
- TMOD=0x11;
- TH1=0x3C; //初值50ms
- TL1=0xB0;
- EA=1; //打開(kāi)中斷總開(kāi)關(guān)
- ET1=1; //打開(kāi)中斷允許開(kāi)關(guān)
- TR1=0; //打開(kāi)定時(shí)開(kāi)關(guān)
- IT1=1;//下降沿有效
- EX1=1;//外部中斷1開(kāi)
- TH0=0;//T0賦初值
- TL0=0;
- TR0=0;//t0暫時(shí)不計(jì)時(shí),等到有紅外信號(hào)時(shí)開(kāi)啟計(jì)時(shí)
- }
- void delay(uint z) //延時(shí)函數(shù)
- {
- uint x,y;
- for(x=z;x>0;x--)
- for(y=110;y>0;y--); //約1ms
- }
- void display (void) //顯示函數(shù)
- {
- unsigned char shiwei,gewei,xuanshou;//定義數(shù)據(jù)變量,用于顯示時(shí)間和選手號(hào)碼
- shiwei=tab[second/10]; //秒取十位數(shù)
- gewei=tab[second%10]; //取個(gè)位數(shù)
- xuanshou=tab[p]; //選手號(hào)
- P0=gewei; //個(gè)位數(shù)據(jù)顯示
- P2=0x7F; //打開(kāi)位選
- delay(5); //延時(shí)一會(huì)
- P2=0xFF; //關(guān)閉顯示
- P0=shiwei; //顯示十位
- P2=0xBF; //打開(kāi)顯示時(shí)間十位的位選
- delay(5); //延時(shí)一會(huì)
- P2=0xFF; //關(guān)閉顯示
- P0=0x80; //顯示橫線
- P2=0xDF;
- delay(5);
- P2=0xFF;
-
- P0=xuanshou;
- P2=0xEF; //選手位選
- delay(5);
- P2=0xFF;
- }
- void keyscan(void) //按鍵函數(shù)
- {
- if(add1==0) //搶答加按鍵按下
- {
- display(); //顯示函數(shù)當(dāng)做去抖用,防止按鍵按下時(shí)黑屏
- if(add1==0) //再次判斷搶答加按鍵是否按下(其他按鍵功能類似)
- {
- p=11; //P=11,顯示q
- qd_time++; //搶答時(shí)間加
- if(qd_time>=99) //最大加到99
- qd_time=99;
- }
- second=qd_time; //將搶答時(shí)間賦值給計(jì)時(shí)變量
- do
- display(); //掃描顯示
- while(add1==0);
- }
- if(dec1==0) //搶答時(shí)間減按鍵
- {
- display();
- if(dec1==0)
- {
- p=11; //顯示q
- qd_time--; //時(shí)間減
- if(qd_time<=1) //最小減到1
- qd_time=1;
- }
- second=qd_time;
- do
- display();
- while(dec1==0);
- }
- if(add2==0)
- {
- display();
- if(add2==0)
- {
- p=12;
- dt_time++;
- if(dt_time>=99)
- dt_time=99;
- }
- second=dt_time;
- do
- display();
- while(add2==0);
- }
- if(dec2==0)
- {
- display();
- if(dec2==0)
- {
- p=12;
- dt_time--;
- if(dt_time<=1)
- dt_time=1;
- }
- second=dt_time;
- do
- display();
- while(dec2==0);
- }
- }
- void init() //初始化函數(shù)
- {
- P2=0x04;
- P0=0x3f;
- t=0;
- beep=1;
- p=10; //選手號(hào)初始為顯示H,表示等待
- second=qd_time;
- }
- void main()
- {
- uchar i;
- init(); //調(diào)用初始化函數(shù)
- Timer(); //定時(shí)器設(shè)置
- while(1)
- {
- if((qd==0)&&(dt==0)) //在非搶答,非答題狀態(tài)下
- keyscan(); //按鍵掃描函數(shù)
- display(); //顯示函數(shù)
- if(start==0) //主持人按下開(kāi)始鍵
- {
- if((qd==0)&&(dt==0)) //在非搶答,非答題狀態(tài)下
- {
- p=10; //數(shù)碼管顯示H
- second=qd_time; //搶答時(shí)間賦值計(jì)時(shí)變量
- qd=1; //進(jìn)入搶答模式
- }
- beep=0; //蜂鳴器長(zhǎng)響一聲
- for(i=0;i<20;i++) //此處用做延時(shí)
- {
- display();
- }
- beep=1; //關(guān)閉蜂鳴器
- TR1=~TR1; //定時(shí)器取反,可以開(kāi)始,可以隨時(shí)暫停
- do
- display(); //顯示函數(shù)
- while(!start); //等待釋放按鍵
- }
- if(reset==0) //復(fù)位鍵按下
- {
- display();
- if(reset==0)
- {
- second=qd_time; //將搶答時(shí)間賦值給計(jì)時(shí)變量
- t=0; //清零
- p=10; //顯示H
- TR1=0; //停止計(jì)時(shí)
- beep=1; //蜂鳴器停止
- qd=0; //搶答清零
- dt=0; //答題清零
- }
- do
- display(); //顯示函數(shù)
- while(!reset); //按鍵釋放
- }
- if(qd==1) //如果是搶答模式時(shí)
- {
- {
- if(k1==0) //一號(hào)選手按下按鍵
- {
- display();
- if(k1==0)
- display();
- t=1; //選手號(hào)置1
- qd=0; //關(guān)閉搶答模式
- dt=1; //準(zhǔn)備打開(kāi)答題模式(其他選手注釋相同)
- }
- else if(k2==0)
- {
- display();
- if(k2==0)
- display();
- t=2;
- qd=0;
- dt=1;
- }
- else if(k3==0)
- {
- display();
- if(k3==0)
- display();
- t=3;
- qd=0;
- dt=1;
- }
- else if(k4==0)
- {
- display();
- if(k4==0)
- display();
- t=4;
- qd=0;
- dt=1;
- }
- else if(k5==0)
- {
- display();
- if(k5==0)
- display();
- t=5;
- qd=0;
- dt=1;
- }
- else if(k6==0)
- {
- display();
- if(k6==0)
- display();
- t=6;
- qd=0;
- dt=1;
- }
- else if(k7==0)
- {
- display();
- if(k7==0)
- display();
- t=7;
- qd=0;
- dt=1;
- }
- else if(k8==0)
- {
- display();
- if(k8==0)
- display();
- t=8;
- qd=0;
- dt=1;
- }
- if(IrOK==1) //有紅外信號(hào)時(shí)
- {
- //1鍵
- if(Im[2]==0x0c) //是1號(hào)按下
- {
- display();
- t=1; //選手號(hào)置1
- qd=0; //關(guān)閉搶答模式
- dt=1; //準(zhǔn)備打開(kāi)答題模式(其他選手注釋相同)
- }
- //2鍵
- else if(Im[2]==0x18)
- {
- display();
- t=2;
- qd=0;
- dt=1;
- }
- //3鍵
- else if(Im[2]==0x5e)
- {
- display();
- t=3;
- qd=0;
- dt=1;
- }
- //4鍵
- else if(Im[2]==0x08)
- {
- display();
- t=4;
- qd=0;
- dt=1;
- }
- //5鍵
- else if(Im[2]==0x1c)
- {
- display();
- t=5;
- qd=0;
- dt=1;
- }
- //6鍵
- else if(Im[2]==0x5a)
- {
- display();
- t=6;
- qd=0;
- dt=1;
- }
- //7鍵
- else if(Im[2]==0x42)
- {
- display();
- t=7;
- qd=0;
- dt=1;
- }
- //8鍵
- else if(Im[2]==0x52)
- {
- display();
- t=8;
- qd=0;
- dt=1;
- }
- IrOK=0; //紅外檢測(cè)完后將變量清零
- }
- }
- if(t) //t不為0時(shí)
- {
- switch(t) //判斷t的數(shù)值
- {
- case 1: //數(shù)值為1時(shí)
- {
- TR1=0; //關(guān)閉定時(shí)器
- p=1; //顯示1
- second=dt_time; //答題時(shí)間賦值給計(jì)時(shí)變量
- beep=0; //蜂鳴器響
- for(i=0;i<20;i++) //延時(shí)
- {
- display();
- }
- beep=1; //蜂鳴器停止
- qd=0;break; //搶答模式關(guān)閉(其他選手注釋相同)
- }
- case 2:
- {
- TR1=0;
- p=2;
- second=dt_time;
- beep=0;
- for(i=0;i<20;i++)
- {
- display();
- }
- beep=1;
- qd=0;break;
- }
- case 3:
- {
- TR1=0;
- p=3;
- second=dt_time;
- beep=0;
- for(i=0;i<20;i++)
- {
- display();
- }
- beep=1;
- qd=0;break;
- }
- case 4:
- {
- TR1=0;
- p=4;
- second=dt_time;
- beep=0;
- for(i=0;i<20;i++)
- {
- display();
- }
- beep=1;
- qd=0;break;
- }
- case 5:
- {
- TR1=0;
- p=5;
- second=dt_time;
- beep=0;
- for(i=0;i<20;i++)
- {
- display();
- }
- beep=1;
- qd=0;break;
- }
- case 6:
- {
- TR1=0;
- p=6;
- second=dt_time;
- beep=0;
- for(i=0;i<20;i++)
- {
- display();
- }
- beep=1;
- qd=0;break;
- }
- case 7:
- {
- TR1=0;
- p=7;
- second=dt_time;
- beep=0;
- for(i=0;i<20;i++)
- {
- display();
- }
- beep=1;
- qd=0;break;
- }
- case 8:
- {
- TR1=0;
- p=8;
- second=dt_time;
- beep=0;
- for(i=0;i<20;i++)
- {
- display();
- }
- beep=1;
- qd=0;break;
- }
-
- }
- }
- if(dt==1) //答題標(biāo)志開(kāi)啟時(shí)
- {
- if(start==0) //進(jìn)入答題模式后,主持人按下開(kāi)始按鍵,則開(kāi)始計(jì)時(shí)答題時(shí)間
- {
- display();
- if(start==0)
- {
- beep=0; //蜂鳴器響
- for(i=0;i<20;i++) //延時(shí)
- {
- display();
- }
- beep=1; //關(guān)閉蜂鳴器
- TR1=1; //打開(kāi)定時(shí)器
- }
- }
- }
- }
- if(second==0) //計(jì)時(shí)到0時(shí)報(bào)警
- {
- beep=0; //打開(kāi)蜂鳴器
- qd=0; //關(guān)閉搶答模式
- dt=0; //關(guān)閉答題模式
- }
- }
- ……………………
- …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼
所有資料51hei提供下載:
代碼:
搶答器.zip
(52.11 KB, 下載次數(shù): 14)
2017-6-7 20:38 上傳
點(diǎn)擊文件名下載附件
搶答器代碼
原理圖:
http://www.zg4o1577.cn/bbs/dpj-87167-1.html
|
|