找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3773|回复: 3
收起左侧

80c51单片机八路抢答器的编写程序!!!跪求~~~

[复制链接]
ID:260468 发表于 2017-12-12 08:26 | 显示全部楼层 |阅读模式
80c51单片机八路抢答器的编写程序!!!跪求~~~
回复

使用道具 举报

ID:447820 发表于 2018-12-17 14:05 | 显示全部楼层
(1)        抢答器同时供8名选手或8个代表队比赛,分别用8个按钮K1~K8;
(2)        设置一个系统清除和抢答控制开关K0,该开关由主持人控制。
(3)        抢答器具有锁存与显示功能。即选手按动开关,锁存相应的编号,并在优先抢答选手的编号一直保持到主持人将系统清除为止。
(4)        主持人按下抢答“开始”按钮,抢答开始。
(5)        当某一路抢答成功时,在数码管上显示成功信息和该路的号数。
(6)        当某一路抢答违规时,能在数码管上显示违规信息和该路的号数。
回复

使用道具 举报

ID:447820 发表于 2018-12-17 14:05 | 显示全部楼层
#include<reg51.h>
typedef unsigned char uchar;
typedef unsigned int uint;
sbit K0=P3^0;//        开始抢答按键
sbit beep=P3^7;//        蜂鸣器
sbit D0=P3^1;//        指示灯
sbit K1=P1^0;//1 号选手抢答按键
sbit K2=P1^1;//2 号选手抢答按键
sbit K3=P1^2;//3 号选手抢答按键
sbit K4=P1^3;//4 号选手抢答按键
sbit K5=P1^4;//5 号选手抢答按键
sbit K6=P1^5;//6 号选手抢答按键
sbit K7=P1^6;//7 号选手抢答按键
sbit K8=P1^7;//8 号选手抢答按键
sbit S1=P3^2;// 答 题 计 时 键
sbit S2=P3^3;//        开始抢答时间调整键
sbit S3=P3^4;//        答题计时时间调整键
char s;
uchar num=0;
char time1;//        抢答时间
char time2;//        答题限时时间
uint m,n;//T0,T1        定时器定一秒时
bit flag1,flag2,flag3,flag4;        // 标志位
bit aa,bb;//        时间调整标志位
// 延时子函数
void delay(uint z)
{
uint x,y; for(x=z;x>0;x--)
for(y=120;y>0;y--);
}

uchar code table1[]={
          // 共阴数码管段码值
       0x3f,0x06,0x5b,0x4f,
       0x66,0x6d,0x7d,0x07,
       0x7f,0x6f,0x77,0x7c,
           0x39,0x5e,0x79,0x71
           };
uchar code table2[]={
                                  // 共阴数码管位码值
                  0xfe,0xfd, 0xfb,0xf7
                                  };
