至少六路抢答器,每路配备LED和抢答键,数码管显示倒计时,蜂鸣器发出提示音。 1.“开始键”按下,启动20s倒计时,20s内无人抢答,一次长音提示,禁止抢答; 2.20s倒计时内有抢答键按下,对应LED点亮,一次短音提示,其他抢答键禁用; 3.若第一次抢答选手答错,可二次抢答,但第一次抢答选手不可二次抢答; 4.“开始键”未按下,若“抢答键”按下,对应LED点亮,三次短音提示犯规; 5.加分项:选手抢答成功10s后,启动回答倒计时60s功能,倒计时结束两次短音提示。
这周做的抢答器,一键到底 不用按复位 五个功能都实现,可以穿插实现,代码有注释 就是写的长了些,没有分块,在一个.c里
下面放了一个今天刚拍的照片
- #include <reg52.h> //头文件
- #include <intrins.h>
- #define uchar unsigned char //uchar 代替 unsigned char
- #define uint unsigned int //同上
- void delayms(uint); //延时函数ms
- void display(uchar,uchar);//数码管显示
- void keypros(); //键盘(包含全功能)
- void delays(uint xs);//延时s
- void Play(uchar t);//提示音
- /*译码器*/
- sbit LSA=P1^5;
- sbit LSB=P1^6;
- sbit LSC=P1^7;
- /*按键*/
- sbit key_tt=P1^4; //正确
- sbit key_start=P3^6; //一次
- sbit key_start_second=P3^7; //二次
- sbit key1=P3^0; //选手1
- sbit key2=P3^1;
- sbit key3=P3^2;
- sbit key4=P3^3;
- sbit key5=P3^4;
- sbit key6=P3^5; //选手6
- /*蜂鸣器*/
- sbit beep=P2^6;
- /*LED*/
- sbit led1=P2^0; //选手1
- sbit led2=P2^1;
- sbit led3=P2^2;
- sbit led4=P2^3;
- sbit led5=P2^4;
- sbit led6=P2^5; //选手6
- uchar num1,num=60,miaoshi,miaoge,m=1,n=1,p=0,d=0,w1=1,w2=1,w3=1,w4=1,w5=1,w6=1;
- uchar code table[]={0x3f,0x06,0x5b,0x4f,
- 0x66,0x6d,0x7d,0x07,//共阴极数码管数组 包含0~F
- 0x7f,0x6f,0x77,0x7c,
- 0x39,0x5e,0x79,0x71};
- void shumaguan(int i) //数码管位选译码器
- {
- switch(i)
- {
- case 0:
- LSA=0;LSB=0;LSC=0;break;
- case 1:
- LSA=1;LSB=0;LSC=0;break;
- case 2:
- LSA=0;LSB=1;LSC=0;break;
- case 3:
- LSA=1;LSB=1;LSC=0;break;
- case 4:
- LSA=0;LSB=0;LSC=1;break;
- case 5:
- LSA=1;LSB=0;LSC=1;break;
- case 6:
- LSA=0;LSB=1;LSC=1;break;
- case 7:
- LSA=1;LSB=1;LSC=1;break;
- }
- }
-
- void Play(uchar t)//提示音
- {
- uint i;
- for(i=0;i<500;i++)
- {
- beep = ~beep;
- delayms(t);
- }
- beep = 0;
- }
-
- void delayms(uint xms) //延时ms 不准确
- {
- uint i,j;
- for(i=xms;i>0;i--)
- for(j=110;j>0;j--);
- }
-
- void delays(uint xs) //延时2s 不准确
- {
- uint i,z;
- uchar j; //定义两个循环变量i、j
- for(z=xs;z>0;z--)
- for (i = 4165; i > 0; i--) //外层循环1000次
- for (j = 1240; j > 0; j--) ; //内层循环124次
- }
- void main()
- {
-
- TMOD=0x01; //设置定时器0为工作方式1
- TH0=(65536-45872)/256; //装初值
- TL0=(65536-45872)%256;
- EA=1; //开总中断
- ET0=1; //开定时器0中断
- TR0=1; //启动定时器0
-
- while(1)
- {
- //加分项 这里为了方便查看效果,60秒倒计时 改为18秒倒计时
- if(num==53&&(d==1||d==2||d==3||d==4||d==5||d==6))
- {
- Play(1);
- delayms(500);
- Play(1);
- delayms(500);
-
- EA=0; //开总中断
- }
-
- display(miaoshi,miaoge);
- keypros(); //按键函数
- }
- }
- void display(uchar miaoshi,uchar miaoge)//显示子函数
- {
- miaoshi=num/10;
- miaoge=num%10;
-
- shumaguan(0);
- P0=table[miaoshi];
- delayms(1);
- P0=0x00;
-
- shumaguan(1);
- P0=table[miaoge];
- delayms(1);
- P0=0x00;
- }
- void keypros() //按键函数
- {
-
- /*正常情况*/
- if (key_start==0) //检测按键是否按下
- {
- delayms(10); //消除抖动
- if(key_start==0) //再次判断按键是否按下,“开始键”按下
- {
- led1=1;
- led2=1;
- led3=1;
- led4=1;
- led5=1;
- led6=1;
- TR0=1;
- m=0;//初始值为1 只有按下开始键 m=0 不按下开始键 就抢答,犯规
- num=20;
- n=0;//标志位 只允许一个人抢答
- EA=1;
- }
- while(!key_start) //检测按键是否松开
- display(miaoshi,miaoge);
- }
-
- if(num==0)//功能1 p标志位 只进行一次
- {
- if(p==0)
- {
- Play(1);
-
- Play(1);
-
- Play(1);
- delayms(500);
- TR0=0;//无人抢答 关闭倒计时
- n=1;//关闭抢答
- p=1;
- }
- }
-
- if(n==0)//只允许一个人抢答
- {
- m=0;//
-
- if(key1==0&&n==0) //检测按键是否按下 只有n=0才能抢答,保证只有一个人抢答
- {
- delayms(10); //消除抖动
- if(key1==0&&n==0) //再次判断按键是否按下
- {
- if(w1==1)// w1初始值为1;如果按下了二次抢答按钮,w1=0,则不执行以下程序
- {
- TR0=0;
- led1=0;
- Play(1);
- n=1;//按下按钮,标志位为1,不执行其他抢答程序
-
- /*以下 加分项*/
- delays(5);
-
- num=60;
- TR0=1;
- d=1;//说明 选手1 按下按钮
- }
- }
-
- }
- if(key2==0&&n==0) //检测按键是否按下
- {
- delayms(10); //消除抖动
- if(key2==0&&n==0) //再次判断按键是否按下
- {
- if(w2==1)//如果二次按钮按下,w2=0 说明答错了 不进行下一次抢答
- {
- TR0=0;
- led2=0;
- Play(1);
- n=1;
- delays(1);
- //这个时间要改 5 才是10秒
- num=60;
- TR0=1;
- d=2; //选手2按下按钮
- }
- }
-
- }
-
- if(key3==0&&n==0) //检测按键是否按下
- {
- delayms(10); //消除抖动
- if(key3==0&&n==0) //再次判断按键是否按下
- {
- if(w3==1)
- {
- TR0=0;
- led3=0;
- Play(1);
- n=1;
- delays(1);
- //这个时间要改 5 才是10秒
- num=60;
- TR0=1;
- d=3;
- }
- }
-
- }
-
- if(key4==0&&n==0) //检测按键是否按下
- {
- delayms(10); //消除抖动
- if(key4==0&&n==0) //再次判断按键是否按下
- {
- if(w4==1)
- {
- TR0=0;
- led4=0;
- Play(1);
- n=1;
- delays(1);
- //这个时间要改 5 才是10秒
- num=60;
- TR0=1;
- d=4;
- }
- }
-
- }
-
- if(key5==0&&n==0) //检测按键是否按下
- {
- delayms(10); //消除抖动
- if(key5==0&&n==0) //再次判断按键是否按下
- {
- if(w5==1)
- {
- TR0=0;
- led5=0;
- Play(1);
- n=1;
- delays(1);
- //这个时间要改 5 才是10秒
- num=60;
- TR0=1;
- d=5;
- }
- }
-
- }
-
- if(key6==0&&n==0) //检测按键是否按下
- {
- delayms(10); //消除抖动
- if(key6==0&&n==0) //再次判断按键是否按下
- {
- if(w6==1)
- {
- TR0=0;
- led6=0;
- Play(1);
- n=1;
- delays(1);
- //这个时间要改 5 才是10秒
- num=60;
- TR0=1;
- d=6;
- }
- }
-
- }
-
- }
-
- /*犯规情况功能4*/
- if(m==1)//不按下开始键 m=1
- {
- if (key_start!=0) //检测按键是否按下 未按下则执行下面
- {
- led1=1;
- led2=1;
- led3=1;
- led4=1;
- led5=1;
- led6=1;
- if(key1==0&&key_start!=0) //开始键未按下,按下抢答器 执行下面
- {
复制代码
|