- #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))
|