8051单片机抢答器C程序
ns : none
***************************************************************************/
void SPEAKER_count(void)
{
unsigned char i;
for (i=0;i<10;i++)
{
BEEP =1; //点亮
delayus(20);
BEEP =0; //熄灭
delayus(20);
}
}
void SPEAKER_start(void)
{
unsigned char i;
for(i=0;i<200;i++)
{
BEEP =1; //点亮
delayus(10);
BEEP =0; //熄灭
delayus(10);
}
}
void SPEAKER_foul(void)
{
unsigned char i;
for(i=0;i<250;i++)
{
BEEP =1; //点亮
delayus(15);
BEEP =0; //熄灭
delayus(17);
}
}
void SPEAKER_get(void)
{
unsigned char i;
for(i=0;i<250;i++)
{
BEEP =1; //点亮
delayus(10);
BEEP =0; //熄灭
delayus(10);
}
for(i=0;i<250;i++)
{
BEEP =1; //点亮
delayus(20);
BEEP =0; //熄灭
delayus(20);
}
}
/**************************************************************************
* 主程序
***************************************************************************/
void main()
{
Byte keyPressed,i;//选手按键号码,没有的话为0
Bool hostPressed;//用来记录主持人按键取消,0为没有动作,1为取消
number_temp=P1&0xf0;//P1口上次的状态,在调整倒计时时间的时候用到的
LS138_E1=1; //译码器初始化
MAX7219_Init();//数码管初始化
GetCounter();//获取开始时候设置的倒计时时间
MAX7219_DisplayChar(DIG_1,co
MAX7219_DisplayChar(DIG_2,READY);//调时间的时候右位的显示
//while(1);
while(GetHostStartKey()==0)//当主持人没有按键的时候进入循环
{
if (number_temp!=(P1&0xf0))//若调整了倒计时时间,则P1口状态变了,就要重新设置和显示
{
GetCounter();//获取调整以后的倒计时时间
MAX7219_DisplayChar(DIG_1,co
number_temp=P1&0xf0;//记录下来现在P1口的状态,以备后面的比较
}
} //当主持人按键以后就结束调整进入抢答倒计时
MAX7219_DisplayChar(DIG_1,READY);
while(GetHostCancelKey()==0);
MAX7219_DisplayChar(DIG_1,READY);//清空右边一位数码管
MAX7219_DisplayChar(DIG_2,co
for (i=100;i--;i>0)
Delay10ms();//防止后面出现连读的情况..
//调整好倒计时时间后,按下start显示"--",再按下cancel则显示倒计时时间,此时可以开始倒计时了.
counterBack=intrCounter;
//这里原来写的是while(1),写上后就不行了,不知道为何..
while(1)//这里要用自己加的循环来把程序束缚在这里运行
{
showNum=beginNum;//设置要显示的时间,当然时从倒计时时间开始
intrCounter=counterBack;//设置总中断的次数
TR0=0;//禁用计时器0
isPressed=0;//记录是否有人按键
isStart=0;//没有开始抢答
while(GetHostStartKey()==0);
IT0_Init();//初始化计时器0, 启用.
MAX7219_DisplayChar(DIG_1,CLEAR);//清空左边一位数码管
MAX7219_DisplayChar(DIG_2,co
while(!isPressed)//如果没有记录到有人按键就进入
{
keyPressed=GetPressed(P1);//查询一下P1口的状态,即按键情况
hostPressed=GetHostCancelKey();
if (!keyPressed&&!hostPressed)//如果没有人按键,就进入下次循环
continue;
else
{
TR0=0;//关闭定时器
isPressed=1;//记录到有人按键,提供条件跳出循环
}
}
if (keyPressed!=0)
{
if (isStart)//如果已经开始抢答
{
PressedHandle(keyPressed);//处理按键,即显示抢答选手号码
GetOrFoulHandle(GET);//处理抢答
LS138_E1=0; //译码器准备工作
switch (keyPressed)
{
case 1: LS138_A=0;LS138_B=0;LS138_C=0;break; //1号成功灯亮
case 2: LS138_A=0;LS138_B=1;LS138_C=0;break; //2号成功灯亮
case 3: LS138_A=1;LS138_B=0;LS138_C=0;break; //3号成功灯亮
case 4: LS138_A=1;LS138_B=1;LS138_C=0;break; //4号成功灯亮
default : break;
}
//SPEAKER_get();//处理抢答
}
else//否则,没有开始抢答
{
PressedHandle(keyPressed);//处理按键,即显示抢答选手号码
GetOrFoulHandle(FOUL);//处理犯规,必须要放在后面,因为显示数字的里面有一个clear
LS138_E1=0; //译码器准备工作
switch (keyPressed)
{
case 1: LS138_A=0;LS138_B=0;LS138_C=1;break; //1号犯规灯亮
case 2: LS138_A=0;LS138_B=1;LS138_C=1;break; //2号犯规灯亮
case 3: LS138_A=1;LS138_B=0;LS138_C=1;break; //3号犯规灯亮
case 4: LS138_A=1;LS138_B=1;LS138_C=1;break; //4号犯规灯亮
default : break;
}
//SPEAKER_foul();//犯规发声
}
8051单片机抢答 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)