首先,裁判在右方按下开始按钮,蜂鸣器响起,抢答开始,初始时间为20s,若1-8位选手按下按钮,即抢答成功,由显示屏显示该选手号码,如果超过时间(20s)没人认抢答,则时间重置为20s,并此题作废,答题结束后,按下重置按钮,这时时间重置,下次抢答开始。
创新功能(*)在没有按下开始键时,按下修改时间按钮,则时间会减少1s,由于默认时间为20s,所以这个功能可以实现20s内时间的调整
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
单片机源程序如下:
- #include<reg51.h>
- #define uchar unsigned char
- #define uint unsigned int
- #define max 20
- uchar tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
- sbit d1=P2^4;
- sbit d2=P2^5;
- sbit x1=P2^6;
- sbit x2=P2^7;
- sbit k1=P1^0;
- sbit k2=P1^1;
- sbit k3=P1^2;
- sbit k4=P1^3;
- sbit k5=P1^4;
- sbit k6=P1^5;
- sbit k7=P1^6;
- sbit k8=P1^7;
- sbit zk1=P2^0;
- sbit zk2=P2^1;
- sbit buz=P2^2;
- uchar d_num,cnt;
- uchar x_flag;
- void jianpan();
- void init(void)
- {
- TMOD=0X01;
- TL0=0XB0;
- TH0=0X3C;
- // TR0=1;
- ET0=1;
- EA=1;
- d_num=max;
- }
- void delay(uint xms)
- {
- uint x,y;
- for(x=xms;x>0;x--)
- for(y=110;y>0;y--);
- }
- void display()
- {
- d1=0; //位选端;
- P0=tab[d_num/10];//显示倒计时
- delay(5);
- d1=1;
- d2=0;
- P0=tab[d_num%10];
- delay(5);
- d2=1;
- x1=0; //位选端
- P0=tab[x_flag/10];//显示选手号
- delay(5);
- x1=1;
- x2=0;
- P0=tab[x_flag%10];
- delay(5);
- x2=1;
- }
- void main()
- { init();
- while(1)
- {
- jianpan();
- display();
- }
- }
- void timer0(void) interrupt 1
- {
- TL0=0XB0; //重装初值
- TH0=0X3C;
- cnt++;
- if(cnt==20)//1 秒时间到
- {
- cnt=0;//计数清零
- d_num--;
- if(d_num==0)
- {
- d_num=max;
- TR0=0; //关闭所有操作
- }
- buz=0;
- delay(20);
- buz=1;
-
- }
- }
- void jianpan()
- { if(zk1==0&&x_flag==0)
- {
- delay(5);
- x_flag=0;
- TR0=1;
-
- }
- if(zk2==0&&TR0==0)
- {
- delay(5);
- if(zk2==0&&TR0==0)
- {
- if(x_flag==0)
- {
- d_num--; //设置倒计时
- buz=0;
- delay(20);
- buz=1; }
- if(d_num==5)
- d_num=max;
-
- if(x_flag!=0) //选手显示清零
- {
- x_flag=0;
- d_num=max;
- TR0=0;
- buz=0;
- delay(20);
- buz=1;
- }
- while(!zk2)
- display();
- }
- }
-
- if(k1==0&&TR0==1)
- {
- delay(5);
- if(k1==0&&TR0==1)
- {
- x_flag=1;
- TR0=0;
- }
- }
- if(k2==0&&TR0==1)
- {
- delay(5);
- if(k2==0&&TR0==1)
- {x_flag=2;TR0=0;}
-
- }
- if(k3==0&&TR0==1)
- {
- delay(5);
- if(k3==0&&TR0==1)
- {x_flag=3;TR0=0;}
- while(!k3)
- display();
- }
- if(k4==0&&TR0==1)
- {
- delay(5);
- if(k4==0&&TR0==1)
- {x_flag=4;TR0=0;}
-
- }
- if(k5==0&&TR0==1)
- {
- delay(5);
- if(k5==0&&TR0==1)
- {x_flag=5;TR0=0;}
-
- }
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
八路抢答器51单片机设计.zip
(91.6 KB, 下载次数: 441)
|