找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6776|回复: 18
收起左侧

51单片机三路抢答器仿真加源程序

  [复制链接]
ID:372961 发表于 2018-8-5 18:21 | 显示全部楼层 |阅读模式
protues仿真图:
QQ图片20180805181641.png QQ截图20180805181558.png

实物图:
IMG_0263.JPG IMG_0264.JPG

单片机程序源码:
  1. /*******************************************************************************
  2. *  标题:                           三路抢答器                                  *
  3. *  时间                      2018年8月5日17:59:20                                                   *
  4. *                                                                                                                                                           *
  5. *  实验说明:在10s的时间内,三位选手进行按键抢答,如果1号抢答,那么数码管将显示*
  6. 1号选手的号码。并且蜂鸣器响,以此类推。如果10s时间到,蜂鸣器响,选手 *
  7. 无法进行抢答                                                                                    *                                                      
  8. ********************************************************************************
  9. * 实验心得:做法相对简单,注意共阴数码管还是共阳数码管                                                             *
  10. ********************************************************************************/

  11. #include <reg52.h>

  12. //IO口定义
  13. #define GPIO_DIG P0
  14. #define GPIO_SHOW P2

  15. sbit LSA=P3^0;
  16. sbit beep=P1^5;
  17. sbit K1=P3^1;
  18. sbit K2=P1^0;
  19. sbit K3=P1^1;
  20. sbit K4=P1^2;

  21. //--定义全局变量--//
  22. typedef unsigned int u16;
  23. unsigned char code DIG_CODE[18]={
  24. 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
  25. 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0xff};
  26. //0、1、2、3、4、5、6、7、8、9、A、b、C、d、E、F的显示码
  27. unsigned int Ge=0;
  28. unsigned int Shi=1;
  29. unsigned int num=0;
  30. unsigned int Res=10;
  31. unsigned int flag=0;

  32. //全局函数
  33. void DigDisplay();

  34. void delay(u16 i)
  35. {
  36.         while(i--);      
  37. }

  38. void main()
  39. {
  40.     TMOD = 0x01;
  41.     TH0 = 0x3C;
  42.     TL0 = 0x0B0;
  43.     EA = 1;
  44.     ET0 = 1;
  45.     TR0 = 1;
  46.         DigDisplay();


  47. }


  48. void DigDisplay()
  49. {
  50.         unsigned char i;
  51.         unsigned int j;
  52.         while(1)
  53.         {
  54.         for(i=0;i<2;i++)
  55.         {
  56.                 switch(i)         //位选,选择点亮的数码管,
  57.                 {
  58.                         case(0):
  59.                                 LSA=0;
  60.                                 GPIO_DIG=DIG_CODE[Shi];//发送段码
  61.                                 break;//显示第0位
  62.                         case(1):
  63.                                 LSA=1;
  64.                                 GPIO_DIG=DIG_CODE[Ge];//发送段码
  65.                                 break;//显示第1位
  66.                 }
  67.                
  68. /****************************************************************************/
  69. /*消隐函数要在数码管更新频率很快的条件下,才起作用,手动更换数码管位选完全达不到这么快的速度,因此在这种情况下也是没必要用消隐的  */
  70.                 j=10;                                                 //扫描间隔时间设定
  71.                 while(j--);        
  72.                 GPIO_DIG=0x00;//消隐
  73.                 }
  74.         if(K1==0)
  75.         {
  76.                 Res=10;
  77.                 flag=0;
  78.         }

  79.     else if(K2==0)
  80.         {
  81.                 GPIO_SHOW=~DIG_CODE[1];
  82.                 while(1)
  83.                 {
  84.                 beep=~beep;
  85.                 delay(10);
  86.                 if(K1==0)
  87.                 {
  88.                  Res=10;
  89.                  flag=0;
  90.                  GPIO_SHOW=~DIG_CODE[17];
  91.                  break;        
  92.                 }
  93.                 }

  94.         }

  95.         else if(K3==0)
  96.         {
  97.                 GPIO_SHOW=~DIG_CODE[2];
  98.                 while(1)
  99.                 {
  100.                 beep=~beep;
  101.                 delay(10);
  102.                 if(K1==0)
  103.                 {
  104.                  Res=10;
  105.                  flag=0;
  106.                  GPIO_SHOW=~DIG_CODE[17];
  107.                  break;
  108.                 }        
  109.                 }
  110.         }

  111.         else if(K4==0)
  112.         {
  113.                 GPIO_SHOW=~DIG_CODE[3];
  114.                 while(1)
  115.                 {
  116.                 beep=~beep;
  117.                 delay(10);
  118.                 if(K1==0)
  119.                 {
  120.                  Res=10;
  121.                  flag=0;
  122.                  GPIO_SHOW=~DIG_CODE[17];
  123.                  break;
  124.                 }        
  125.                 }
  126.         }

  127.         }


  128. }

  129. void Int1() interrupt 1
  130. {
  131.         TMOD = 0x01;
  132.     TH0 = 0x3C;
  133.     TL0 = 0x0B0;
  134.         num++;

  135.         if(num==20)
  136.         {
  137.                 num=0;
  138.                 flag++;
  139.                 Res--;
  140.                 Ge=Res%10;
  141.                 Shi=Res/10;               
  142.         }
  143.         
  144.         if(flag==10)
  145.         {
  146.                 while(1)
  147.                 {
  148.                 beep=~beep;
  149.                 delay(10);

  150.                 if(K1==0)
  151.             {
  152.                 Res=10;
  153.                 flag=0;
  154.                 break;
  155.             }
  156.                 }
  157.         }        
  158. }
