基于AT89C51单片机的抢答器的设计 |
您所在的位置:网站首页 › 时间倒计时制作 › 基于AT89C51单片机的抢答器的设计 |
基于AT89C51单片机设计制作一个抢答器,具体要求如下: 设计一个智力竞赛抢答器,可同时共8名选手参加比赛,编号为1、2、3、4、5、6、7、8,各用一个按键。用一个按键作为主持人总开关,用来控制系统的清零和抢答的开始。抢答器开始后,数码管开始10秒倒计时,若有选手按动抢答按钮,在LED数码管上显示选手的编号,同时灯亮且伴随声音提示;倒计时完成后,选手不能再抢答;有人抢答成功后,要禁止其他选手抢答,同时开始显示60秒回答时间倒计时提示;最先抢答选手的编号一直保留到主持人将系统清零。仿真图 源码 #include #include sbit smg1=P2^4; //定义数码管第一位 sbit smg2=P2^6; //定义数码管第二位 sbit smg3=P2^7; //定义数码管第三位 sbit smg4=P2^5; sbit keyks=P2^2; //定义开始按键 sbit keytz=P2^1; //定义停止按键 sbit keyqc=P2^0; //定义清除按键 sbit key1=P1^4; //定义1号抢答选手 sbit key2=P1^5; //定义2号抢答选手 sbit key3=P1^6; //定义3号抢答选手 sbit key4=P1^7; //定义4号抢答选手 sbit key5=P3^4; //定义5号抢答选手 sbit key6=P3^5; //定义6号抢答选手 sbit key7=P3^6; //定义7号抢答选手 sbit key8=P3^7; //定义8号抢答选手 sbit spk=P1^0; //定义蜂鸣器 int djs=10,js=0; //djs和bt是初始倒计时时间 unsigned char flag=0; sbit led=P3^0; //定义led灯 int table[]={0x5f,0x44,0x9d,0xd5,0xc6,0xd3,0xdb,0x45,0xdf,0xd7,0x80}; void delayms(int x) //延时函数 { char i; while(x--) { for(i=500;i>0;i--); } } void Timer0_init() //定时器0初始化 { js=0; TMOD=0x01; //T0为定时器方式1 TH0=60; TL0=176; ET0=1; EA=1; } void timer0() interrupt 1 using 1 //定时器0中断服务函数 { TF0=0; TH0=60; TL0=176; //赋初值 js++; if(flag==1) { if(js P0=table[1]; smg1=0; delayms(3); smg1=1; //第一位数码管显示1 } void djsxs2() { P0=table[2]; smg1=0; delayms(3); smg1=1; //第一位数码管显示2 } void djsxs3() { P0=table[3]; smg1=0; delayms(3); smg1=1; //第一位数码管显示3 } void djsxs4() { P0=table[4]; smg1=0; delayms(3); smg1=1; //第一位数码管显示4 } void djsxs5() { P0=table[5]; smg1=0; delayms(3); smg1=1; //第一位数码管显示5 } void djsxs6() { P0=table[6]; smg1=0; delayms(3); smg1=1; //第一位数码管显示6 } void djsxs7() { P0=table[7]; smg1=0; delayms(3); smg1=1; //第一位数码管显示7 } void djsxs8() { P0=table[8]; smg1=0; delayms(3); smg1=1; //第一位数码管显示8 } void main() { int djs1=10; Timer0_init(); //初始化定时器中断 led=0; //灯不亮 spk=1; //蜂鸣器不响 djs=10; //倒计时赋值 while(1) { LOOP1: djs=djs1; djsxs22(); if(key1==0) //在定时器运行状态下,key1==0 则说明1号选手按下按键 { delayms(3); if(key1==0) { while(!key1); //去除按键抖动后,重新在判断,是否确实按下 djs=60; while(1) { TR0=0; //定时器停止 djsxs(); if(key2==0) //复位按下按下 { delayms(8); //去除抖动 if(key2==0) //再次判断是否按下复位按键 { do { while(!key2); //如果按下复位键,则回到- --状态 delayms(5); } while(key2!=1); djs++; djs1=djs; } } if(key3==0) //复位按下按下 { delayms(8); //去除抖动 if(key3==0) //再次判断是否按下复位按键 { do { while(!key3); //如果按下复位键,则回到- --状态 delayms(5); } while(key3!=1); djs--; djs1=djs; } } if(key1==0) //复位按下按下 { delayms(3); //去除抖动 if(key1==0) //再次判断是否按下复位按键 { while(!key1); //如果按下复位键,则回到- --状态 goto LOOP1; //goto语句,回到loop1表号处 } } } } } if(keyks==0) { delayms(3); //去除按键抖动 if(keyks==0) { while(!keyks); //以上表示按下开始按键 TR0=1; //启动定时器 开始倒计时 while(1) { djsxs(); if(keytz==0) { delayms(3); //此处表示出去抖动, 以后不一一标出 if(keytz==0) { while(!keytz); //以上表示按下停止按键后 { TR0=0; //定时器停止 flag=0;// spk=1; } } } if(keyks==0) { delayms(3); if(keyks==0) { while(!keyks); //以上表示按下清楚按键后 TR0=1; //定时器启动 } } if((key1==0)&&(TR0==1)) //在定时器运行状态下,key1==0 则说明1号选手按下按键 { spk=0; //蜂鸣器响 led=1; //灯亮 delayms(3); if(key1==0) { while(!key1); //去除按键抖动后,重新在判断,是否确实按下 { spk=1; //蜂鸣器不响 led=0; flag=0;//清0最后五秒响蜂鸣器 } while(1) { TR0=0; //定时器停止 djsxs1(); //显示选手编号 djsxs30(); //第二位数码管显示- djsxs(); //显示剩余倒计时时间 delayms(3); djs=60; TR0=1; while(1) { djsxs1(); //显示选手编号 djsxs30(); //第二位数码管显示- djsxs(); if(djs==0) { TR0=0; if(keyqc==0) { delayms(3); //去除抖动 if(keyqc==0) { while(!keyqc); //如果按下清楚键,则回到- --状态 goto LOOP1; //goto语句,回到loop1表号处 } } } } } } } if((key2==0)&&(TR0==1)) { spk=0; led=1; //灯亮 delayms(3); if(key2==0) { while(!key2); { spk=1; flag=0;//清0最后五秒响蜂鸣器 led=0;//灯不亮 } while(1) { TR0=0; djsxs2(); djsxs30(); //第二位数码管显示- djsxs(); djs=60; TR0=1; while(1) { djsxs2(); //显示选手编号 djsxs30(); //第二位数码管显示- djsxs(); if(djs==0) { TR0=0; if(keyqc==0) { delayms(3); //去除抖动 if(keyqc==0) { while(!keyqc); //如果按下清楚键,则回到- --状态 goto LOOP1; //goto语句,回到loop1表号处 } } } } } } } if((key3==0)&&(TR0==1)) { led=1; //灯亮 spk=0; delayms(3); if(key3==0) { while(!key3); { spk=1; flag=0;//清0最后五秒响蜂鸣器 led=0; } while(1) { TR0=0; djsxs3(); djsxs30(); //第二位数码管显示- djsxs(); djs=60; TR0=1; while(1) { djsxs3(); //显示选手编号 djsxs30(); //第二位数码管显示- djsxs(); if(djs==0) { TR0=0; if(keyqc==0) { delayms(3); //去除抖动 if(keyqc==0) { while(!keyqc); //如果按下清楚键,则回到- --状态 goto LOOP1; //goto语句,回到loop1表号处 } } } } } } } if((key4==0)&&(TR0==1)) { led=1; //灯亮 spk=0; delayms(3); if(key4==0) { while(!key4); { spk=1; flag=0;//清0最后五秒响蜂鸣器 led=0; } while(1) { TR0=0; djsxs4(); djsxs30(); //第二位数码管显示- djsxs(); djs=60; TR0=1; while(1) { djsxs4(); //显示选手编号 djsxs30(); //第二位数码管显示- djsxs(); if(djs==0) { TR0=0; if(keyqc==0) { delayms(3); //去除抖动 if(keyqc==0) { while(!keyqc); //如果按下清楚键,则回到- --状态 goto LOOP1; //goto语句,回到loop1表号处 } } } } } } } if((key5==0)&&(TR0==1)) { led=1; //灯亮 spk=0; delayms(3); if(key5==0) { while(!key5); { spk=1; led=0; flag=0;//清0最后五秒响蜂鸣器 } while(1) { TR0=0; djsxs5(); djsxs30(); //第二位数码管显示- djsxs(); djs=60; TR0=1; while(1) { djsxs5(); //显示选手编号 djsxs30(); //第二位数码管显示- djsxs(); if(djs==0) { TR0=0; if(keyqc==0) { delayms(3); //去除抖动 if(keyqc==0) { while(!keyqc); //如果按下清楚键,则回到- --状态 goto LOOP1; //goto语句,回到loop1表号处 } } } } } } } if((key6==0)&&(TR0==1)) { led=1; //灯亮 spk=0; delayms(3); if(key6==0) { while(!key6); { spk=1; flag=0;//清0最后五秒响蜂鸣器 led=0; } while(1) { TR0=0; djsxs6(); djsxs30(); //第二位数码管显示- djsxs(); djs=60; TR0=1; while(1) { djsxs6(); //显示选手编号 djsxs30(); //第二位数码管显示- djsxs(); if(djs==0) { TR0=0; if(keyqc==0) { delayms(3); //去除抖动 if(keyqc==0) { while(!keyqc); //如果按下清楚键,则回到- --状态 goto LOOP1; //goto语句,回到loop1表号处 } } } } } } } if((key7==0)&&(TR0==1)) { led=1; //灯亮 spk=0; delayms(3); if(key7==0) { while(!key7); { spk=1; led=0; flag=0;//清0最后五秒响蜂鸣器 } while(1) { TR0=0; djsxs7(); djsxs30(); //第二位数码管显示- djsxs(); djs=60; TR0=1; while(1) { djsxs7(); //显示选手编号 djsxs30(); //第二位数码管显示- djsxs(); if(djs==0) { TR0=0; if(keyqc==0) { delayms(3); //去除抖动 if(keyqc==0) { while(!keyqc); //如果按下清楚键,则回到- --状态 goto LOOP1; //goto语句,回到loop1表号处 } } } } } } } if((key8==0)&&(TR0==1)) { led=1; //灯亮 spk=0; delayms(3); if(key8==0) { while(!key8); { spk=1; led=0; flag=0;//清0最后五秒响蜂鸣器 } while(1) { TR0=0; djsxs8(); djsxs30(); //第二位数码管显示- djsxs(); djs=60; TR0=1; while(1) { djsxs8(); //显示选手编号 djsxs30(); //第二位数码管显示- djsxs(); if(djs==0) { TR0=0; if(keyqc==0) { delayms(3); //去除抖动 if(keyqc==0) { while(!keyqc); //如果按下清楚键,则回到- --状态 goto LOOP1; //goto语句,回到loop1表号处 } } } } } } } if(djs if(keyqc==0) { delayms(3); if(keyqc==0) { while(!keyqc); spk=1; goto LOOP1; } } } } } } } } }
|
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |