找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 4180|回復(fù): 3
打印 上一主題 下一主題
收起左側(cè)

80c51單片機(jī)八路搶答器的編寫程序。!跪求~~~

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:260468 發(fā)表于 2017-12-12 08:26 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
80c51單片機(jī)八路搶答器的編寫程序!!跪求~~~
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:447820 發(fā)表于 2018-12-17 14:05 | 只看該作者
(1)        搶答器同時(shí)供8名選手或8個(gè)代表隊(duì)比賽,分別用8個(gè)按鈕K1~K8;
(2)        設(shè)置一個(gè)系統(tǒng)清除和搶答控制開關(guān)K0,該開關(guān)由主持人控制。
(3)        搶答器具有鎖存與顯示功能。即選手按動(dòng)開關(guān),鎖存相應(yīng)的編號(hào),并在優(yōu)先搶答選手的編號(hào)一直保持到主持人將系統(tǒng)清除為止。
(4)        主持人按下?lián)尨稹伴_始”按鈕,搶答開始。
(5)        當(dāng)某一路搶答成功時(shí),在數(shù)碼管上顯示成功信息和該路的號(hào)數(shù)。
(6)        當(dāng)某一路搶答違規(guī)時(shí),能在數(shù)碼管上顯示違規(guī)信息和該路的號(hào)數(shù)。
回復(fù)

使用道具 舉報(bào)

板凳
ID:447820 發(fā)表于 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 號(hào)選手搶答按鍵
sbit K2=P1^1;//2 號(hào)選手搶答按鍵
sbit K3=P1^2;//3 號(hào)選手搶答按鍵
sbit K4=P1^3;//4 號(hào)選手搶答按鍵
sbit K5=P1^4;//5 號(hào)選手搶答按鍵
sbit K6=P1^5;//6 號(hào)選手搶答按鍵
sbit K7=P1^6;//7 號(hào)選手搶答按鍵
sbit K8=P1^7;//8 號(hào)選手搶答按鍵
sbit S1=P3^2;// 答 題 計(jì) 時(shí) 鍵
sbit S2=P3^3;//        開始搶答時(shí)間調(diào)整鍵
sbit S3=P3^4;//        答題計(jì)時(shí)時(shí)間調(diào)整鍵
char s;
uchar num=0;
char time1;//        搶答時(shí)間
char time2;//        答題限時(shí)時(shí)間
uint m,n;//T0,T1        定時(shí)器定一秒時(shí)
bit flag1,flag2,flag3,flag4;        // 標(biāo)志位
bit aa,bb;//        時(shí)間調(diào)整標(biāo)志位
// 延時(shí)子函數(shù)
void delay(uint z)
{
uint x,y; for(x=z;x>0;x--)
for(y=120;y>0;y--);
}

uchar code table1[]={
          // 共陰數(shù)碼管段碼值
       0x3f,0x06,0x5b,0x4f,
       0x66,0x6d,0x7d,0x07,
       0x7f,0x6f,0x77,0x7c,
           0x39,0x5e,0x79,0x71
           };
uchar code table2[]={
                                  // 共陰數(shù)碼管位碼值
                  0xfe,0xfd, 0xfb,0xf7
                                  };
