標(biāo)題:
單片機(jī)數(shù)字電子搶答器程序
[打印本頁]
作者:
EdwinZhong
時(shí)間:
2019-6-28 10:50
標(biāo)題:
單片機(jī)數(shù)字電子搶答器程序
用八路搶答器實(shí)現(xiàn) 1、4、6按下后,裁判鍵按下不能復(fù)位。 1、4、6的復(fù)位需要關(guān)斷電源開關(guān)后約20秒 少于20秒重新開電源時(shí),仍顯示146 2、3、5、8、0正常 7無法自鎖。
單片機(jī)源程序如下:
#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;//倒計(jì)時(shí)結(jié)束標(biāo)記
bit WARNING=0;//倒數(shù)十秒控制變量
bit INT_ON=0;//中斷標(biāo)記
bit key_down=0;//鍵盤輔助變量
uchar RIGHT=0xff;//按鍵暫存器
uchar CONT=0; //定時(shí)器輔助變量
uchar res_time=0;//時(shí)間
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í)函數(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; //定時(shí)器0方式1
IE=0x86; //開啟外部中斷1,定時(shí)器中斷0,及總中斷 10000110B
IP=0X04; //外部中斷優(yōu)先級(jí)高于定時(shí)器
CONT=0; //時(shí)間清零
res_time=0;
}
//外部中斷1處理程序
void exint1_int() interrupt 2 using 0
{
uchar t=200;
EA=0;//關(guān)中斷
TR0=0;//關(guān)定時(shí)器
WARNING=0;//關(guān)警告
while(t--)beep=0;//軟件延時(shí),消除抖動(dòng)
RIGHT=P0; //獲得按鍵值
INT_ON=1; //標(biāo)記中斷
}
//定時(shí)器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); //延時(shí)
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,錯(cuò)誤
}
}
//顯示答案
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)掉計(jì)時(shí)器
beep=0; //開蜂鳴器
WARNING=0; //清警告標(biāo)記
time_over=0;//清溢出標(biāo)記
TR0=0; //關(guān)定時(shí)器
INT_ON=0;//清除中斷標(biāo)記
TL0=0X00;//初始值設(shè)置
TH0=0X4C;
CONT=0;
res_time=set_time;//賦初始值
delay_ms(100);
LED=leds[16];//清屏,同時(shí)關(guān)蜂鳴器
BG=1;//關(guān)燈
}
void debug(void)//處理犯規(guī)隊(duì),顯示犯規(guī)隊(duì)隊(duì)號(hào)
{
RIGHT=P0;//獲得犯規(guī)隊(duì)的地址
LED=leds[juder()];//顯示隊(duì)號(hào)
BELL(4);
}
//開啟搶答器
//1普通模式
//0倒計(jì)時(shí)模式
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; //倒計(jì)時(shí)方式
else //普通方式
{
clear();
BG=0;//開燈指示
}
EA=1;//使能中斷
break;
}
case 3:clear();break;//清除
case 4:return;//返回
}
}
if(TR0==1)//倒計(jì)時(shí)
{
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];//顯示個(gè)位數(shù)據(jù);
}
if(res_time<10)//最后十秒標(biāo)記
{
WARNING=1;
LED=leds[res_time];
}
beep=alarm;
delay_ms(5);
}
if(time_over) //倒計(jì)時(shí)結(jié)束處理
{
clear();
LED=leds[0];
time_over=0;
BELL(3);
}
if(INT_ON)//有選手按下
{
TR0=0;//關(guān)定時(shí)器
beep=0;//開提示音
BG=1;//關(guān)燈
delay_ms(100);
INT_ON=0;
LED=leds[juder()];//顯示選手號(hào)
}
}
}
void main()
{
bit set=0;//設(shè)置狀態(tài)標(biāo)記
bit model=1; //模式標(biāo)記
uchar key;
Init_Sys();//初始化外部中斷 1 捕獲按鍵輸入
P0=0XFF;
TR0=1;//開啟定時(shí)器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è)置時(shí)間
else LED=leds[15];
}
}
}
復(fù)制代碼
所有資料51hei提供下載:
搶答器.rar
(1.01 MB, 下載次數(shù): 7)
2019-6-28 10:48 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1