基本功能 1、同时供 8 名选手或 8个代表队参加比赛,分别用 8个按钮 K1 ~ K8 表示。 2、设置一个系统抢答控制开关 K0,该开关由主持人控制。 3、抢答器具有锁存与显示功能。即选手按动按钮,锁存相应的编号,扬声器发出声响提示,并在七段数码管上显示选手号码。选手抢答实行优先锁存,优先抢答选手的编号一直保持到主持人将系统清除为止。 4、抢答器具有定时抢答功能,且一次抢答的时间由主持人设定(如 10秒)。当 主持人启动 "开始"键后,定时器进行减计时。 5、参赛选手在设定的时间内进行抢答,抢答有效,定时器停止工作,显示器上显示选手的编号和抢答的时间,并保持到主持人将系统清除为止。在这段时间如果定时时间已到,无人抢答,本次抢答无效,系统报警并禁止抢答,定时显示器上显示FFF。 源代码如下
- #include<reg51.h>
- typedef unsigned char uchar;
- typedef unsigned int uint;
- sbit K0=P3^0;// 开始抢答按键
- sbit beep=P3^7;// 蜂鸣器
- sbit D0=P3^1;// 指示灯
- sbit K1=P1^0;//1 号选手抢答按键
- sbit K2=P1^1;//2 号选手抢答按键
- sbit K3=P1^2;//3 号选手抢答按键
- sbit K4=P1^3;//4 号选手抢答按键
- sbit K5=P1^4;//5 号选手抢答按键
- sbit K6=P1^5;//6 号选手抢答按键
- sbit K7=P1^6;//7 号选手抢答按键
- sbit K8=P1^7;//8 号选手抢答按键
- sbit S1=P3^2;// 答 题 计 时 键
- sbit S2=P3^3;// 开始抢答时间调整键
- sbit S3=P3^4;// 答题计时时间调整键
- char s;
- uchar num=0;
- char time1;// 抢答时间
- char time2;// 答题限时时间
- uint m,n;//T0,T1 定时器定一秒时
- bit flag1,flag2,flag3,flag4; // 标志位
- bit aa,bb;// 时间调整标志位
- // 延时子函数
- void delay(uint z)
- {
- uint x,y; for(x=z;x>0;x--)
- for(y=120;y>0;y--);
- }
-
- uchar code table1[]={
- // 共阴数码管段码值
- 0x3f,0x06,0x5b,0x4f,
- 0x66,0x6d,0x7d,0x07,
- 0x7f,0x6f,0x77,0x7c,
- 0x39,0x5e,0x79,0x71
- };
- uchar code table2[]={
- // 共阴数码管位码值
- 0xfe,0xfd, 0xfb,0xf7
- };
- // 初始化子函数
- void init()
- {
- TMOD=0x11;
- TH0=(65536-2000)/256;
- TL0=(65536-2000)%256;
- TH1=(65536-2000)/256;
- TL1=(65536-2000)%256;
- ET0=1;
- ET1=1;
- EA=1;
- P0=0x00;
- time1=10;
- time2=10;
- flag2=1;
- }
- // 开始键扫描子函数
- void key1()
- {
- uchar i=100;
- if(K0==0)
- {
- delay(10);
- if(K0==0)
- {
- while(K0==0&&i)
- {
- i--;
- delay(10);
- }
- TR0=1;
- s=time1;
- m=0;
- flag1=1;
- flag2=1;
- flag3=1;
- num=0;
- beep=1;
- D0=1;
- flag4=0; // 清除违规标志位
- aa=0;
- bb=0;
- }
- }
- }
- // 选手抢答按键扫描子函数
- void key()
- {
- uchar i=100;
- if(K1==0)
- {
- delay(10);
- if(K1==0)
- {
- while(K1==0&&i)
- {
- i--;
- delay(10);
- }
- num=1; // 数码管显示 1 号 "1"
- TR0=0; // 关闭定时器 0, 时间停止
- TR1=1; // 打开定时器 1, 使扬声器响一声
- flag2=0; // 关闭开始键标志位 , 使再按其他七个键不会响应
- }
- }
- if(K2==0) // 下面七个键的处理同上
- {
- delay(10);
- if(K2==0)
- {
- while(K2==0&&i)
- {
- i--;
- delay(10);
- }
- num=2;
- TR0=0;
- TR1=1;
- flag2=0; // 重 要
- }
- }
- if(K3==0)
- {
- delay(10);
- if(K3==0)
- {
- while(K3==0&&i)
- {
- i--;
- delay(10);
- }
- num=3;
- TR0=0;
- TR1=1;
- flag2=0;
- }
- }
- if(K4==0)
- {
- delay(10);
- if(K4==0)
- {
- while(K4==0&&i)
- {
- i--;
- delay(10);
- }
- num=4;
- TR0=0;
- TR1=1;
- flag2=0;
- }
- }
- if(K5==0)
- {
- delay(10);
- if(K5==0)
- {
- while(K5==0&&i)
- {
- i--;
- delay(10);
- }
- num=5;
- TR0=0;
- TR1=1;
- flag2=0;
- }
- }
- if(K6==0)
- {
- delay(10);
- if(K6==0)
- {
- while(K6==0&&i)
- {
- i--;
- delay(10);
- }
- num=6;
- TR0=0;
- TR1=1;
- flag2=0;
- }
- }
- if(K7==0)
- {
- delay(10);
- if(K7==0)
- {
- while(K7==0&&i)
- {
- i--;
- delay(10);
- }
- num=7;
- TR0=0;
- TR1=1;
- flag2=0;
- }
- }
- if(K8==0)
- {
- delay(10);
- if(K8==0)
- {
- while(K8==0&&i)
- {
- i--;
- delay(10);
- }
- num=8;
- TR0=0;
- TR1=1;
- flag2=0;
- }
- }
- }
- // 数码管显示子函数
- void display()
- {
- if(flag1==1) // 开始键按下 , 开始计时抢答
- {
- if(num!=0) // 如果有人抢答 , 则显示相应的几号
- {
- P0=table1[num]; // 显示几号抢到了
- P2=table2[0]; delay(2); P0=0;
- P2=0xff;
复制代码 限于篇幅,全部程序请从附件下载
|