/*-----------------------------------------------
名称:抢答器
内容:
实现现象:当开始按键按下时开始抢答,按键抢答,先按的键有效,其他按键锁死
同时数码管显示当前抢答号,同时计时60S后,蜂鸣器响
再按开始按键后重新开始抢答,计时期间复位有效
原理:最先按下按键者有效,其他均无效
------------------------------------------------*/
#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
#define uchar unsigned char
#define DataPort P0 //定义数据端口 程序中遇到DataPort 则用P0 替换
#define KeyPort P3//按键口
#define LatchPort P2
//uchar code dofly_DuaMa[]={0xef,0xdf,0xbf,0x7f};
uchar code dofly_DuanMa[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,
0x77,0x7c,0x39,0x5e,0x79,0x71};// 显示段码值0~F(共阳)
uchar code dofly_WeiMa[]={0x7f,0xbf,0xdf,0xef};//分别对应相应的数码管点亮,即位码
uchar TempData[8]; //存储显示值的全局变量
uchar dat;
static uchar m,t,fen,num,kz;
sbit beep=P1^3;
bit star,cont,flag;
void DelayUs2x(uchar t);//us级延时函数声明
void DelayMs(uchar t); //ms级延时
void Display();//数码管显示函数
uchar KeyScan(void);//键盘扫描
/*------------------------------------------------
定时器初始化子程序
------------------------------------------------*/
void Init_Timer0(void)
{
TMOD |= 0x21; //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响
TH0=(65536-50000)/256; //重新赋值 50ms
TL0=(65536-50000)%256;
EA=1; //总中断打开
ET0=1; //定时器中断打开
ET1=1;
TR0=1; //定时器开关打开
}
/*-----------------------------------------------
主函数
------------------------------------------------*/
main()
{
Init_Timer0();
while(1)
{
dat=KeyScan();
if(dat!=0xff)//执行一次就停止了 先检测到的响应 复位后有效
{
if(dat==5){star=1;TR1=0;cont=0;m=t=0;flag=0;}
else if(star)dat=0xff;
if(dat<5&&dat!=0)