找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3375|回复: 2
收起左侧

十四路抢答器单片机代码与AD画的原理图

[复制链接]
ID:208953 发表于 2017-6-7 20:39 | 显示全部楼层 |阅读模式
十四路抢答器原理图 Altium Designer画的(51hei附件中可下载工程文件):
0.png 0.png

单片机抢答器代码如下:
  1. #include<reg51.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int

  4. sbit start=P3^0;          //主持人按键开始
  5. sbit reset=P3^1;        //复位


  6. //sbit m1=P3^1;   //主持人按键答对加分,按一下加一分
  7. //sbit m2=P3^2;   //答错减分

  8. sbit add1=P3^2;           //抢答时间调整,加1
  9. sbit dec1=P3^7;           //抢答时间调整,减1
  10. sbit add2=P3^4;                   //答题时间调整,加1
  11. sbit dec2=P3^5;                //答题时间调整,减1

  12. sbit k1=P1^0;
  13. sbit k2=P1^1;
  14. sbit k3=P1^2;
  15. sbit k4=P1^3;
  16. sbit k5=P1^4;
  17. sbit k6=P1^5;      
  18. sbit k7=P1^6;
  19. sbit k8=P1^7;  //选手按键

  20. sbit beep=P3^6;   //蜂鸣器

  21. bit  qd;                        //抢答标志位,=1时开启抢答
  22. bit  dt;                        //答题标志位,=1时开启答题
  23. //时间计算
  24. #define Imax 14000    //此处为晶振为11.0592时的取值,
  25. #define Imin 8000    //如用其它频率的晶振时,
  26. #define Inum1 1450    //要改变相应的取值。
  27. #define Inum2 700
  28. #define Inum3 3000
  29. //解码变量
  30. unsigned char Im[4]={0x00,0x00,0x00,0x00};

  31. //全局变量
  32. uchar f;
  33. unsigned long m,Tc;
  34. unsigned char IrOK;                                       

  35. //uchar code tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77};  //0-9代码        abcdefg dp
  36. unsigned char code tab[]={0x5F,0x44,0x9D,0xD5,0xC6,0xD3,0xDB,0x45,0xDF,0xD7,0xCE,0xC7,0xDC}; //数字0-9的编码   G C DP D E B F A
  37. uchar shiwei,gewei,xuanshou,count,p,second;
  38. uchar qd_time=30,dt_time=60;                                                //抢答时间,默认30S,答题时间,默认60S
  39. uint t,n,a,a1,a2,a3,a4,a5,a6,a7,a8;

  40. void Timer()
  41. {
  42.         TMOD=0x11;
  43.         TH1=0x3C;  //初值50ms
  44.         TL1=0xB0;
  45.         EA=1;           //打开中断总开关
  46.         ET1=1;           //打开中断允许开关
  47.         TR1=0;            //打开定时开关
  48.         IT1=1;//下降沿有效
  49.         EX1=1;//外部中断1开
  50.         TH0=0;//T0赋初值
  51.         TL0=0;
  52.         TR0=0;//t0暂时不计时,等到有红外信号时开启计时         
  53. }
  54. void delay(uint z)  //延时函数
  55. {
  56.         uint x,y;
  57.         for(x=z;x>0;x--)
  58.                 for(y=110;y>0;y--);                        //约1ms
  59. }

  60. void display (void) //显示函数
  61. {
  62.         unsigned char shiwei,gewei,xuanshou;//定义数据变量,用于显示时间和选手号码
  63.         shiwei=tab[second/10];                                 //秒取十位数
  64.         gewei=tab[second%10];                                //取个位数
  65.         xuanshou=tab[p];                                        //选手号

  66.         P0=gewei;                //个位数据显示
  67.         P2=0x7F;                //打开位选
  68.         delay(5);                //延时一会
  69.         P2=0xFF;                //关闭显示

  70.         P0=shiwei;                //显示十位
  71.         P2=0xBF;                   //打开显示时间十位的位选
  72.         delay(5);                //延时一会
  73.         P2=0xFF;                //关闭显示

  74.         P0=0x80;                //显示横线
  75.         P2=0xDF;                  
  76.         delay(5);
  77.         P2=0xFF;
  78.         
  79.         P0=xuanshou;
  80.         P2=0xEF;            //选手位选
  81.         delay(5);
  82.         P2=0xFF;
  83. }


  84. void keyscan(void)         //按键函数
  85. {
  86.         if(add1==0)                 //抢答加按键按下
  87.         {
  88.                 display();         //显示函数当做去抖用,防止按键按下时黑屏
  89.                 if(add1==0)         //再次判断抢答加按键是否按下(其他按键功能类似)
  90.                 {
  91.                         p=11;         //P=11,显示q
  92.                         qd_time++;           //抢答时间加
  93.                         if(qd_time>=99)        //最大加到99
  94.                                 qd_time=99;
  95.                 }
  96.                 second=qd_time;                 //将抢答时间赋值给计时变量
  97.                 do
  98.                         display();                 //扫描显示
  99.                 while(add1==0);
  100.         }

  101.         if(dec1==0)                                //抢答时间减按键
  102.         {
  103.                 display();
  104.                 if(dec1==0)
  105.                 {
  106.                         p=11;                         //显示q
  107.                         qd_time--;                 //时间减
  108.                         if(qd_time<=1)         //最小减到1
  109.                                 qd_time=1;
  110.                 }
  111.                 second=qd_time;
  112.                 do
  113.                         display();
  114.                 while(dec1==0);
  115.         }
  116.         if(add2==0)
  117.         {
  118.                 display();
  119.                 if(add2==0)
  120.                 {
  121.                         p=12;
  122.                         dt_time++;
  123.                         if(dt_time>=99)
  124.                                 dt_time=99;
  125.                 }
  126.                 second=dt_time;
  127.                 do
  128.                         display();
  129.                 while(add2==0);
  130.         }

  131.         if(dec2==0)
  132.         {
  133.                 display();
  134.                 if(dec2==0)
  135.                 {
  136.                         p=12;
  137.                         dt_time--;
  138.                         if(dt_time<=1)
  139.                                 dt_time=1;
  140.                 }
  141.                 second=dt_time;
  142.                 do
  143.                         display();
  144.                 while(dec2==0);
  145.         }
  146. }

  147. void init()                                                   //初始化函数
  148. {   
  149.         P2=0x04;
  150.         P0=0x3f;
  151.         t=0;
  152.         beep=1;
  153.         p=10;                                                        //选手号初始为显示H,表示等待
  154.         second=qd_time;
  155. }

  156. void main()
  157. {
  158.         uchar i;
  159.     init();                                                        //调用初始化函数
  160.         Timer();                                                //定时器设置
  161.         while(1)
  162.         {
  163.                 if((qd==0)&&(dt==0))                //在非抢答,非答题状态下
  164.                         keyscan();                                //按键扫描函数
  165.                 display();                                        //显示函数

  166.                 if(start==0)                                  //主持人按下开始键
  167.                 {
  168.                         if((qd==0)&&(dt==0))        //在非抢答,非答题状态下
  169.                         {
  170.                                 p=10;                                //数码管显示H
  171.                                 second=qd_time;                //抢答时间赋值计时变量
  172.                                 qd=1;                                //进入抢答模式
  173.                         }
  174.                         beep=0;                                        //蜂鸣器长响一声
  175.                         for(i=0;i<20;i++)                //此处用做延时
  176.                         {
  177.                                 display();
  178.                         }
  179.                         beep=1;                                        //关闭蜂鸣器
  180.                         TR1=~TR1;                                //定时器取反,可以开始,可以随时暂停

  181.                         do
  182.                                 display();                        //显示函数
  183.                         while(!start);                        //等待释放按键        
  184.                 }

  185.                 if(reset==0)                           //复位键按下
  186.                 {
  187.                         display();
  188.                         if(reset==0)
  189.                         {
  190.                                 second=qd_time;           //将抢答时间赋值给计时变量
  191.                                 t=0;                           //清零
  192.                                 p=10;                           //显示H
  193.                                 TR1=0;                           //停止计时
  194.                                 beep=1;                           //蜂鸣器停止
  195.                                 qd=0;                           //抢答清零
  196.                                 dt=0;                           //答题清零
  197.                         }
  198.                         do
  199.                                 display();                   //显示函数
  200.                         while(!reset);                   //按键释放
  201.                 }
  202.                 if(qd==1)                                   //如果是抢答模式时
  203.                 {
  204.                         {
  205.                                  if(k1==0)                    //一号选手按下按键
  206.                                 {
  207.                                         display();           
  208.                                         if(k1==0)           
  209.                                         display();
  210.                                         t=1;                   //选手号置1
  211.                                         qd=0;                   //关闭抢答模式
  212.                                         dt=1;                   //准备打开答题模式(其他选手注释相同)
  213.                                 }

  214.                                 else if(k2==0)
  215.                                 {
  216.                                         display();
  217.                                         if(k2==0)
  218.                                         display();
  219.                                         t=2;
  220.                                         qd=0;
  221.                                         dt=1;
  222.                                 }
  223.                                 else if(k3==0)
  224.                                 {
  225.                                         display();
  226.                                         if(k3==0)
  227.                                         display();
  228.                                         t=3;
  229.                                         qd=0;
  230.                                         dt=1;
  231.                                 }
  232.                                 else if(k4==0)
  233.                                 {
  234.                                         display();
  235.                                         if(k4==0)
  236.                                         display();
  237.                                         t=4;
  238.                                         qd=0;
  239.                                         dt=1;
  240.                                 }
  241.                                 else if(k5==0)
  242.                                 {
  243.                                         display();
  244.                                         if(k5==0)
  245.                                         display();
  246.                                         t=5;
  247.                                         qd=0;
  248.                                         dt=1;
  249.                                 }
  250.                                 else if(k6==0)
  251.                                 {
  252.                                         display();
  253.                                         if(k6==0)
  254.                                         display();
  255.                                         t=6;
  256.                                         qd=0;
  257.                                         dt=1;
  258.                                 }
  259.                                 else if(k7==0)
  260.                                 {
  261.                                         display();
  262.                                         if(k7==0)
  263.                                         display();
  264.                                         t=7;
  265.                                         qd=0;
  266.                                         dt=1;
  267.                                 }
  268.                                 else if(k8==0)
  269.                                 {
  270.                                         display();
  271.                                         if(k8==0)
  272.                                         display();
  273.                                         t=8;
  274.                                         qd=0;
  275.                                         dt=1;
  276.                                 }
  277.                         if(IrOK==1)   //有红外信号时
  278.                         {
  279.                                 //1键
  280.                                 if(Im[2]==0x0c)                //是1号按下
  281.                                 {
  282.                                    display();
  283.                                         t=1;                        //选手号置1
  284.                                         qd=0;                        //关闭抢答模式
  285.                                         dt=1;                        //准备打开答题模式(其他选手注释相同)
  286.                                 }
  287.                                 //2键
  288.                                 else if(Im[2]==0x18)
  289.                                 {
  290.                                            display();
  291.                                         t=2;
  292.                                         qd=0;
  293.                                         dt=1;
  294.                                 }
  295.                                 //3键
  296.                                 else if(Im[2]==0x5e)
  297.                                 {
  298.                                    display();
  299.                                         t=3;
  300.                                         qd=0;
  301.                                         dt=1;
  302.                                 }
  303.                                 //4键
  304.                                 else if(Im[2]==0x08)
  305.                                 {
  306.                                    display();
  307.                                         t=4;
  308.                                         qd=0;
  309.                                         dt=1;
  310.                                 }
  311.                                 //5键
  312.                                 else if(Im[2]==0x1c)
  313.                                 {
  314.                                    display();
  315.                                         t=5;
  316.                                         qd=0;
  317.                                         dt=1;
  318.                                 }
  319.                                 //6键
  320.                                 else if(Im[2]==0x5a)
  321.                                 {
  322.                                    display();
  323.                                         t=6;
  324.                                         qd=0;
  325.                                         dt=1;
  326.                                 }
  327.                                 //7键
  328.                                 else if(Im[2]==0x42)
  329.                                 {
  330.                                    display();
  331.                                         t=7;
  332.                                         qd=0;
  333.                                         dt=1;
  334.                                 }
  335.                                 //8键
  336.                                 else if(Im[2]==0x52)
  337.                                 {
  338.                                    display();
  339.                                         t=8;
  340.                                         qd=0;
  341.                                         dt=1;
  342.                                 }
  343.                            IrOK=0;          //红外检测完后将变量清零
  344.                         }
  345.                         }
  346.                         if(t)          //t不为0时
  347.                         {
  348.                                 switch(t)         //判断t的数值
  349.                                 {
  350.                                         case 1:                                                         //数值为1时
  351.                                                 {
  352.                                                         TR1=0;                                         //关闭定时器
  353.                                                         p=1;                                         //显示1
  354.                                                         second=dt_time;                         //答题时间赋值给计时变量
  355.                                                         beep=0;                                         //蜂鸣器响
  356.                                                         for(i=0;i<20;i++)                 //延时
  357.                                                         {
  358.                                                                 display();
  359.                                                         }
  360.                                                         beep=1;                                         //蜂鸣器停止
  361.                                                         qd=0;break;                                 //抢答模式关闭(其他选手注释相同)
  362.                                                 }
  363.                                         case 2:
  364.                                                 {
  365.                                                         TR1=0;
  366.                                                         p=2;
  367.                                                         second=dt_time;
  368.                                                         beep=0;
  369.                                                         for(i=0;i<20;i++)
  370.                                                         {
  371.                                                                 display();
  372.                                                         }
  373.                                                         beep=1;
  374.                                                         qd=0;break;
  375.                                                 }
  376.                                         case 3:
  377.                                                 {
  378.                                                         TR1=0;
  379.                                                         p=3;
  380.                                                         second=dt_time;
  381.                                                         beep=0;
  382.                                                         for(i=0;i<20;i++)
  383.                                                         {
  384.                                                                 display();
  385.                                                         }
  386.                                                         beep=1;
  387.                                                         qd=0;break;
  388.                                                 }
  389.                                         case 4:
  390.                                                 {
  391.                                                         TR1=0;
  392.                                                         p=4;
  393.                                                         second=dt_time;
  394.                                                         beep=0;
  395.                                                         for(i=0;i<20;i++)
  396.                                                         {
  397.                                                                 display();
  398.                                                         }
  399.                                                         beep=1;
  400.                                                         qd=0;break;
  401.                                                 }
  402.                                         case 5:
  403.                                                 {
  404.                                                         TR1=0;
  405.                                                         p=5;
  406.                                                         second=dt_time;
  407.                                                         beep=0;
  408.                                                         for(i=0;i<20;i++)
  409.                                                         {
  410.                                                                 display();
  411.                                                         }
  412.                                                         beep=1;
  413.                                                         qd=0;break;
  414.                                                 }
  415.                                         case 6:
  416.                                                 {
  417.                                                         TR1=0;
  418.                                                         p=6;
  419.                                                         second=dt_time;
  420.                                                         beep=0;
  421.                                                         for(i=0;i<20;i++)
  422.                                                         {
  423.                                                                 display();
  424.                                                         }
  425.                                                         beep=1;
  426.                                                         qd=0;break;
  427.                                                 }
  428.                                         case 7:
  429.                                                 {
  430.                                                         TR1=0;
  431.                                                         p=7;
  432.                                                         second=dt_time;
  433.                                                         beep=0;
  434.                                                         for(i=0;i<20;i++)
  435.                                                         {
  436.                                                                 display();
  437.                                                         }
  438.                                                         beep=1;
  439.                                                         qd=0;break;
  440.                                                 }
  441.                                         case 8:
  442.                                                 {
  443.                                                         TR1=0;
  444.                                                         p=8;
  445.                                                         second=dt_time;
  446.                                                         beep=0;
  447.                                                         for(i=0;i<20;i++)
  448.                                                         {
  449.                                                                 display();
  450.                                                         }
  451.                                                         beep=1;
  452.                                                         qd=0;break;
  453.                                                 }
  454.         
  455.                                 }
  456.                         }

  457.                         if(dt==1)                        //答题标志开启时
  458.                         {
  459.                                 if(start==0)        //进入答题模式后,主持人按下开始按键,则开始计时答题时间
  460.                                 {
  461.                                         display();
  462.                                         if(start==0)
  463.                                         {
  464.                                                 beep=0;                           //蜂鸣器响
  465.                                                 for(i=0;i<20;i++) //延时
  466.                                                 {
  467.                                                         display();
  468.                                                 }
  469.                                                 beep=1;                           //关闭蜂鸣器
  470.                                                 TR1=1;                          //打开定时器
  471.                                         }
  472.                                 }
  473.                         }
  474.                 }
  475.                 if(second==0)                         //计时到0时报警
  476.                 {
  477.                         beep=0;                                 //打开蜂鸣器
  478.                         qd=0;                                 //关闭抢答模式
  479.                         dt=0;                                 //关闭答题模式
  480.                 }
  481.         }
  482. ……………………

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

所有资料51hei提供下载:
代码:
抢答器.zip (52.11 KB, 下载次数: 14)
回复

使用道具 举报

ID:1 发表于 2017-6-8 03:09 | 显示全部楼层
好资料,51黑有你更精彩!!!
回复

使用道具 举报

ID:89286 发表于 2017-6-8 08:32 | 显示全部楼层
thanks for sharing
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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