找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4547|回复: 1
收起左侧

我的单片机51单片机多路抢答器设计 源码程序 仿真图

[复制链接]
ID:335743 发表于 2020-1-7 11:18 | 显示全部楼层 |阅读模式
至少六路抢答器,每路配备LED和抢答键,数码管显示倒计时,蜂鸣器发出提示音。
1.“开始键”按下,启动20s倒计时,20s内无人抢答,一次长音提示,禁止抢答;
2.20s倒计时内有抢答键按下,对应LED点亮,一次短音提示,其他抢答键禁用;
3.若第一次抢答选手答错,可二次抢答,但第一次抢答选手不可二次抢答;
4.“开始键”未按下,若“抢答键”按下,对应LED点亮,三次短音提示犯规;
5.加分项:选手抢答成功10s后,启动回答倒计时60s功能,倒计时结束两次短音提示。

这周做的抢答器,一键到底
不用按复位
五个功能都实现,可以穿插实现,代码有注释
就是写的长了些,没有分块,在一个.c里

下面放了一个今天刚拍的照片
  1. #include <reg52.h> //头文件
  2. #include <intrins.h>
  3. #define uchar unsigned char //uchar 代替 unsigned char
  4. #define uint  unsigned int  //同上
  5. void delayms(uint);                        //延时函数ms
  6. void display(uchar,uchar);//数码管显示
  7. void keypros();        //键盘(包含全功能)
  8. void delays(uint xs);//延时s
  9. void Play(uchar t);//提示音
  10. /*译码器*/
  11. sbit LSA=P1^5;
  12. sbit LSB=P1^6;
  13. sbit LSC=P1^7;  

  14. /*按键*/
  15. sbit key_tt=P1^4; //正确
  16. sbit key_start=P3^6; //一次
  17. sbit key_start_second=P3^7; //二次
  18. sbit key1=P3^0;                //选手1
  19. sbit key2=P3^1;
  20. sbit key3=P3^2;
  21. sbit key4=P3^3;
  22. sbit key5=P3^4;
  23. sbit key6=P3^5;                //选手6

  24. /*蜂鸣器*/
  25. sbit beep=P2^6;

  26. /*LED*/
  27. sbit led1=P2^0; //选手1
  28. sbit led2=P2^1;
  29. sbit led3=P2^2;
  30. sbit led4=P2^3;
  31. sbit led5=P2^4;
  32. sbit led6=P2^5; //选手6

  33. uchar num1,num=60,miaoshi,miaoge,m=1,n=1,p=0,d=0,w1=1,w2=1,w3=1,w4=1,w5=1,w6=1;
  34. uchar code table[]={0x3f,0x06,0x5b,0x4f,
  35.                                                                                 0x66,0x6d,0x7d,0x07,//共阴极数码管数组 包含0~F
  36.                                                                                 0x7f,0x6f,0x77,0x7c,
  37.                                                                                 0x39,0x5e,0x79,0x71};


  38. void shumaguan(int i)   //数码管位选译码器
  39. {
  40.                         switch(i)
  41.                         {
  42.                                 case 0:
  43.                                         LSA=0;LSB=0;LSC=0;break;
  44.                                 case 1:
  45.                                         LSA=1;LSB=0;LSC=0;break;
  46.                                 case 2:
  47.                                         LSA=0;LSB=1;LSC=0;break;
  48.                                 case 3:
  49.                                         LSA=1;LSB=1;LSC=0;break;
  50.                                 case 4:                                             
  51.                                         LSA=0;LSB=0;LSC=1;break;
  52.                                 case 5:
  53.                                         LSA=1;LSB=0;LSC=1;break;
  54.                                 case 6:
  55.                                         LSA=0;LSB=1;LSC=1;break;
  56.                                 case 7:
  57.                                         LSA=1;LSB=1;LSC=1;break;               
  58.                         }
  59. }
  60.                                                                                 
  61. void Play(uchar t)//提示音
  62. {
  63.          uint i;
  64.         for(i=0;i<500;i++)
  65.         {
  66.                  beep = ~beep;
  67.                 delayms(t);
  68.         }
  69.         beep = 0;
  70. }                                                                                
  71.                                                                                 
  72. void delayms(uint xms)   //延时ms 不准确
  73. {
  74.         uint i,j;
  75.         for(i=xms;i>0;i--)
  76.                 for(j=110;j>0;j--);
  77. }                                                                                
  78.                                        
  79. void delays(uint xs)   //延时2s 不准确
  80. {
  81.                 uint i,z;

  82.                 uchar j; //定义两个循环变量i、j
  83. for(z=xs;z>0;z--)
  84. for (i = 4165; i > 0; i--) //外层循环1000次

  85. for (j = 1240; j > 0; j--) ; //内层循环124次
  86. }                 


  87. void main()
  88. {        
  89.         
  90.         TMOD=0x01;   //设置定时器0为工作方式1
  91.   TH0=(65536-45872)/256; //装初值
  92.         TL0=(65536-45872)%256;
  93.         EA=1;                                //开总中断
  94.         ET0=1;                        //开定时器0中断                        
  95.         TR0=1;                        //启动定时器0
  96.         
  97.         while(1)
  98.         {
  99.                 //加分项    这里为了方便查看效果,60秒倒计时 改为18秒倒计时
  100.                 if(num==53&&(d==1||d==2||d==3||d==4||d==5||d==6))
  101.                 {
  102.                                         Play(1);
  103.                                                         delayms(500);
  104.                                                                 Play(1);
  105.                                                                 delayms(500);
  106.                         
  107.         EA=0;                                //开总中断
  108.                 }
  109.                
  110.         display(miaoshi,miaoge);
  111.         keypros();                                //按键函数
  112.         }

  113. }


  114. void display(uchar miaoshi,uchar miaoge)//显示子函数
  115. {
  116.                 miaoshi=num/10;
  117.                 miaoge=num%10;
  118.         
  119.                 shumaguan(0);
  120.                 P0=table[miaoshi];   
  121.                 delayms(1);
  122.                  P0=0x00;

  123.                 shumaguan(1);
  124.                 P0=table[miaoge];   
  125.                 delayms(1);
  126.                   P0=0x00;
  127. }


  128. void keypros()                                //按键函数
  129. {
  130.         
  131.         /*正常情况*/
  132.         if (key_start==0)                //检测按键是否按下
  133.         {
  134.                 delayms(10);                         //消除抖动
  135.                 if(key_start==0)        //再次判断按键是否按下,“开始键”按下
  136.                 {
  137.                                 led1=1;
  138.                 led2=1;
  139.                 led3=1;
  140.                 led4=1;
  141.                 led5=1;
  142.                 led6=1;
  143.                         TR0=1;
  144.                         m=0;//初始值为1 只有按下开始键  m=0  不按下开始键 就抢答,犯规
  145.                         num=20;
  146.                         n=0;//标志位 只允许一个人抢答
  147.                         EA=1;
  148.                 }
  149.                 while(!key_start) //检测按键是否松开
  150.                 display(miaoshi,miaoge);
  151.         }
  152.                                                 
  153.                          if(num==0)//功能1  p标志位 只进行一次
  154.                          {
  155.                                  if(p==0)
  156.                                          {
  157.                                                                 Play(1);
  158.                                                         
  159.                                                                 Play(1);
  160.                                                                
  161.                                                                                 Play(1);
  162.                                                                 delayms(500);
  163.                                  TR0=0;//无人抢答 关闭倒计时
  164.                                         n=1;//关闭抢答
  165.                                                  p=1;
  166.                                  }
  167.                          }
  168.                         
  169.                          if(n==0)//只允许一个人抢答
  170.                          {
  171.                          m=0;//
  172.                                                 
  173.                                  if(key1==0&&n==0)                  //检测按键是否按下  只有n=0才能抢答,保证只有一个人抢答
  174.                         {               
  175.                                         delayms(10);   //消除抖动
  176.                                         if(key1==0&&n==0)         //再次判断按键是否按下
  177.                                         {
  178.                                                 if(w1==1)// w1初始值为1;如果按下了二次抢答按钮,w1=0,则不执行以下程序
  179.                                                 {
  180.                                                         TR0=0;
  181.                                                         led1=0;
  182.                                                         Play(1);
  183.                                                         n=1;//按下按钮,标志位为1,不执行其他抢答程序
  184.                                                         
  185.                                                                 /*以下 加分项*/
  186.                                                         delays(5);
  187.                                                 
  188.                                                         num=60;
  189.                                                         TR0=1;
  190.                                                         d=1;//说明 选手1 按下按钮
  191.                                                 }
  192.                                         }
  193.                
  194.                         }

  195.                                  if(key2==0&&n==0)                  //检测按键是否按下
  196.                         {               
  197.                                         delayms(10);   //消除抖动
  198.                                         if(key2==0&&n==0)         //再次判断按键是否按下
  199.                                         {
  200.                                                         if(w2==1)//如果二次按钮按下,w2=0  说明答错了 不进行下一次抢答
  201.                                                         {
  202.                                                         TR0=0;
  203.                                                         led2=0;
  204.                                                         Play(1);
  205.                                                         n=1;
  206.                                                         delays(1);
  207. //这个时间要改 5  才是10秒
  208.                                                         num=60;
  209.                                                         TR0=1;
  210.                                                         d=2; //选手2按下按钮
  211.                                                         }
  212.                                         }
  213.                
  214.                         }
  215.                         
  216.          if(key3==0&&n==0)                  //检测按键是否按下
  217.                         {        
  218.                                         delayms(10);   //消除抖动
  219.                                         if(key3==0&&n==0)         //再次判断按键是否按下
  220.                                         {
  221.                                                         if(w3==1)
  222.                                                         {        
  223.                                                         TR0=0;
  224.                                                         led3=0;
  225.                                                         Play(1);
  226.                                                         n=1;
  227.                                                         delays(1);
  228. //这个时间要改 5  才是10秒
  229.                                                         num=60;
  230.                                                         TR0=1;
  231.                                                         d=3;
  232.                                                         }
  233.                                         }
  234.                
  235.                         }
  236.                         
  237.          if(key4==0&&n==0)                  //检测按键是否按下
  238.                         {               
  239.                                         delayms(10);   //消除抖动
  240.                                         if(key4==0&&n==0)         //再次判断按键是否按下
  241.                                         {
  242.                                                         if(w4==1)
  243.                                                         {
  244.                                                         TR0=0;
  245.                                                         led4=0;
  246.                                                         Play(1);
  247.                                                         n=1;
  248.                                                         delays(1);
  249. //这个时间要改 5  才是10秒
  250.                                                         num=60;
  251.                                                         TR0=1;
  252.                                                         d=4;
  253.                                                         }
  254.                                         }
  255.                
  256.                         }
  257.                         
  258.          if(key5==0&&n==0)                  //检测按键是否按下
  259.                         {               
  260.                                         delayms(10);   //消除抖动
  261.                                         if(key5==0&&n==0)         //再次判断按键是否按下
  262.                                         {
  263.                                                         if(w5==1)
  264.                                                         {
  265.                                                         TR0=0;
  266.                                                         led5=0;
  267.                                                         Play(1);
  268.                                                         n=1;
  269.                                                         delays(1);
  270. //这个时间要改 5  才是10秒
  271.                                                         num=60;
  272.                                                         TR0=1;
  273.                                                         d=5;
  274.                                                         }
  275.                                         }
  276.                
  277.                         }
  278.                         
  279.          if(key6==0&&n==0)                  //检测按键是否按下
  280.                         {        
  281.                                         delayms(10);   //消除抖动
  282.                                         if(key6==0&&n==0)         //再次判断按键是否按下
  283.                                         {
  284.                                                         if(w6==1)
  285.                                                         {        
  286.                                                         TR0=0;
  287.                                                         led6=0;
  288.                                                         Play(1);
  289.                                                         n=1;
  290.                                                         delays(1);
  291. //这个时间要改 5  才是10秒
  292.                                                         num=60;
  293.                                                         TR0=1;
  294.                                                         d=6;
  295.                                                         }
  296.                                         }
  297.                
  298.                         }
  299.                         
  300.                                 }
  301.         

  302. /*犯规情况功能4*/
  303. if(m==1)//不按下开始键 m=1
  304.                 {
  305. if (key_start!=0)                //检测按键是否按下  未按下则执行下面
  306.         {
  307.                 led1=1;
  308.                 led2=1;
  309.                 led3=1;
  310.                 led4=1;
  311.                 led5=1;
  312.                 led6=1;
  313.                         if(key1==0&&key_start!=0)                  //开始键未按下,按下抢答器 执行下面
  314.                         {        
复制代码

主程序流程图

主程序流程图

课设要求

课设要求

bmp

bmp

proteus

proteus

仿真程序.7z

33.84 KB, 下载次数: 87, 下载积分: 黑币 -5

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:335743 发表于 2020-1-7 11:23 | 显示全部楼层
本帖最后由 chb704125391 于 2020-1-7 16:51 编辑

新人第一次正儿八经发帖
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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