找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6378|回复: 9
收起左侧

自己做的单片机8路抢答器,里面有电路仿真图,c程序等

  [复制链接]
ID:352039 发表于 2018-6-14 18:25 | 显示全部楼层 |阅读模式
这是我画了好几天做的抢答器,里面有电路仿真图,c程序等,希望能够帮助到大家。
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)

电路图

电路图

一部分程序

一部分程序


单片机源程序如下:
  1.                                    //总源程序
  2. #include<reg51.h>
  3. typedef unsigned char uchar;
  4. typedef unsigned int  uint;
  5. sbit K0=P3^0;                  //开始抢答按键
  6. sbit beep=P3^7;                //蜂鸣器
  7. sbit D0=P3^1;                  //指示灯
  8. sbit K1=P1^0;                  //1号选手抢答按键
  9. sbit K2=P1^1;                  //2号选手抢答按键
  10. sbit K3=P1^2;                  //3号选手抢答按键
  11. sbit K4=P1^3;                  //4号选手抢答按键
  12. sbit K5=P1^4;                  //5号选手抢答按键
  13. sbit K6=P1^5;                  //6号选手抢答按键
  14. sbit K7=P1^6;                  //7号选手抢答按键
  15. sbit K8=P1^7;                  //8号选手抢答按键
  16. sbit S1=P3^2;                  //答题计时键
  17. sbit S2=P3^3;                  //开始抢答时间调整键
  18. sbit S3=P3^4;                  //答题计时时间调整键
  19. char s;
  20. uchar num=0;
  21. char  time1;                                           //抢答时间
  22. char  time2;                                           //答题限时时间
  23. uint  m,n;                                             //T0,T1定时器定一秒时
  24. bit   flag1,flag2,flag3,flag4;                         //标志位
  25. bit   aa,bb;                                           //时间调整标志位

  26.                          //延时子函数
  27. void delay(uint z)
  28. {uint x,y;
  29.    for(x=z;x>0;x--)
  30.   for(y=120;y>0;y--); }
  31. uchar code table1[]={
  32.                                     //共阴数码管段码值
  33.                                       0x3f,0x06,0x5b,0x4f,
  34.                                       0x66,0x6d,0x7d,0x07,
  35.                                       0x7f,0x6f,0x77,0x7c,
  36.                                       0x39,0x5e,0x79,0x71 };
  37. uchar code table2[]={
  38.                                    //共阴数码管位码值
  39.                                               0xfe,0xfd,
  40.                                               0xfb,0xf7 };

  41.                         //初始化子函数
  42. void init()
  43. {TMOD=0x11;
  44.     TH0=(65536-2000)/256;
  45.     TL0=(65536-2000)%256;
  46.     TH1=(65536-2000)/256;
  47.     TL1=(65536-2000)%256;
  48.     ET0=1;
  49.     ET1=1;
  50.     EA=1;
  51.     P0=0x00;
  52.     time1=10;
  53.     time2=10;
  54.     flag2=1; }

  55.                           //开始键扫描子函数
  56.   void key1()
  57.   {uchar i=100;
  58.     if(K0==0)
  59.    {delay(10);
  60.        if(K0==0)
  61.      {    while(K0==0&&i)
  62.                {i--;
  63.                   delay(10);}
  64.            TR0=1;
  65.            s=time1;
  66.            m=0;
  67.            flag1=1;
  68.            flag2=1;
  69.            flag3=1;
  70.            num=0;
  71.            beep=1;
  72.            D0=1;
  73.            flag4=0;                              //清除违规标志位
  74.            aa=0;
  75.            bb=0;
  76.                   }
  77.           }
  78.      }
  79.          
  80.                            //选手抢答按键扫描子函数
  81. void key()
  82. {uchar i=100;
  83.          if(K1==0)
  84.             {delay(10);
  85.               if(K1==0)
  86.               {while(K1==0&&i)
  87.                 {i--;
  88.                   delay(10);}
  89.                   num=1;                                    //数码管显示1号"1"
  90.                   TR0=0;                                    //关闭定时器0,时间停止
  91.                   TR1=1;                                    //打开定时器1,使扬声器响一声
  92.                   flag2=0;                                  //关闭开始键标志位,使再按其他七个键不会响应
  93.                }
  94.             }
  95.       if(K2==0)                                              //下面七个键的处理同上
  96.         {
  97.            delay(10);
  98.            if(K2==0)
  99.             {while(K2==0&&i)
  100.               {i--;
  101.                delay(10);}
  102.              num=2;
  103.              TR0=0;
  104.              TR1=1;
  105.              flag2=0;                    //重要
  106.             }
  107.          }
  108.    if(K3==0)
  109.        {delay(10);
  110.          if(K3==0)
  111.          {while(K3==0&&i)
  112.             {i--;
  113.               delay(10);}
  114.           num=3;
  115.           TR0=0;
  116.           TR1=1;
  117.           flag2=0;
  118.          }
  119.        }
  120.    if(K4==0)
  121.     {delay(10);
  122.        if(K4==0)
  123.          {while(K4==0&&i)
  124.              {i--;
  125.                delay(10);}
  126.            num=4;
  127.            TR0=0;
  128.            TR1=1;
  129.            flag2=0;
  130.          }
  131.       }
  132.    if(K5==0)
  133.     {delay(10);
  134.       if(K5==0)
  135.          {while(K5==0&&i)
  136.             {i--;
  137.                delay(10);}
  138.            num=5;
  139.            TR0=0;
  140.            TR1=1;
  141.            flag2=0;
  142.           }
  143.         }
  144.   if(K6==0)
  145.   {delay(10);
  146.    if(K6==0)
  147.      {while(K6==0&&i)
  148.            {i--;
  149.              delay(10);}
  150.           num=6;
  151.           TR0=0;
  152.           TR1=1;
  153.           flag2=0;
  154.          }
  155.    }
  156. if(K7==0)
  157.     {delay(10);
  158.            if(K7==0)
  159.               {while(K7==0&&i)
  160.                       {i--;
  161.                              delay(10);}
  162.                      num=7;
  163.                          TR0=0;
  164.                          TR1=1;
  165.                          flag2=0;
  166.                    }
  167.          }
  168.   if(K8==0)
  169.       {delay(10);
  170.              if(K8==0)
  171.                     {while(K8==0&&i)
  172.                              {i--;
  173.                                     delay(10);}
  174.                           num=8;
  175.                           TR0=0;
  176.                           TR1=1;
  177.                           flag2=0;
  178.                         }
  179.             }
  180.     }
  181.         
  182.                             //数码管显示子函数
  183. void display()
  184.    {if(flag1==1)                                            //开始键按下,开始计时抢答
  185.       {if(num!=0)                                           //如果有人抢答,则显示相应的几号
  186.              {P0=table1[num];                                   //显示几号抢到了
  187.                   P2=table2[0];
  188.                    delay(2);
  189.                    P0=0;
  190.                    P2=0xff;
  191.                    }
  192.                  else                                                  //否则没人抢答,则前面不显示几号
  193.                  {P0=0x00;
  194.                    P2=0xff;}
  195.                   P0=table1[s/10];                                     //下面为显示抢答倒计时
  196.                   P2=table2[2];
  197.                   delay(2);
  198.                   P0=0;
  199.                   P2=0xff;
  200.                   P0=table1[s%10];
  201.                   P2=table2[3];
  202.                   delay(2);
  203.                   P2=0xff;
  204.                   P0=0x00;
  205.                   }
  206.                   else                                                  //如果开始键没有按下,则显示F FF(若有违规者,则显示违规号码及 FF)或时间调整
  207.                   {if(flag4==1)                                         //违规显示
  208.                      {if(num!=0)
  209.                             {P0=table1[num];                                //显示几号违规了
  210.                                   P2=table2[0];
  211.                                   delay(2);
  212.                                   P0=0x00;
  213.                                   P2=0xff;
  214.                                   P0=table1[15];                                   //下面显示 FF,表示违规了
  215.                                   P2=table2[2];
  216.                                   delay(2);
  217.                                   P0=0x00;                                            //消隐
  218.                                   P2=0xff;
  219.                                   P0=table1[15];
  220.                                   P2=table2[3];
  221.                                   delay(2);
  222.                                   P0=0x00;
  223.                                   P2=0xff;
  224.                                   }
  225.                                   else
  226.                                   {
  227.                                   P0=0x00;
  228.                                   P2=0xff;}
  229.                                   }
  230.                                   else                                                 //没有人违规才显示调整时间
  231.                                   {if(aa==1)
  232.                                      {
  233.                                             P0=0x76;                                           //第一位数码管显示"5(S)"(表示抢答时间调整)
  234.                                                 P2=table2[0];
  235.                                                 delay(2);
  236.                                                 P0=0x00;
  237.                                                 P2=0xff;
  238.                                                 P0=table1[time1/10];                               //下面显示调整的抢答时间
  239.                                         P2=table2[2];
  240.                                                 delay(2);
  241.                                                 P0=0x00;
  242.                                                 P2=0xff;
  243.                                                 P0=table1[time1%10];
  244.                                                 P2=table2[3];
  245.                                                 delay(2);
  246.                                                 P0=0x00;
  247.                                                 P2=0xff;
  248.                                                 }
  249.                                                 else if(bb==1)
  250.                                                 {P0=0x38;                               //第一位与第二位数码管合起来显示"T",表示答题 时间调整
  251.                                                   P2=table2[0];
  252.                                                   delay(2);
  253.                                                   P0=0x00;
  254.                                                   P2=0xff;
  255.                                                   P0=table1[time2/10];
  256.                                                   P2=table2[2];
  257.                                                   delay(2);
  258.                                                   P0=0x00;
  259.                                                   P2=0xff;
  260.                                                   P0=table1[time2%10];
  261.                                                   P2=table2[3];
  262.                                                   delay(2);
  263.                                                   P0=0x00;
  264.                                                   P2=0xff;
  265.                                                  }
  266.                                                  else                                  //否则显示F FF
  267.                                                  {P0=table1[15];
  268.                                                    P2=table2[0];
  269.                                                    delay(2);
  270.                                                    P0=0x00;
  271.                                                    P0=table1[15];
  272.                                                    P2=table2[2];
  273.                                                    delay(2);
  274.                                                    P0=0x00;                             //消隐
  275.                                                    P2=0xff;
  276.                                                    P0=table1[15];
  277.                                                    P2=table2[3];
  278.                                                    delay(2);
  279.                                                    P0=0x00;
  280.                                                    P2=0xff;
  281.                                                    }
  282.                                                  }
  283.                                     }
  284.                                 }

  285.                                                   //调整时间键扫描子函数
  286. void key2()
  287. {uchar i=100;
  288.   if(S2==0)                                                      //抢答时间调整
  289.      {delay(10);
  290.            if(S2==0)
  291.              {while(S2==0&&i)
  292.                     {i--;
  293.                           delay(10);}
  294.                 time1++;
  295.                 if(time1==61)
  296.                 {time1=10;}
  297.                 aa=1;                                                    //将抢答时间标志位置1
  298.                 bb=0;                                                    //同时关闭答题时间标志位
  299.                 }
  300.         }
  301.   if(S3==0)                                                      //答题时间调整
  302.       {delay(10);
  303.              if(S3==0)
  304.                    {while(S3==0&&i)
  305.                       {i--;
  306.                             delay(10);}
  307.                                 time2++;
  308.                                 if(time2==61)
  309.                                   {time2=10;}
  310.                                   bb=1;
  311.                                   aa=0;
  312.                         }
  313.                 }
  314.   }
  315.             
  316.                                                    //主函数
  317. void main()
  318. {uchar i=100;
  319.   init();                                                           //调用初始化子函数
  320.    while(1)
  321.     {key1();                                                        //调用开始键扫描子函数
  322.           if((flag1==0)&(flag2==1))                                     //当开始键没按下及没有人违规时才可进行时间调整
  323.              {key2();}
  324.           if((flag1==1)&(flag2==0))                                     //当开始键按下及有人抢答才进行开始回答计时倒 计时
  325.              {if(S1==0)
  326.                     {delay(10);
  327.                            if(S1==0)
  328.                              {while(S1==0&&i)
  329.                                     {i--;
  330.                                           delay(10);}
  331.                                    s=time2;
  332.                                    TR0=1;
  333.                                    m=0;
  334.                                    TR1=1;
  335.                                    }
  336.                           }
  337.                   }
  338.           if((flag1==0)&(flag2==1))                                           //违规
  339.              {key();
  340.                     if(num!=0)                                                    //开始键没有按下时,有人按下了抢答器,则置违规标志位
  341.                           {flag4=1;
  342.                              D0=0;
  343.                             }
  344.                    }
  345.           if((flag1==1)&(flag2==1))                                           //如果开始键按下且抢答键没有人按下,则进行八路 抢答键扫描
  346.               {key();}
  347.                   display();                                                      //显示到数码管上
  348.                 }
  349.          }
  350.          
  351.                                    //定时器0中断子函数
  352. void t0() interrupt 1
  353. {TH0=(65536-2000)/256;//2ms
  354.   TL0=(65536-2000)%256;
  355.   if(flag3)                                                                 //开始(START)键按下,嘟一声(长1秒),表示开始抢答
  356.   {
  357.     beep=~beep;
  358.         }
  359.         else
  360.          beep=1;
  361.         if(s<5)                                                                  //抢答时间快到报警,隔1秒响一声且红灯闪烁,响三声
  362.         {if(s%2==0)
  363.            {flag3=1;
  364.              D0=0;}
  365.           else
  366.            {flag3=0;
  367.               D0=1;}
  368.           }
  369.           m++;
  370.           if(m==500)//1秒
  371.             {m=0;
  372.                   s--;
  373.                   flag3=0;                                                            //关闭开始键按下响一秒的嘟声
  374.                   if(s==-1)
  375.                     {s=20;
  376.                           TR0=0;
  377.                           flag1=0;                                                        //显示F FF
  378.                           flag2=1;
  379.                           num=0;
  380.                           D0=1;}
  381.                   }
  382.   }
  383.   
  384.                                   //定时器1中断子函数
  385. void t1() interrupt 3                                                           //定时器1处理有人按下抢答器嘟一声(长1秒)
  386.    {TH1=(65536-2000)/256;
  387.      TL1=(65536-2000)%256;
  388.          beep=~beep;
  389.          n++;
  390.          if(n==500)
  391.             {n=0;TR1=0;}
  392.     }
