首先,裁判在右方按下開始按鈕,蜂鳴器響起,搶答開始,初始時間為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)
2018-7-2 16:43 上傳
點擊文件名下載附件
|