|
用八路搶答器實現(xiàn) 1、4、6按下后,裁判鍵按下不能復(fù)位。 1、4、6的復(fù)位需要關(guān)斷電源開關(guān)后約20秒 少于20秒重新開電源時,仍顯示146 2、3、5、8、0正常 7無法自鎖。
單片機源程序如下:
- #include <reg51.h>
- #define LED P2 //宏定義,使用LED代替P3口(相當(dāng)于LED=P3)
- #define uchar unsigned char //用uchar代替unsigned char方便操作
- #define uint unsigned int
- sbit beep=P2^7;//蜂鳴器
- sbit BG=P3^7;//指示燈
- sbit key4=P1^0;//按鍵D
- sbit key2=P1^1;//按鍵B
- sbit key1=P1^2;//按鍵A
- sbit key3=P1^3;//按鍵C
- bit time_over=0;//倒計時結(jié)束標(biāo)記
- bit WARNING=0;//倒數(shù)十秒控制變量
- bit INT_ON=0;//中斷標(biāo)記
- bit key_down=0;//鍵盤輔助變量
- uchar RIGHT=0xff;//按鍵暫存器
- uchar CONT=0; //定時器輔助變量
- uchar res_time=0;//時間
- uchar set_time=30;
- uchar leds[17]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,
- 0x90,0x88,0x83,0xa7,0xa1,0x86,0x8e,0xff};
- /*------------------time ms延時函數(shù)-----------------*/
- void delay_ms(uint time)
- {
- uchar tres;
- for(;time>0;time--)
- {
- tres=150;
- while(tres--);
- }
- }
- //外部中斷1初始化程序
- void Init_Sys() //中斷初始化函數(shù)
- {
- TCON=0x00; //外部中斷1低電平觸發(fā)
- TMOD=0X01; //定時器0方式1
- IE=0x86; //開啟外部中斷1,定時器中斷0,及總中斷 10000110B
- IP=0X04; //外部中斷優(yōu)先級高于定時器
- CONT=0; //時間清零
- res_time=0;
- }
- //外部中斷1處理程序
- void exint1_int() interrupt 2 using 0
- {
- uchar t=200;
- EA=0;//關(guān)中斷
- TR0=0;//關(guān)定時器
- WARNING=0;//關(guān)警告
- while(t--)beep=0;//軟件延時,消除抖動
- RIGHT=P0; //獲得按鍵值
- INT_ON=1; //標(biāo)記中斷
- }
- //定時器0中斷處理程序
- void count_int() interrupt 1 using 1
- {
- TH0=0X4C;//重新裝載
- TL0=0X00;
- CONT++;
- if(CONT==20)
- {
- CONT=0;
- if(res_time==0)time_over=1;
- res_time--;
- }
- }
- //遙控按鍵掃描程序
- uchar key_scan(void)
- {
- P1=0xff;
- if(key1==1||key2==1||key3==1||key4==1)
- {
- if(!key_down)
- {
- delay_ms(10); //延時
- key_down=1; //限制
- if(key1==1)return 1;//按鍵A
- if(key2==1)return 2;//按鍵B
- if(key3==1)return 3;//按鍵C
- if(key4==1)return 4;//按鍵D
- }
- else return 0;
- }
- else if(key_down)key_down=0;//消除限制
- return 0; //未獲得任何按鍵
- }
- uchar juder(void)
- {
- switch(RIGHT)
- {
- case 0xff:return 0;
- case 0xfe:return 1;
- case 0xfd:return 2;
- case 0xfb:return 3;
- case 0xf7:return 4;
- case 0xef:return 5;
- case 0xdf:return 6;
- case 0xbf:return 7;
- case 0x7f:return 8;
- default:return 14;//E,錯誤
- }
- }
- //顯示答案
- void show_answer(void)
- {
- uchar ti=0;
- uchar key=0;
- while(1)
- {
- key=key_scan();
- if(ti==100){BG=!BG;ti=0;}
- if(key!=0)
- {
- LED=leds[key+9];//顯示答案
- BG=1;//滅燈
- break;
- }
- ti++;
- delay_ms(1);
- }
- }
- void BELL(uchar times)
- {
- while(times--)
- {
- beep=0;
- delay_ms(100);
- beep=1;
- delay_ms(100);
- }
- }
- //清除顯示
- void clear(void)
- {
- EA=0; //關(guān)掉計時器
- beep=0; //開蜂鳴器
- WARNING=0; //清警告標(biāo)記
- time_over=0;//清溢出標(biāo)記
- TR0=0; //關(guān)定時器
- INT_ON=0;//清除中斷標(biāo)記
- TL0=0X00;//初始值設(shè)置
- TH0=0X4C;
- CONT=0;
- res_time=set_time;//賦初始值
- delay_ms(100);
- LED=leds[16];//清屏,同時關(guān)蜂鳴器
- BG=1;//關(guān)燈
- }
- void debug(void)//處理犯規(guī)隊,顯示犯規(guī)隊隊號
- {
- RIGHT=P0;//獲得犯規(guī)隊的地址
- LED=leds[juder()];//顯示隊號
- BELL(4);
- }
- //開啟搶答器
- //1普通模式
- //0倒計時模式
- void start(uchar type)
- {
- bit alarm=1;//提示音
- uchar key=0;
- res_time=set_time;//獲取初始值
- while(1)
- {
- key=key_scan();//掃描鍵盤
- if(key!=0)
- {
- switch(key)
- {
- case 1://顯示答案
- {
- clear();//清除
- show_answer();
- break;
- }
- case 2://開始搶答
- {
- if(P0!=0XFF)
- {
- debug();//處理犯規(guī)
- break;
- }
- if(!type)TR0=1; //倒計時方式
- else //普通方式
- {
- clear();
- BG=0;//開燈指示
- }
- EA=1;//使能中斷
- break;
- }
- case 3:clear();break;//清除
- case 4:return;//返回
- }
- }
- if(TR0==1)//倒計時
- {
- if(CONT==0&&BG)
- {
- if(res_time>=10)LED=leds[res_time/10];
- BG=0;//每秒鐘閃爍一次
- if(WARNING)alarm=0;//最后十秒
- }
- if(CONT==10&&!BG)
- {
- BG=1;
- if(WARNING)alarm=1;//最后十秒
- else LED=leds[res_time%10];//顯示個位數(shù)據(jù);
- }
- if(res_time<10)//最后十秒標(biāo)記
- {
- WARNING=1;
- LED=leds[res_time];
- }
- beep=alarm;
- delay_ms(5);
- }
- if(time_over) //倒計時結(jié)束處理
- {
- clear();
- LED=leds[0];
- time_over=0;
- BELL(3);
- }
- if(INT_ON)//有選手按下
- {
- TR0=0;//關(guān)定時器
- beep=0;//開提示音
- BG=1;//關(guān)燈
- delay_ms(100);
- INT_ON=0;
- LED=leds[juder()];//顯示選手號
- }
- }
- }
- void main()
- {
- bit set=0;//設(shè)置狀態(tài)標(biāo)記
- bit model=1; //模式標(biāo)記
- uchar key;
- Init_Sys();//初始化外部中斷 1 捕獲按鍵輸入
- P0=0XFF;
- TR0=1;//開啟定時器0
- while(1)//死循環(huán)
- {
- key=key_scan();
- if(key!=0)
- {
- if(!model)switch(key)
- {
- case 1:
- {
- set=1;
- set_time+=10;
- if(set_time>90)set_time=10;
- break;
- }
- case 3:
- {
- set=1;
- if(set_time>10)set_time-=10;//范圍限制
- else set_time=90;
- break;
- }
- }
- if(key==2)
- {
- start(model);//開始搶答
- set=0;//非設(shè)置狀態(tài)
- }
- if(key==4)
- {
- model=!model;//模式切換
- set=0; //非設(shè)置狀態(tài)
- }
- }
- if(model)LED=leds[14];
- else
- {
- if(set)LED=leds[set_time/10];//顯示設(shè)置時間
- else LED=leds[15];
- }
- }
- }
復(fù)制代碼
所有資料51hei提供下載:
搶答器.rar
(1.01 MB, 下載次數(shù): 7)
2019-6-28 10:48 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|
|