复制代码

所有资料51hei提供下载:
Keil.zip (30.04 KB, 下载次数: 132)

评分

参与人数 2黑币 +10 收起 理由
lzDestiny + 5 赞一个!
Eason张 + 5 赞一个!

查看全部评分

回复

使用道具 举报

ID:89286 发表于 2018-11-7 21:30 | 显示全部楼层
thanks for sharing
回复

使用道具 举报

ID:426961 发表于 2018-11-15 12:39 | 显示全部楼层
厉害了,大佬的头奥
回复

使用道具 举报

ID:404878 发表于 2018-12-20 17:39 | 显示全部楼层
想问一下,那个里面有仿真
回复

使用道具 举报

ID:452999 发表于 2018-12-23 23:58 | 显示全部楼层
你好,在吗。我把程序拷到仿真芯片里。只有倒计时,抢答和抢答时间都没有用,请问一下怎么改呀
回复

使用道具 举报

ID:562914 发表于 2019-6-15 06:52 | 显示全部楼层
只有倒计时,抢答和抢答时间都没有用
回复

使用道具 举报

ID:569737 发表于 2019-6-22 21:53 | 显示全部楼层
hhz199701 发表于 2018-12-23 23:58
你好,在吗。我把程序拷到仿真芯片里。只有倒计时,抢答和抢答时间都没有用,请问一下怎么改呀

引脚吧,改那个定义
回复

使用道具 举报

ID:335259 发表于 2019-10-19 17:12 | 显示全部楼层
有人实验过没,为啥我实验的时候用不了
回复

使用道具 举报

ID:658757 发表于 2019-12-12 10:55 | 显示全部楼层
我也是,实验用不了
回复

使用道具 举报

ID:796901 发表于 2020-7-4 01:47 | 显示全部楼层
好像楼主的程序可以实现以下功能吧
1、        基本要求:有一个主持人控制开关和6路抢答按扭,当主持人允许抢答时才能进行抢答操作,并用一个数码管显示抢答选手的号码,同时其他选手不能再抢答。
2、        当主持人允许抢答后倒计时5秒时间,在这5秒内抢答有效,过后就不能进行抢答了。
3、        电路上要加个蜂鸣器的电路,当有选手抢答时蜂鸣器响一下。
4、        当有选手抢答后,进行倒计时20秒作为选手回答问题时间,用两个数码管显示,倒计时时间到时有声光提示。
5、        扩展功能(选做),
用按键可设置倒计时的时间,范围在5秒到30秒之间。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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