/************************************************************* 八路抢答器系统 补充说明: ***************************************************************/ #include //头文件 #include #include #include #define uchar unsigned char//宏定义 #define uint unsigned int /**********************引脚定义************************/ sbit key_zhu=P2^2; //主持人键 sbit key_jia=P2^1; //加键 sbit key_jian=P2^0; //减键 sbit key_1=P1^1; //八位选手按键定义 sbit key_2=P1^3; sbit key_3=P1^5; sbit key_4=P1^7; sbit key_5=P3^1; sbit key_6=P3^3; sbit key_7=P3^5; sbit key_8=P3^7; sbit led_1=P1^0; //八位LED灯按键定义 sbit led_2=P1^2; sbit led_3=P1^4; sbit led_4=P1^6; sbit led_5=P3^0; sbit led_6=P3^2; sbit led_7=P3^4; sbit led_8=P3^6; /**********************变量定义************************/ uchar zhu_f=0; //比赛进行阶段标记位,=0表示没有按。=1表示在设置倒计时的时间。=2表示开始抢答 uchar qiang_f=0; //抢答犯规标记,=0没有犯规。=1表示有人犯规 uchar wan_f=0; //抢答完成标记,=0抢答没完成后还没有开始。=1表示抢答完成 uchar time=30; //倒计时时间 uchar T0_num; //定时器0计数 uchar number; //抢答成功选手的编号,或犯规选手的编号。=0的时候表示没有 /******************************************************** 函数名称:void delayms(uint ms) 函数作用:毫秒延时函数 参数说明: ********************************************************/ void delayms(uint ms) { unsigned char i=100,j; for(;ms;ms--) { while(--i) { j=10; while(--j); } } } /******************************************************** 函数名称:void bajing() 函数作用:抢答犯规报警提示 参数说明: ********************************************************/ void bajing() { buzz=0; //开蜂鸣器 delayms(10); buzz=1; //关蜂鸣器 delayms(10); } /******************************************************** 函数名称:uchar qianda() 函数作用:抢答按键检测,返回抢答编号 参数说明: ********************************************************/ uchar qianda() { uchar temp=0; if(key_1==0) //一号犯规,下同 temp=1; //记录1号 else if(key_2==0) temp=2; else if(key_3==0) temp=3; else if(key_4==0) temp=4; else if(key_5==0) temp=5; else if(key_6==0) temp=6; else if(key_7==0) temp=7; else if(key_8==0) temp=8; return temp; } /******************************************************** 函数名称:void led_kongzhi(uchar num,bit mode) 函数作用:LED灯控制 参数说明:num控制哪一个灯,k=1,点亮,=0关闭。mode=0全灭后在控制这个灯,=1单独控制这个灯 ********************************************************/ void led_kongzhi(uchar num,bit k,bit mode) { if(mode==0) { led_1=1; //八位LED灯全灭 led_2=1; led_3=1; led_4=1; led_5=1; led_6=1; led_7=1; led_8=1; } if(k==1) { switch (num) //控制对应LED灯亮 { case 1:led_1=0; break; case 2:led_2=0; break; case 3:led_3=0; break; case 4:led_4=0; break; case 5:led_5=0; break; case 6:led_6=0; break; case 7:led_7=0; break; case 8:led_8=0; break; } } else { switch (num) //控制对应LED灯灭 { case 1:led_1=1; break; case 2:led_2=1; break; case 3:led_3=1; break; case 4:led_4=1; break; case 5:led_5=1; break; case 6:led_6=1; break; case 7:led_7=1; break; case 8:led_8=1; break; } } } /******************************************************** 函数名称:void scan(void) 函数作用:按键检测函数 参数说明: ********************************************************/ void scan(void) { uchar qiangda_num=0; //主持人键 if(key_zhu==0) //按键按下 { delayms(7); //显示消抖 if(key_zhu==0&&zhu_f!=2&&qiang_f==0&&wan_f==0)//判断是否有人犯规或者抢答是否开始或者抢答是否完成 { zhu_f++; //比赛阶段标记+1 if(zhu_f==2) //比赛正式开始 { TR0=1; //比赛开始,开启定时 wan_f=0; //清除比赛完成标志 bajing(); //提示比赛开始 } } else if(key_zhu==0&&qiang_f==1) //判断是否有人犯规 { buzz=1; //清除报警 qiang_f=0; //清除抢答标志 number=0; //清除选手编号 time=EEPROM_read(0x2000);//重新读取存储的抢答总时长 led_kongzhi(0,0,0); } else if(key_zhu==0&&wan_f==1) //判断是否有人完成 { buzz=1; //清除报警 wan_f=0; //清除完成标志 number=0; //清除选手编号 time=EEPROM_read(0x2000);//重新读取存储的抢答总时长 led_kongzhi(0,0,0); } else if(key_zhu==0&&zhu_f==2) //暂停比赛 { TR0=0; //关闭定时 zhu_f=1; //重新回到设置比赛时间阶段 bajing(); //提示暂停比赛 } while(!key_zhu);//检测按键松开 } //加值键,支持连按 if(key_jia==0&&zhu_f==1&&qiang_f==0) //判断是否在设置倒计时时间 { delayms(7); //延时消抖 if(key_jia==0) //再次判断按键按下 { if(time<99) //比赛时间最大值99S time++; //比赛时间+1S EEPROM_delete(0x2000); //擦除EEPROM煽区 EEPROM_write(0x2000,time); //写入【比赛时间】数据保存 display(time/10,time%10,10,0); //显示设置比赛时间 } } //减值键,支持连按 if(key_jian==0&&zhu_f==1&&qiang_f==0) //判断是否在设置倒计时时间 { delayms(7); //延时消抖 if(key_jian==0) //再次判断按键按下 { if(time!=0) //比赛时间最小值0S time--; //比赛时间-1S EEPROM_delete(0x2000); //擦除EEPROM煽区 EEPROM_write(0x2000,time); //写入【比赛时间】数据保存 display(time/10,time%10,10,0); //显示设置比赛时间 } } //选手按键 qiangda_num=qianda(); if(qiangda_num!=0) //判断是否有选手按下按键 { if(zhu_f!=2&&qiang_f==0&&wan_f==0)//如果还没有开始抢答时按下 { zhu_f=1; buzz=0; //蜂鸣器报警 qiang_f=1; //抢答犯规标记 number=qiangda_num; led_kongzhi(number,1,0); } else if(zhu_f==2&&wan_f==0) //在开始抢答时按下 { wan_f=1; //标记抢答完成 zhu_f=0; //主持人标记复位 TR0=0; //关闭倒计时定时器 number=qiangda_num; led_kongzhi(number,1,0); bajing(); //提示有人抢答完成 } } } /********************************************************* 函数名称:void main() 函数作用:主函数函数 参数说明: *********************************************************/ void main() { uchar i=0; T0_init(); //定时器初始化 if(key_jian==0) { delayms(100); if(key_jian==0) { EEPROM_delete(0x2000); //擦除EEPROM煽区 EEPROM_write(0x2000,30); //写入【比赛时间】数据保存 } } time=EEPROM_read(0x2000); //读取存储的【比赛时间】数据 for(i=0;i<9;i++) { led_kongzhi(i,1,1); delayms(10); } for(i=9;i>0;i--) { led_kongzhi(i-1,0,1); delayms(10); } led_kongzhi(0,0,0); while(1) //死循环 { scan(); //按键检测处理 if(zhu_f==0&&wan_f==0) //判断是否还没进入比赛阶段 display(10,10,10,10); //未进入,显示"----" else if(zhu_f==0&&wan_f==1) //进入比赛阶段,并且处于设置比赛时间 display(time/10,time%10,10,number);//显示设置比赛时间 else if(zhu_f!=0) { if(qiang_f==1) //设有人犯规 display(11,11,10,number); //显示FF-犯规编号 else display(time/10,time%10,10,number);//显示比赛剩余时间和抢答者编号,未抢答显示0 } } }