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

8051单片机抢答器C程序

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

ak;//只有P1.4,key4抢答

}

/*

switch (KeyState)

{

case 0x00: key=0;break;//全高,无人抢答

case 0x01: key=1;break;//只有P1.0,key1抢答

case 0x02: key=2;break;//只有P1.1,key2抢答

case 0x04: key=3;break;//只有P1.2,key3抢答

case 0x08: key=4;break;//只有P1.3,key4抢答

}

*/

//上面是在用高电平来判断抢答状态时的程序,经证明不知道为何无效

return key;

}

/**************************************************************************

* IT0_Init

*

* Description: 初始化计时器T0的状态

* Arguments : none

* Returns : none

***************************************************************************/

void IT0_Init(void)

{

TMOD=0x01;//设置T0在方式1下工作

TH0=0x3C;

TL0=0xAF;//这两个寄存器存的是计数器的计数开始的值,计算发现这两个值累加至溢出后正好是50ms

ET0=1;//使T0中断可以溢出

EA=1;//开启总中断

TF0=0;//溢出位清零

TR0=1;//开启T0

}

/**************************************************************************

* Timer0_Overflow() interrupt 1

*

* Description: 中断溢出服务程序, 采用的是中断方式1, 后面最好不加using选择寄存器组以免与系统用在主程序的寄存器冲突

* Arguments : none

* Returns : none

***************************************************************************/

void Timer0_Overflow() interrupt 1

{

static Byte second=20;//用20次中断来判断1秒

TH0=0x3C;

TL0=0xAF;

second--;

intrCounter--;

/*

if (second==0)//每隔一秒的操作

{

MAX7219_DisplayChar(DIG_2,code_table[--showNum]); //要避免用上面的会造成显示"0"后面一秒钟,才进入开始

second=20;//重新赋值每秒计数器

if (intrCounter==0)

{

TR0=0;//关闭T0计数器

isStart=1;//计时结束,进入正常抢答

//SPEAKER_start();//开始抢答的声音

}

//待显示"0"以后就开始抢答

else

{

//SPEAKER_count();//倒计时声音

}

}

*/

if (second==0)//每隔一秒的操作

{

//if (showNum!=1) SPEAKER_count();//倒计时声音

//else SPEAKER_start();//开始抢答的声音

MAX7219_DisplayChar(DIG_2,code_table[--showNum]);//显示数字

second=20;//重新赋值每秒计数器

}//待显示"0"以后就开始抢答

if (intrCounter==0)

{

TR0=0;//关闭T0计数器

isStart=1;//计时结束,进入正常抢答

}

}

/**************************************************************************

* PressedHandle

*

* Description: 按键处理

* Arguments : Byte keyPressed-->按下的按键

* Returns : none

***************************************************************************/

void PressedHandle(Byte keyPressed)

{

MAX7219_Clear();//LED clear

MAX7219_DisplayChar(DIG_2,code_table[keyPressed]);//在右侧数码管显示抢答选手号码,此时没有去判断是否犯规

}

/**************************************************************************

* GetOrFoulHandle(Bool state)

*

* Description: 正常抢答或是犯规处理

* Arguments : Bool state-->是GET和FOUL两个宏的取之之一

* Returns : none

***************************************************************************/

void GetOrFoulHandle(Bool state)

{

if (!state)

{

MAX7219_DisplayChar(DIG_1,LED_FOUL);//如果是犯规的话左边的LED要显示"F",foul

}

}

/**************************************************************************

* CancelHandle()

*

* Description: 处理主持人取消倒计时

* Arguments : none

* Returns : none

***************************************************************************/

void CancelHandle()

{

MAX7219_DisplayChar(DIG_1,LED_C);

MAX7219_DisplayChar(DIG_2,LED_L);//主持人取消倒计时之后,两个数码管显示"CL"-->cancel

}

/**************************************************************************

* delayus()

*

* Description: 延时程序

* Arguments : t-->us

* Returns : time delayed

***************************************************************************/

void delayus(unsigned char t )

{

unsigned char j;

for(;t>0;t--)

for(j=19;j>0;j--);

}

/**************************************************************************

* SPEAKER_count/start/foul/get()

*

* Description: speaker发声程序->计数/开始/犯规/抢答 四种声音

* Arguments : none

* Retur

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

网站地图

Top