// 初始化子函數(shù)
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;
}
// 開始鍵掃描子函數(shù)
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;        // 清除違規(guī)標(biāo)志位
       aa=0;
           bb=0;
          }
   }
}
// 選手搶答按鍵掃描子函數(shù)
void key()
{
  uchar i=100;
  if(K1==0)
  {
   delay(10);
   if(K1==0)
   {
    while(K1==0&&i)
    {
     i--;
     delay(10);
    }
    num=1;        // 數(shù)碼管顯示        1 號(hào) "1"
TR0=0;        // 關(guān)閉定時(shí)器        0, 時(shí)間停止
    TR1=1;        // 打開定時(shí)器        1, 使揚(yáng)聲器響一聲
    flag2=0;        // 關(guān)閉開始鍵標(biāo)志位        , 使再按其他七個(gè)鍵不會(huì)響應(yīng)
   }
  }
  if(K2==0)        // 下面七個(gè)鍵的處理同上
  {
    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;
    }
   }
}
// 數(shù)碼管顯示子函數(shù)
void display()
{
if(flag1==1)        // 開始鍵按下 , 開始計(jì)時(shí)搶答
{
if(num!=0)        // 如果有人搶答 , 則顯示相應(yīng)的幾號(hào)
{
  P0=table1[num];        // 顯示幾號(hào)搶到了
  P2=table2[0]; delay(2); P0=0;
  P2=0xff;
}
else        // 否則沒人搶答 , 則前面不顯示幾號(hào)
{
  P0=0x00;
  P2=0xff;
}
  P0=table1[s/10];        // 下面為顯示搶答倒計(jì)時(shí)
  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( 若有違規(guī)者 , 則顯示違規(guī)號(hào)碼及FF)或時(shí)間調(diào)整
{
  if(flag4==1)        // 違規(guī)顯示
  {
   if(num!=0)
   {
    P0=table1[num];        // 顯示幾號(hào)違規(guī)了
    P2=table2[0];
        delay(2);
        P0=0x00;
    P2=0xff;
    P0=table1[15];        // 下面顯示        FF, 表示違規(guī)了
    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        // 沒有人違規(guī)才顯示調(diào)整時(shí)間
  {
   if(aa==1)
   {
    P0=0x76;        // 第一位數(shù)碼管顯示  "5(S)"(        表示搶答時(shí)間調(diào)整 )
    P2=table2[0];
        delay(2);
        P0=0x00;
    P2=0xff;
    P0=table1[time1/10]; //        下面顯示調(diào)整的搶答時(shí)間
    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;        // 第一位與第二位數(shù)碼管合起來顯示        "T",        表示答題時(shí)間調(diào)整
    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;
   }
  }
}
}
// 調(diào)整時(shí)間鍵掃描子函數(shù)
void key2()
{
  uchar i=100;
  if(S2==0)        // 搶答時(shí)間調(diào)整
  {
   delay(10);
   if(S2==0)
   {
    while(S2==0&&i)
    {
     i--;
     delay(10);
    }
    time1++;
        if(time1==61)
    {
     time1=10;
    }
    aa=1;        // 將搶答時(shí)間標(biāo)志位置        1 bb=0;        // 同時(shí)關(guān)閉答題時(shí)間標(biāo)志位
   }
  }
  if(S3==0)        // 答題時(shí)間調(diào)整
  {
   delay(10);
   if(S3==0)
   {
    while(S3==0&&i)
    {
     i--;
     delay(10);
    }   
    time2++;
        if(time2==61)
    {
     time2=10;
         }
     bb=1;
         aa=0;
   }
  }
}
// 主函數(shù)
void main()
{
  uchar i=100;
  init();//        調(diào)用初始化子函數(shù)
  while(1)
  {
   key1();//        調(diào)用開始鍵掃描子函數(shù)
   if((flag1==0)&(flag2==1))        // 當(dāng)開始鍵沒按下及沒有人違規(guī)時(shí)才可進(jìn)行時(shí)間調(diào)整
   {
    key2();
   }
   if((flag1==1)&(flag2==0))        // 當(dāng)開始鍵按下及有人搶答才進(jìn)行開始回答計(jì)時(shí)倒計(jì)時(shí)
   {
    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))        // 違 規(guī)
   {
    key();
    if(num!=0)        //        開始鍵沒有按下時(shí)        , 有人按下了搶答器        , 則置違規(guī)標(biāo)志位
    {
     flag4=1;
     D0=0;
    }
   }
   if((flag1==1)&(flag2==1))        //        如果開始鍵按下且搶答鍵沒有人按下        , 則進(jìn)行八路搶答鍵掃描
   {
    key();
   }
   display();//        顯示到數(shù)碼管上
  }
}
// 定時(shí)器 0 中斷子函數(shù)
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)        // 搶答時(shí)間快到報(bào)警  , 隔 1 秒響一聲且紅燈閃爍        , 響三聲
  {
   if(s%2==0)
   {
    flag3=1;
    D0=0;
   }
   else
       {
            flag3=0;
            D0=1;
           }
  }
  m++;
  if(m==500)        //1        秒
  {
   m=0; s--;
   flag3=0;        // 關(guān)閉開始鍵按下響一秒的嘟聲
   if(s==-1)
   {
    s=20;
    TR0=0;
    flag1=0;        // 顯 示 F FF
    flag2=1;
        num=0;
        D0=1;
   }
  }
}
// 定時(shí)器 1 中斷子函數(shù)
void t1() interrupt 3        // 定時(shí)器  1 處理有人按下?lián)尨鹌鬣揭宦?nbsp;       ( 長 1 秒)
{
  TH1=(65536-2000)/256;
  TL1=(65536-2000)%256;
  beep=~beep;
  n++;
  if(n==500)
  {
   n=0;
   TR1=0;
  }
}
回復(fù)

使用道具 舉報(bào)

地板
ID:671357 發(fā)表于 2019-12-23 15:57 | 只看該作者
你這是完整的嗎?
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表