微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 8051单片机抢答器C程序

8051单片机抢答器C程序

时间:11-13 来源:互联网 点击:

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,code_table[beginNum]);//显示开始时设置的倒计时时间,在左位设置

MAX7219_DisplayChar(DIG_2,READY);//调时间的时候右位的显示

//while(1);

while(GetHostStartKey()==0)//当主持人没有按键的时候进入循环

{

if (number_temp!=(P1&0xf0))//若调整了倒计时时间,则P1口状态变了,就要重新设置和显示

{

GetCounter();//获取调整以后的倒计时时间

MAX7219_DisplayChar(DIG_1,code_table[beginNum]);//显示调整以后的倒计时时间

number_temp=P1&0xf0;//记录下来现在P1口的状态,以备后面的比较

}

} //当主持人按键以后就结束调整进入抢答倒计时

MAX7219_DisplayChar(DIG_1,READY);

while(GetHostCancelKey()==0);

MAX7219_DisplayChar(DIG_1,READY);//清空右边一位数码管

MAX7219_DisplayChar(DIG_2,code_table[beginNum]);

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,code_table[beginNum]);

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();//犯规发声

}

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top