// 初始化子函数
void init()
{
TMOD=0x11;
TH0=(65536-2000)/256;
TL0=(65536-2000)%256;
TH1=(65536-2000)/256;
TL1=(65536-2000)%256;
ET0=1;
ET1=1;
EA=1;
P0=0x00;
time1=10;
time2=10;
flag2=1;
}
// 开始键扫描子函数
void key1()
{
   uchar i=100;
   if(K0==0)
   {
     delay(10);
         if(K0==0)
     {
      while(K0==0&&i)
      {
       i--;
       delay(10);
      }
       TR0=1;
           s=time1;
           m=0;
       flag1=1;
           flag2=1;
           flag3=1;
           num=0;
           beep=1;
           D0=1;
       flag4=0;        // 清除违规标志位
       aa=0;
           bb=0;
          }
   }
}
// 选手抢答按键扫描子函数
void key()
{
  uchar i=100;
  if(K1==0)
  {
   delay(10);
   if(K1==0)
   {
    while(K1==0&&i)
    {
     i--;
     delay(10);
    }
    num=1;        // 数码管显示        1 号 "1"
TR0=0;        // 关闭定时器        0, 时间停止
    TR1=1;        // 打开定时器        1, 使扬声器响一声
    flag2=0;        // 关闭开始键标志位        , 使再按其他七个键不会响应
   }
  }
  if(K2==0)        // 下面七个键的处理同上
  {
    delay(10);
        if(K2==0)
        {
     while(K2==0&&i)
     {
      i--;
      delay(10);
     }
     num=2;
         TR0=0;
         TR1=1;
     flag2=0; // 重 要
    }
  }
   if(K3==0)
   {
    delay(10);
        if(K3==0)
    {
     while(K3==0&&i)
     {
      i--;
      delay(10);
     }
     num=3;
         TR0=0;
         TR1=1;
     flag2=0;
    }
   }
   if(K4==0)
   {
    delay(10);
        if(K4==0)
    {
     while(K4==0&&i)
     {
      i--;
      delay(10);
     }
         num=4;
         TR0=0;
         TR1=1;
     flag2=0;
    }
   }
   if(K5==0)
   {
    delay(10);
        if(K5==0)
    {
     while(K5==0&&i)
     {
      i--;
      delay(10);
     }
     num=5;
         TR0=0;
         TR1=1;
     flag2=0;
    }
   }
   if(K6==0)
   {
    delay(10);
        if(K6==0)
    {
     while(K6==0&&i)
     {
      i--;
      delay(10);
     }
     num=6;
         TR0=0;
         TR1=1;
     flag2=0;
    }
   }
   if(K7==0)
   {
    delay(10);
        if(K7==0)
    {
     while(K7==0&&i)
     {
      i--;
      delay(10);
     }
     num=7;
         TR0=0;
         TR1=1;
     flag2=0;
    }
   }
   if(K8==0)
   {
    delay(10);
        if(K8==0)
    {
     while(K8==0&&i)
     {
      i--;
      delay(10);
     }
     num=8;
         TR0=0;
         TR1=1;
     flag2=0;
    }
   }
}
// 数码管显示子函数
void display()
{
if(flag1==1)        // 开始键按下 , 开始计时抢答
{
if(num!=0)        // 如果有人抢答 , 则显示相应的几号
{
  P0=table1[num];        // 显示几号抢到了
  P2=table2[0]; delay(2); P0=0;
  P2=0xff;
}
else        // 否则没人抢答 , 则前面不显示几号
{
  P0=0x00;
  P2=0xff;
}
  P0=table1[s/10];        // 下面为显示抢答倒计时
  P2=table2[2];
  delay(2);
  P0=0;
  P2=0xff;
  P0=table1[s%10];
  P2=table2[3];
  delay(2);
  P2=0xff;
  P0=0x00;
}
else        // 如果开始键没有按下        , 则显示 F FF( 若有违规者 , 则显示违规号码及FF)或时间调整
{
  if(flag4==1)        // 违规显示
  {
   if(num!=0)
   {
    P0=table1[num];        // 显示几号违规了
    P2=table2[0];
        delay(2);
        P0=0x00;
    P2=0xff;
    P0=table1[15];        // 下面显示        FF, 表示违规了
    P2=table2[2];
        delay(2);
    P0=0x00;        // 消 隐
    P2=0xff;
        P0=table1[15];
        P2=table2[3];
        delay(2);
        P0=0x00;
    P2=0xff;
   }
   else
        {
         P0=0x00;
     P2=0xff;
        }
  }
  else        // 没有人违规才显示调整时间
  {
   if(aa==1)
   {
    P0=0x76;        // 第一位数码管显示  "5(S)"(        表示抢答时间调整 )
    P2=table2[0];
        delay(2);
        P0=0x00;
    P2=0xff;
    P0=table1[time1/10]; //        下面显示调整的抢答时间
    P2=table2[2];
        delay(2);
        P0=0x00;
    P2=0xff;
        P0=table1[time1%10];
        P2=table2[3];
        delay(2);
    P0=0x00;
    P2=0xff;
   }
   else if(bb==1)
   {
    P0=0x38;        // 第一位与第二位数码管合起来显示        "T",        表示答题时间调整
    P2=table2[0];
        delay(2);
        P0=0x00;
    P2=0xff;

    P0=table1[time2/10];
        P2=table2[2];
        delay(2);
    P0=0x00;
    P2=0xff;

    P0=table1[time2%10];
        P2=table2[3];
        delay(2);
    P0=0x00;
    P2=0xff;
   }
   else        // 否则显示 F FF
   {
    P0=table1[15];
        P2=table2[0];
        delay(2);
        P0=0x00;
    P0=table1[15];
        P2=table2[2];
        delay(2);
    P0=0x00;        // 消 隐
    P2=0xff;
        P0=table1[15];
        P2=table2[3];
        delay(2);
        P0=0x00;
    P2=0xff;
   }
  }
}
}
// 调整时间键扫描子函数
void key2()
{
  uchar i=100;
  if(S2==0)        // 抢答时间调整
  {
   delay(10);
   if(S2==0)
   {
    while(S2==0&&i)
    {
     i--;
     delay(10);
    }
    time1++;
        if(time1==61)
    {
     time1=10;
    }
    aa=1;        // 将抢答时间标志位置        1 bb=0;        // 同时关闭答题时间标志位
   }
  }
  if(S3==0)        // 答题时间调整
  {
   delay(10);
   if(S3==0)
   {
    while(S3==0&&i)
    {
     i--;
     delay(10);
    }   
    time2++;
        if(time2==61)
    {
     time2=10;
         }
     bb=1;
         aa=0;
   }
  }
}
// 主函数
void main()
{
  uchar i=100;
  init();//        调用初始化子函数
  while(1)
  {
   key1();//        调用开始键扫描子函数
   if((flag1==0)&(flag2==1))        // 当开始键没按下及没有人违规时才可进行时间调整
   {
    key2();
   }
   if((flag1==1)&(flag2==0))        // 当开始键按下及有人抢答才进行开始回答计时倒计时
   {
    if(S1==0)
    {
     delay(10); if(S1==0)
     {
      while(S1==0&&i)
      {
       i--;
       delay(10);
      }
      s=time2;
          TR0=1;
          m=0;
          TR1=1;
     }
    }
   }
   if((flag1==0)&(flag2==1))        // 违 规
   {
    key();
    if(num!=0)        //        开始键没有按下时        , 有人按下了抢答器        , 则置违规标志位
    {
     flag4=1;
     D0=0;
    }
   }
   if((flag1==1)&(flag2==1))        //        如果开始键按下且抢答键没有人按下        , 则进行八路抢答键扫描
   {
    key();
   }
   display();//        显示到数码管上
  }
}
// 定时器 0 中断子函数
void t0() interrupt 1
{
  TH0=(65536-2000)/256;        //2ms TL0=(65536-2000)%256;
  if(flag3)        // 开始(START)键按下 , 嘟一声 ( 长 1 秒), 表示开始抢答
  {
   beep=~beep;
  }
  else
      beep=1;
  if(s<5)        // 抢答时间快到报警  , 隔 1 秒响一声且红灯闪烁        , 响三声
  {
   if(s%2==0)
   {
    flag3=1;
    D0=0;
   }
   else
       {
            flag3=0;
            D0=1;
           }
  }
  m++;
  if(m==500)        //1        秒
  {
   m=0; s--;
   flag3=0;        // 关闭开始键按下响一秒的嘟声
   if(s==-1)
   {
    s=20;
    TR0=0;
    flag1=0;        // 显 示 F FF
    flag2=1;
        num=0;
        D0=1;
   }
  }
}
// 定时器 1 中断子函数
void t1() interrupt 3        // 定时器  1 处理有人按下抢答器嘟一声        ( 长 1 秒)
{
  TH1=(65536-2000)/256;
  TL1=(65536-2000)%256;
  beep=~beep;
  n++;
  if(n==500)
  {
   n=0;
   TR1=0;
  }
}
回复

使用道具 举报

ID:671357 发表于 2019-12-23 15:57 | 显示全部楼层
你这是完整的吗?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表