|
基于單片機的八路搶答器
一、主要內容
通過利用數碼管顯示,并自動復位的思路,運用單片機的運行產生輸出信號,通過數碼管顯示對應的通道,實現了一個以單片機為核心的8路搶答器,
并且具有查看選手分數和進行加減分的功能。
二、具體操作
2、主持人按下開始鍵選手等待時間計完聽到滴聲后才可以搶答,若提前搶到則
視為犯規。
3、搶答成功后別的選手再搶到也是沒有用的。
4、顯示屏上顯示哪位選手搶到,并開始對答題時間進行倒計時。
5、顯示答題時間,在答題時間小于 5S 時報警電路會發生作用。
7、當主持人按下 RESET 鍵則進行下一輪的比賽。
二、程序用什么軟件查看?
打開程序的軟件是Keil
單片機源程序如下:
- #include <reg51.h>
- #include <intrins.h>
- #define uint unsigned int
- #define uchar unsigned char
- sbit smg1=P2^0; //定義數碼管第一位
- sbit smg3=P2^2; //定義數碼管第三位
- sbit smg4=P2^3; //定義數碼管第四位
- sbit keyks=P3^5; //定義開始按鍵
- sbit keytz=P3^4; //定義停止按鍵
- sbit keyqc=P3^3; //定義清除按鍵
- sbit beep=P3^6; //定義蜂鳴器
- uchar k;
- uchar keyvalue=0;
- uint a;
- int djs=20,js=0; //djs和bt是初始倒計時時間,可修改
- int table[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
- int zhunbei[] = {0x92,0x99,0xb0,0xa4,0xf9,0xc0};//準備搶答
- int fenshu[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
- char fs[8];
- uchar mode=0; //主持人的按鍵模式
- // mode=0:顯示選手1的分數 mode=1:顯示選手2的分數....../////////
- void delayzb(uint z)//準備搶答延時
- {
- uint x,y;//局部變量定義
- for(x = z;x>0;x--)//此for循環100次
- for(y = 144;y>0;y--);//此for循環144次,100*144次循環正好是100ms.
- }
- void delay()
- {
- uchar m,n,s;
- for(m = 20;m>0;m--);
- for(n = 20;n>0;n--);
- for(s = 248;s>0;s--);
- }
- void delayms(uint z)
- {
- uint x,y;
- for(x=z;x>0;x--)
- for(y=110;y>0;y--);
- }
- void Getch () //取鍵值函數
- {
- //keyvalue=0;
- P1=0xf0; //先對P3 置數 列掃描
- if(P1!=0xf0) //判斷是否有鍵按下
- {
- delay(); //延時,軟件去干擾
- if(P1!=0xf0) //確認按鍵按下
- {
- switch (P1) //判斷鍵值(哪一列被按下)
- {
- case 0xe0: keyvalue=1; break; //第一列被按下
- case 0xd0: keyvalue=2; break; //第二列被按下
- case 0xb0: keyvalue=3; break; //被三列被按下
- case 0x70: keyvalue=4; break; //被四列被按下
- }
- P1 = 0x0f; //行掃描
- switch (P1) //判斷哪一行被按下
- {
- case 0x0e: keyvalue=keyvalue; break; //第一行被按下
- case 0x0d: keyvalue=keyvalue + 4; break; //第二行被按下
- case 0x0b: keyvalue=keyvalue + 8; break; //第三行被按下
- case 0x07: keyvalue=keyvalue + 12; break; //第四行被按下
- }
- while (P1 != 0x0f); //松手檢測
- }
- }
- }
- void Timer0_init() //定時器0初始化
- {
- js=0;
- TMOD=0x01; //TR0=1;//IT1=1; //T0為定時器方式1 //EX1=1;
- TH0=0x4c; //每50ms溢出一次
- TL0=0x00;
- ET0=1;
- EA=1;
- }
- void timer0() interrupt 1 using 1 //定時器0中斷服務函數
- {
- TF0=0;
- TH0=0x4c; //每50ms溢出一次
- TL0=0x00; //賦初值
- js++;
- if(js==20) //20*50=1000ms=1s
- {
- js=0;
- djs--; //產生1s的倒計時
- }
- if(djs==5)
- {
- beep = 0; //倒計時后5s報警
- delay();
- beep = 1;
- delay();
- }
- if(djs==0)
- {
- P2 = 0xff;
- TR0=0; //倒計時結束,關閉定時器
- }
- }
- void djsxs() //顯示倒計時函數
- {
- int shi,ge;
- shi=djs/10;
- ge=djs%10; // 將倒計時時間分成高低位
- P2=0XFF;
- smg4 = 0;
- P0=table[ge];
- smg4 = 0;
- delayms(2);
- P2=0XFF;
- smg3 = 0;
- P0=table[shi];
- smg3 = 0;
- delayms(2);
- P2=0XFF;
- }
- void djsxs22() //顯示- --
- {
- P2=0XFF;
- P0=0xbf;
- smg1 = 0;
- delayms(3);
- P2=0XFF; //第一位數碼管顯示-
- P0=0xbf;
- smg3 = 0;
- delayms(3); //第三位數碼管顯示-
- P2=0XFF;
- P0=0xbf;
- smg4 = 0;
- delayms(3);
- P2=0XFF; //第四位數碼管顯示-
- }
- void playerxs()
- {
- P0=table[keyvalue];
- smg1=0;
- delayms(3);
- smg1=1;
- } //第一位數碼管顯示
- void main()
- {
- int djs1=20;
- Timer0_init(); //初始化定時器中斷
- beep=1; //蜂鳴器不響
- djs=20; //倒計時賦值
-
- while(1)
- {
- LOOP1:
- Getch();
- djs=djs1;
- djsxs22(); //LOOP1是標號,顯示 - --
- keyvalue = 0;
- // beep=1; //蜂鳴器不響
- djs=20; //倒計時賦值
- TR0 = 0;
-
-
- if(keyks==0)//開始按鍵
- {
- beep=0;//蜂鳴器響
- delayms(3); //去除按鍵抖動
- if(keyks==0) //確定開始按下
- {
-
- while(!keyks); //松手檢測
- {
- beep=1;
- for(a = 0;a<6;a++) //5s倒計時準備搶答
- {
- P2 = 0xf7;//1111 0111 //第四位數碼管顯示5s倒計時
- P0 = zhunbei[a];
- delayzb(800);
- P2 = 0xff;
- }
- }
-
- while(1)
- {
- Getch();
-
- if(keyqc == 0)
- {
- delayms(3); //去除抖動
- if(keyqc == 0)
- {
- while(!keyqc); //如果按下清除鍵,則回到- --狀態
- goto LOOP1; //goto語句,回到loop1表號處
- }
- }
-
-
-
-
- /*以下是八個選手搶答,key1表示1號選手,依次類推,注釋只寫第一位選手,其他和第一個完全一致*/
-
- if((keyvalue>=1)&&(keyvalue<=8)&&(TR0==0)) //在定時器關閉狀態下,key1==0 則說明1號選手按下按
- {
- beep=0; //蜂鳴器響
-
- //while(!key1); //去除按鍵抖動后,重新在判斷,是否確實按下
- beep=1; //蜂鳴器不響
- TR0=1; //定時器開始
- while(1)
- {
- mode = keyvalue;
- playerxs(); //顯示選手編號
- djsxs(); //顯示剩余倒計時時間
- //keyvalue = 1;
-
- if(keyqc == 0)
- {
- delayms(3); //去除抖動
- if(keyqc == 0)
- {
- while(!keyqc); //如果按下清除鍵,則回到- --狀態
- goto LOOP1; //goto語句,回到loop1表號處
- }
- }
- if(keytz == 0) //暫停按下按下
- {
- delayms(3); //去除抖動
- if(keytz == 0) //再次判斷是否按下復位按鍵
- {
- while(!keytz) //如果按下復位鍵,則回到- --狀態
- TR0=0;
- }
- }
- if(keyks == 0)//開始按鍵
- {
-
- beep=0;//蜂鳴器響
- delayms(30); //去除按鍵抖動
- if(keyks == 0) //確定開始按下
- {
- while(!keyks); //松手檢測
- {
- beep=1; //蜂鳴器不響
- delay();
-
- TR0 = 1;
- }
- }
- }
- if(djs == 0)
-
- break;
-
- }
- }
-
- if (mode!=0)
- {
- TR0 = 0;
-
- while(1)
- {
- P0=table[mode];
- smg1=0;
- delayms(3);
- smg1=1; //顯示選手編號
- P0=table[fs[mode]];
- smg4=0;
- delayms(3);
- smg4=1;
- Getch();
- if(keyvalue == 9)
- {
- keyvalue = 0;
- mode++;
- if(mode>8)
- {
- mode=0;
- }
- }
- else if(keyvalue == 10) //加分
- {
- keyvalue = 0;
- fs[mode]++;
- if(fs[mode] == 10)
- fs[mode] = 9;
- }
復制代碼
|
-
-
八路搶答器last.zip
2020-5-14 20:05 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
32.09 KB, 下載次數: 36, 下載積分: 黑幣 -5
|