void buzzer(unsigned char t) //蜂鸣器发声函数,改变传入参数t的值可以改变发出声音 {
unsigned char i; for(i = 0;i<100;i++) { beep = 1; //脉冲使蜂鸣器发声 delayus(t); //控制脉冲周期 可以改变发生频率,即声音 }
beep = 0; //发声完后,端口给低 }
void dis_1(unsigned char num1) //1个数码管的显示函数 显示的是哪一位选手按下了 {
seg_1 = OPEN; //开数码管的显示 seg_2 = OFF; seg_3 = OFF;
dat = seg_dat[num1]; //让数码管显示对应的数值 delayms(5); //短暂的延时可以增加亮度 dat = seg_dat[10]; //关闭显示,避免在动态显示时,这一次的值对下一次的值造成干扰。 }
void dis_2(unsigned char num2) //2个数码管的显示函数 显示的是倒计时时间 {
unsigned char shi,ge;
shi = num2/10; //提取出各个位的值 ge = num2; seg_1 = OFF; seg_2 = OPEN; //开数码管的显示 seg_3 = OFF;
dat = seg_dat[shi]; //让数码管显示十位的数值 delayms(5); //短暂的延时可以增加亮度
1
dat = seg_dat[10]; //关闭显示,避免在动态显示时,这一次的值对下一次的值造成干扰。
seg_1 = OFF; seg_2 = OFF; seg_3 = OPEN; //开数码管的显示
dat = seg_dat[ge]; //让数码管显示十位的数值 delayms(5); //短暂的延时可以增加亮度 dat = seg_dat[10]; //关闭显示,避免在动态显示时,这一次的值对下一次的值造成干扰。 }
void delayms(unsigned int i) //延时大约ims {
unsigned int x,y; for(x = 0;x
void delayus(unsigned int i) //延时大约ius {
unsigned int x; for(x = 0;x
//**************************************************** //主函数
//****************************************************
void main(void) {
unsigned char x=0; //用来储存键值
while(!flag1) //当主持人没有按下按键时,其他人按下按键,蜂鸣器响 {
1
x = key_scan(); while(flag2 == 1) //当主持人没有按下,而其他人按下时,选手数码管上显示犯规选手的序号,同时蜂鸣器发声报警 { buzzer(2); //蜂鸣器发声 dis_1(x); //显示犯规选手的序号 seg_1 = OFF; seg_2 = OPEN; //开数码管的显示 seg_3 = OFF; dat = 0x74; //让数码管显示十位的数值 delayms(5); //短暂的延时可以增加亮度 dat = seg_dat[10]; //关闭显示,避免在动态显示时,这一次的值对下一次的值造成干扰 seg_1 = OFF; seg_2 = OFF; //开数码管的显示 seg_3 = OPEN; dat = 0x74; //让数码管显示十位的数值 delayms(5); //短暂的延时可以增加亮度 dat = seg_dat[10]; //关闭显示,避免在动态显示时,这一次的值对下一次的值造成干扰 } while(flag1) //当主持人按下按键后 设置定时器,开始倒计时 { TMOD = 0x01; //定时器工作模式1 TH0 = (65536 - 50000)/256; //单次计时时间为50ms TL0 = (65536 - 50000)%6; TR0 = 1; //计数器开始计数 ET0 = 1; //开启计数器0中断 EA = 1; //开总中断 } dis_1(0); //初始时,选手的数码管显示0 dis_2(30); //初始时,倒计时的数码管显示30 }
1
flag2 = 0; //主持人标志位清零 x = 0; //键值储存清零 while(!flag2) //此时抢答环节开始,倒计时,并判断是否有选手抢答 { x = key_scan(); if(T0count >= 20 ) //当TOcount=20时,表示计时1s { T0count = 0; //清零 Time_Left --; } if (Time_Left == 0) //当倒计时为0时,蜂鸣器响, { buzzer(20); //蜂鸣器响 dis_2(0); //数码管显示0 dis_1(0); //数码管显示0 TR0 = 0; //关闭定时器 } dis_2(Time_Left); //倒计时显示 dis_1(x); }
TR0 = 0; //关闭定时器 while(1) //整个环节结束,显示倒计时时间和抢搭选手的序号 ,蜂鸣器响 {
dis_2(Time_Left); dis_1(x); buzzer(2); } }
//**************************************************** //T0中断函数
//**************************************************** void timer0(void) interrupt 1 //计数器0中断 {
1
}
TH0 = (65536 - 50000)/256; //重装初值 TL0 = (65536 - 50000)%6; T0count++;
1