找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4802|回复: 12
收起左侧

八路抢答器

  [复制链接]
ID:86990 发表于 2015-7-27 16:39 | 显示全部楼层 |阅读模式
八路抢答器资料,下面是仿真图:
0.png

单片机源程序:
  1. /****************************************************************
  2. ******以单片机为核心,设计一个8位竞赛抢*******
  3. ******答器:同时供8名选手或8个代表队*************
  4. ******比赛,分别用8个按钮S0~S7表示。*************
  5. ******设置一个系统清除和抢答控制开关************
  6. ******S,开关由主持人控制。抢答器具有***********
  7. ******锁存与显示功能。即选手按按钮,************
  8. ******锁存相应的编号,并在优先抢答选************
  9. ******手的编号一直保持到主持人将系统************
  10. ******清除为止。
  11. ******抢答器具有定时抢答功能,且一次************
  12. ******抢答的时间由主持人设定(如30秒)**********
  13. ******。
  14. ******当主持人启动“开始”键后,定时************
  15. ******器进行减计时,同时扬声器发出短************
  16. ******暂的声响,声响持续的时间为0.5s左************
  17. ******右。
  18. ******参赛选手在设定的时间内进行抢答************
  19. ******,抢答有效,定时器停止工作,显************
  20. ******示器上显示选手的编号和抢答的时间*********
  21. ******,并保持到主持人将系统清除为止。*********
  22. ******如果定时时间已到,无人抢答,本次*********
  23. ******抢答无效,系统报警并禁止抢答,定*********
  24. ******时显示器上显示00。*********************************
  25. ******************************************************************/

  26. #include<reg52.h>

  27. #define uchar unsigned char
  28. #define uint unsigned int

  29. uchar code Tab0[]=                        //用于74HC595扫描的数组
  30. {
  31.         0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80
  32. };
  33. unsigned char code LED_DATE [] =                //共阳数码管的编码
  34. {
  35.         0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90
  36. };

  37. sbit Set_Rest        =P3^0;                        //主持人设置时间和复位按键
  38. sbit Start_Jia        =P3^1;                        //主持人开始和调整时间按键

  39. sbit S1                =P2^0;                        // 1号选手按键
  40. sbit S2                =P2^1;                        // 2号选手按键
  41. sbit S3                =P2^2;                        // 3号选手按键
  42. sbit S4                =P2^3;                        // 4号选手按键
  43. sbit S5                =P2^4;                        // 5号选手按键
  44. sbit S6                =P2^5;                        // 6号选手按键
  45. sbit S7                =P2^6;                        // 7号选手按键
  46. sbit S8                =P2^7;                        // 8号选手按键
  47. sbit BUZZ        =P3^2;


  48. sbit DS                =P1^5;                        //74HC595  I/O
  49. sbit SHCP        =P1^6;
  50. sbit STCP        =P1^7;

  51. uint Time_Alarm=500;                //抢答时间,默认定时500ms
  52. uchar Player=0;                                //选手号码
  53. bit K1_bit=0;                                        //K1标志位
  54. bit Start_bit=0;                                //开始标志位
  55. bit Set_bit=0;                                //设置标志位
  56. uchar Set0=0;                                //用于设置时间时显示闪烁控制
  57. bit Set1=0;                                //用于设置时间时显示闪烁控制

  58. void Delay_ms(uint xms);        //延时
  59. void HC595(uchar Value);                //74HC595驱动函数
  60. void Display();                                //显示函数
  61. void Init();
  62. void KEY1();
  63. void KEY2();                                        //开始/加时间键函数
  64. void Player_KEY();                        //选手抢答按键


  65. void main()
  66. {
  67.         Init();
  68.         while(1)
  69.                 {
  70.                         KEY1();
  71.                         KEY2();
  72.                         Player_KEY();
  73.                         Display();
  74.                 }
  75. }

  76. void Player_KEY()                        //选手抢答按键
  77. {
  78.         if(Start_bit==1)
  79.                 {
  80.                         if(S1==0)
  81.                                 {
  82.                                         Delay_ms(10);
  83.                                         if(S1==0)
  84.                                                 {
  85.                                                         Player=1;
  86.                                                         Start_bit=0;
  87.                                                         TR0=0;
  88.                                                         while(!S1);
  89.                                                 }
  90.                                 }

  91.                         if(S2==0)
  92.                                 {
  93.                                         Delay_ms(10);
  94.                                         if(S2==0)
  95.                                                 {
  96.                                                         Player=2;
  97.                                                         Start_bit=0;
  98.                                                         TR0=0;
  99.                                                         while(!S2);
  100.                                                 }
  101.                                 }

  102.                         if(S3==0)
  103.                                 {
  104.                                         Delay_ms(10);
  105.                                         if(S3==0)
  106.                                                 {
  107.                                                         Player=3;
  108.                                                         Start_bit=0;
  109.                                                         TR0=0;
  110.                                                         while(!S3);
  111.                                                 }
  112.                                 }

  113.                         if(S4==0)
  114.                                 {
  115.                                         Delay_ms(10);
  116.                                         if(S4==0)
  117.                                                 {
  118.                                                         Player=4;
  119.                                                         Start_bit=0;
  120.                                                         TR0=0;
  121.                                                         while(!S4);
  122.                                                 }
  123.                                 }

  124.                         if(S5==0)
  125.                                 {
  126.                                         Delay_ms(10);
  127.                                         if(S5==0)
  128.                                                 {
  129.                                                         Player=5;
  130.                                                         Start_bit=0;
  131.                                                         TR0=0;
  132.                                                         while(!S5);
  133.                                                 }
  134.                                 }

  135.                         if(S6==0)
  136.                                 {
  137.                                         Delay_ms(10);
  138.                                         if(S6==0)
  139.                                                 {
  140.                                                         Player=6;
  141.                                                         Start_bit=0;
  142.                                                         TR0=0;
  143.                                                         while(!S6);
  144.                                                 }
  145.                                 }

  146.                         if(S7==0)
  147.                                 {
  148.                                         Delay_ms(10);
  149.                                         if(S7==0)
  150.                                                 {
  151.                                                         Player=7;
  152.                                                         Start_bit=0;
  153.                                                         TR0=0;
  154.                                                         while(!S7);
  155.                                                 }
  156.                                 }

  157.                         if(S8==0)
  158.                                 {
  159.                                         Delay_ms(10);
  160.                                         if(S8==0)
  161.                                                 {
  162.                                                         Player=8;
  163.                                                         Start_bit=0;
  164.                                                         TR0=0;
  165.                                                         while(!S8);
  166.                                                 }
  167.                                 }

  168.                        
  169.                 }
  170. }

  171. void KEY2()                                        //开始/加时间键函数
  172. {
  173.         if(Start_Jia==0)
  174.                 {
  175.                         Delay_ms(10);
  176.                          if(Start_Jia==0)
  177.                                  {
  178.                                         if(Set_bit==0)
  179.                                                 {
  180.                                                         if(Time_Alarm==0)                //判断是否抢答结束
  181.                                                                 {
  182.                                                                         TR0=0;
  183.                                                                         Time_Alarm=0;
  184.                                                                 }
  185.                                                         else
  186.                                                                 {
  187.                                                                         TR0=~TR0;
  188.                                                                         Start_bit=~Start_bit;
  189.                                                                 }
  190.                                                 }
  191.                                         else
  192.                                                 {
  193.                                                         Time_Alarm=(Time_Alarm+250);
  194.                                                                 if(Time_Alarm>1500)
  195.                                                                         {
  196.                                                                                 Time_Alarm=500;
  197.                                                                         }
  198.                                                 }
  199.                                         while(!Start_Jia);
  200.                                  }
  201.                 }
  202. }


  203. void KEY1()
  204. {
  205.         if(Set_Rest==0)
  206.                 {
  207.                         Delay_ms(100);
  208.                         if(Set_Rest==0)
  209.                                 {
  210.                                         Delay_ms(500);                //判断长按还是短按
  211.                                         if(Set_Rest==0)
  212.                                                 {
  213.                                                         Time_Alarm=500;
  214.                                                         TR0=0;
  215.                                                         TR1=0;
  216.                                                         Set_bit=0;
  217.                                                         Player=0;
  218.                                                         Start_bit=0;
  219.                                                         BUZZ=1;
  220.                                                         while(!Set_Rest);
  221.                                                 }
  222.                                         else
  223.                                                 {
  224.                                                         if(Start_bit==0)        //判断是否开始
  225.                                                                 {
  226.                                                                         Set_bit=~Set_bit;
  227.                                                                         TR1=~TR1;
  228.                                                                 }
  229.                                                 }
  230.                                 }
  231.                 }
  232. }

  233. void Time_0() interrupt 1
  234. {
  235.         TH0=0xfc;                //定时器0定时1毫秒
  236.         TL0=0x18;
  237.         Time_Alarm--;
  238.         if(Time_Alarm<=0)
  239.                 {
  240.                         TR0=0;
  241.                         Start_bit=0;
  242.                         BUZZ=0;
  243.                 }
  244. }

  245. void Time_1() interrupt 3
  246. {
  247.         TH1=0x3c;                //定时器1定时50ms
  248.         TL1=0xb0;
  249.         Set0++;
  250.         if(Set0==10)
  251.                 {
  252.                         Set0=0;
  253.                         Set1=~Set1;
  254.                 }
  255. }



  256. void Display()                                //显示函数
  257. {
  258.         uchar i=0;
  259.         for(i=0;i<3;i++)        //选手编号数码管前三位显示0
  260.                 {
  261.                         P0=LED_DATE[0];                //送段数据
  262.                         HC595(Tab0[i]);                //送位数据
  263.                         Delay_ms(5);                //延时
  264.                         P0=0XFF;                                //消隐
  265.                 }
  266.         P0=LED_DATE[Player];                //数码管第4位显示选手编号,送段数据
  267.         HC595(Tab0[3]);                                //送位数据
  268.         Delay_ms(5);                                //延时
  269.         P0=0XFF;                                                //消隐

  270.         if(Set_bit==0)
  271.                 {
  272.                         P0=LED_DATE[Time_Alarm/1000];        //显示定时时间千位
  273.                         HC595(Tab0[4]);                                //送位数据
  274.                         Delay_ms(5);                                //延时
  275.                         P0=0XFF;                                                //消隐
  276.                         P0=LED_DATE[Time_Alarm%1000/100];        //显示定时时间百位
  277.                         HC595(Tab0[5]);                                //送位数据
  278.                         Delay_ms(5);                                //延时
  279.                         P0=0XFF;                                                //消隐
  280.                         P0=LED_DATE[Time_Alarm%100/10];        //显示定时时间十位
  281.                         HC595(Tab0[6]);                                //送位数据
  282.                         Delay_ms(5);                                //延时
  283.                         P0=0XFF;                                                //消隐
  284.                         P0=LED_DATE[Time_Alarm%10];        //显示定时时间个位
  285.                         HC595(Tab0[7]);                                //送位数据
  286.                         Delay_ms(5);                                //延时
  287.                         P0=0XFF;                                                //消隐
  288.                 }
  289.         if(Set_bit==1)
  290.                 {
  291.                         if(Set1==1)
  292.                                 {
  293.                                         P0=LED_DATE[Time_Alarm/1000];        //显示定时时间千位
  294.                                         HC595(Tab0[4]);                                //送位数据
  295.                                         Delay_ms(5);                                //延时
  296.                                         P0=0XFF;                                                //消隐
  297.                                         P0=LED_DATE[Time_Alarm%1000/100];        //显示定时时间百位
  298.                                         HC595(Tab0[5]);                                //送位数据
  299.                                         Delay_ms(5);                                //延时
  300.                                         P0=0XFF;                                                //消隐
  301.                                         P0=LED_DATE[Time_Alarm%100/10];        //显示定时时间十位
  302.                                         HC595(Tab0[6]);                                //送位数据
  303.                                         Delay_ms(5);                                //延时
  304.                                         P0=0XFF;                                                //消隐
  305.                                         P0=LED_DATE[Time_Alarm%10];        //显示定时时间个位
  306.                                         HC595(Tab0[7]);                                //送位数据
  307.                                         Delay_ms(5);                                //延时
  308.                                         P0=0XFF;                                                //消隐
  309.                                 }
  310.                         else
  311.                                 {
  312.                                         P0=0xff;        //显示定时时间千位
  313.                                        

  314. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

0.png

proteus仿真工程文件和单片机源码下载:
51智能8路抢答器.rar (97.65 KB, 下载次数: 164)

评分

参与人数 1黑币 +1 收起 理由
330021162 + 1 好东西就是不能下载,没那多黑比

查看全部评分

回复

使用道具 举报

ID:98493 发表于 2016-5-10 09:18 | 显示全部楼层
好东西  顶起来
回复

使用道具 举报

ID:124015 发表于 2016-5-30 15:20 | 显示全部楼层
是C语言的么
回复

使用道具 举报

ID:124015 发表于 2016-5-30 15:25 | 显示全部楼层
好东西,谢谢
回复

使用道具 举报

ID:124061 发表于 2016-5-30 18:54 | 显示全部楼层
最近在设计这个东西,谢谢分享
回复

使用道具 举报

ID:124061 发表于 2016-5-30 18:54 | 显示全部楼层
最近在设计这个,谢谢分享
回复

使用道具 举报

ID:107352 发表于 2016-6-20 11:16 | 显示全部楼层
不错!!!!!!!!!!!!!!!!!!!!
回复

使用道具 举报

ID:135559 发表于 2016-7-30 22:26 | 显示全部楼层
谢谢楼主,学习中
回复

使用道具 举报

ID:126449 发表于 2016-10-31 11:58 | 显示全部楼层
先下来看看再说吧

回复

使用道具 举报

ID:169871 发表于 2017-4-13 22:46 | 显示全部楼层
不错!!!!!!!!!!!!!!!!!!!!
回复

使用道具 举报

ID:201158 发表于 2017-5-22 17:02 | 显示全部楼层
怎么把时间设定改一下,这倒计时有点快,设置到不到30s- -
回复

使用道具 举报

ID:89286 发表于 2017-5-22 21:20 | 显示全部楼层
thanks for sharing
回复

使用道具 举报

ID:207742 发表于 2017-6-4 18:15 | 显示全部楼层
这个5黑笔真的有点那啥了
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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