复制代码
0.png

全部资料51hei下载地址:
三路抢答器.rar (49.57 KB, 下载次数: 164)

评分

参与人数 2黑币 +65 收起 理由
杨雪飞 + 15 赞一个!
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:89286 发表于 2018-8-5 21:06 | 显示全部楼层
thanks for sharing
回复

使用道具 举报

ID:437183 发表于 2018-12-3 15:50 | 显示全部楼层
想问一下是怎样在proteus里操作的?为什么按了没反应?
回复

使用道具 举报

ID:439965 发表于 2018-12-6 11:04 来自手机 | 显示全部楼层
左上角控制按钮是不是没有用
回复

使用道具 举报

ID:442132 发表于 2018-12-11 19:00 | 显示全部楼层
可是仿真蜂鸣器响,是听不到的
回复

使用道具 举报

ID:372961 发表于 2018-12-28 17:02 | 显示全部楼层
饕客 发表于 2018-12-6 11:04
左上角控制按钮是不是没有用

对的,左上角的本来是想当复位按钮,但是没有给这个按钮功能,所以按了没用
回复

使用道具 举报

ID:372961 发表于 2018-12-28 17:03 | 显示全部楼层
day9520 发表于 2018-12-11 19:00
可是仿真蜂鸣器响,是听不到的

可以听到哒,好像是噗噗噗的声音
回复

使用道具 举报

ID:372961 发表于 2018-12-28 17:04 | 显示全部楼层
88877789 发表于 2018-12-3 15:50
想问一下是怎样在proteus里操作的?为什么按了没反应?

有反应的哦,右下角三个按键
回复

使用道具 举报

ID:457800 发表于 2018-12-29 09:46 来自手机 | 显示全部楼层
谢谢啦,
回复

使用道具 举报

ID:666200 发表于 2019-12-17 14:13 | 显示全部楼层
shi 和ge 是代表什么意思呢
回复

使用道具 举报

ID:372961 发表于 2019-12-17 14:51 | 显示全部楼层
zyn2222 发表于 2019-12-17 14:13
shi 和ge 是代表什么意思呢

十位和个位
回复

使用道具 举报

ID:666200 发表于 2019-12-17 22:23 来自手机 | 显示全部楼层
zyn2222 发表于 2019-12-17 14:13
shi 和ge 是代表什么意思呢

好的,懂了,感谢,还有一个问题就是我接线那个lsa 接到数码管位选那还是138的最低位引脚呢,因为我连接后他的时间会在前四个数码管来回跳,也不知道是为什么
回复

使用道具 举报

ID:779939 发表于 2020-6-15 14:34 | 显示全部楼层
非常好。完美实现了三路抢答的要求
回复

使用道具 举报

ID:732632 发表于 2020-6-15 17:06 | 显示全部楼层
学习一下
回复

使用道具 举报

ID:787765 发表于 2020-6-23 15:23 | 显示全部楼层
请问这个可以用dxp实现吗?
回复

使用道具 举报

ID:787765 发表于 2020-6-23 17:35 | 显示全部楼层
这个可以用dxp画出来吗?
回复

使用道具 举报

ID:787765 发表于 2020-6-24 15:26 | 显示全部楼层
您好,想问下您的三路抢答器的单个数码管是共阴极还是共阳极的呢?我看到代码里是阴极的代码,可是我用阳极的才会显示,但是中间有一横是一直亮着的,是什么原因呢?
回复

使用道具 举报

ID:830430 发表于 2020-10-15 20:14 来自手机 | 显示全部楼层
请问可以加一个加分减分功能吗
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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