#include <reg52.h> // 定义 MCS-51 单片机寄存器。
sbit start=P3^1; //定义k1为开始的按键
sbit spk=P2^5;
unsigned char ST;
unsigned char keyval; // 读取的键值。
#define DispDat P0
#define KeyDat P3
#define LS P2
#define keyboard P1
unsigned char mSec,Sec;
unsigned char qw,bw,sw,gw;
unsigned char tab[]=
{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40,0x00};
void delay_10us(unsigned int n)
{
while(n--);
}
void Init()
{
TMOD=0x01;
TH0=0x4C;TL0=0x00; // 该值在 12MHz 时为 50ms 中断1次
//TR0=1; //使用时启动定时
ET0=1;
EA=1;
}
void Sound(unsigned char F,unsigned char L)
{
unsigned char f;
unsigned int l;
for(l=0;l<L;l++)
{
spk=l;
for(f=0;f<F;f++);
spk=0;
for(f=0;f<F;f++);
}
}
void Timer0Int(void) interrupt 1
{
TH0=0x4c;
TL0=0x00; // 50ms 中断一次。
mSec++;
if(mSec>=20)
{
mSec=0;
Sec--;
if(Sec==0)
{
ST=0; // 抢答自动到时。
TR0=0;
Sound(60,250); // 长声。
gw=0;
}
}
}
void Delay(unsigned char t)
{
while(t--);
}
void Display()
{
unsigned char j;
qw=Sec/10;
bw=Sec%10;
for(j=0;j<10;j++)
{
LS=0XEF;
DispDat=tab[gw];
Delay(10);
DispDat=tab[0xb];
LS=0XEB;
DispDat=tab[0xa];
Delay(10);
DispDat=tab[0xb];
LS=0XE7;
DispDat=tab[bw];
Delay(10);
DispDat=tab[0xb];
LS=0XE3;
DispDat=tab[qw];
Delay(10);
DispDat=tab[0xb];
}
DispDat=0x00;
}
void Scankey() //键盘扫描程序。
{
unsigned char i;
if(KeyDat!=0xff) //有按键按下。
{
i=~KeyDat; //读取键盘状态。
switch(i)
{
case 0x01: gw=0x01; //K2,键值显示在个位。
TR0=0; //关定时。
Sound(100,250);
ST=0;
break;
case 0x04: gw=0x02; //K3
TR0=0; //关定时。
Sound(100,250); //长声。
ST=0;
break;
case 0x08: gw=0x03; //K4
TR0=0; // 关定时。
Sound(100,250); //长声。
ST=0;
break;
default:break; //其它按键按下不处理。
}
}
keyboard=0xf7;
if(keyboard!=0xf7)
{
delay_10us(1000);
switch(keyboard)
{
case 0x77:gw=0x04; //K5o
TR0=0; //关定时。
Sound(100,250); //长声。
ST=0;
break;
case 0xb7:gw=0x05; //K5o
TR0=0; //关定时。
Sound(100,250); //长声。
ST=0;
break;
case 0xd7:gw=0x06; //K6o
TR0=0; //关定时。
Sound(100,250); //长声。
ST=0;
break;
}
}
}
main() //主程序。
{
unsigned int i;
Init(); //初始化。
DispDat=0x00;
ST=0;
for(i=0;i<300;i++) Display(); // 开始显示。
gw=0; // 平常对号显示”0”。
while(1)
{
if(ST==0)
{
start=1;
if(start==0)
{
keyval=0;
Sound(100,50); //短一声。
TH0=0x4c; TL0=0x00;
mSec=gw=0; //清计时时间、上次获胜对号。
Sec=10; // 预置抢答时限。可以自行设置 1-99 秒限时时间。
TR0=1; // 开始计时。
ST=1; //抢答开始。
}
}
if(ST==1) Scankey(); // 抢答开始后才允许扫描键盘。
if(TR0==0) Sec=0; //不在抢答期,时间显示0。
Display();
}
}
抢答器51单片机stc89c52
最新推荐文章于 2023-11-13 12:24:38 发布