- #include<reg51.H>
- sbit Presenter=P2^0;
- sbit K=P3^2;
- bit Presenter_flag=0,flag;//主持人按鍵標志位,僅允許一個數據通過標志位
- unsigned char Timer=0,i; //時間標志
- unsigned char ren=0xff;
- bit x=0;
- void System_Init();
- void System_Rest();
- void main()
- {
- System_Init();
- while(1)
- {
- if(Presenter_flag) //主持人按鍵按下時開始系統
- {
- K=1;
- if(K==1) //主持人按鍵起開
- {break;
- Presenter_flag=0;
- }
- }
- else
- System_Rest();
- }
- }
- void System_Init()
- {
- EA=1; //打開中斷
- EX0=1;
- IT0=1;
- TMOD=0x01;
- ET0=1;
- TH0=(65535-50000)/256; //50ms
- TL0=(65535-50000)%256;
- Presenter=0;
- TR0=0;
- }
- void System_Rest()
- {
- P0=0xff; //復位設置:在主持人按鍵起開或者,搶答時間超過10s或者答題時間超過60s
- P1=0xff;
- TR0=0;
- Presenter=0;
- flag=1;
- i=0;
- Timer=0;
- }
- void into() interrupt 0
- {
- Presenter_flag=1;//主持人按鍵按下
- TR0=1;
- }
- void Timer0() interrupt 1
- {
- TH0=(65535-50000)/256;
- TL0=(65535-50000)%256;
- i++;
- if(i==20) //1s鐘
- {
- i=0;
- Timer++;
- P1=0xff;
- if((Timer<10)&&(P1==0xff)&&(flag==1)) //10s搶答時間,10s內如果無人搶答則復位
- {
- Presenter=~Presenter; //搶答指示燈閃爍
- }
- else if((Timer>=10)&&(P1==0xff)&&(flag==1))
- {
- Presenter_flag=0;
- Timer=0;
- i=0;
- }
- P1=0xff;
- if((Timer<=60)&&(P1!=0xff)&&(flag==1)) //答題時間,60s沒答完則復位
- {
- ren=P1;
- Presenter=1;
- flag=0;
- }
- if(flag==0)
- {
- if(x==0)
- {x=1;P0=0xff;}
- else if(x==1)
- {x=0;P0=ren;}
- }
- if((flag==0)&&(P1==0xff))
- {P0=ren;TR0=0;flag=1;}
- if((Timer>60)&&(P1!=0xff))
|