找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2683|回复: 4
打印 上一主题 下一主题
收起左侧

51单片机八路抢答器设计 Proteus仿真源代码资料

[复制链接]
跳转到指定楼层
楼主
(1)抢答器同时供 8 名选手比赛,分别用8个按钮 s1-s8表示(要求用户使用4*4键盘);
(2)设置一个系统清除和抢答控制开关按键1和按键2。
(3)抢答器具有锁存与显示功能。即选手按下按钮,锁存相应编号,显示该选手编号至数码管,并且该编号保存至主持人按下清除键按键1清除为止。
(4)抢答器具有定时抢答功能,一次抢答设定的时间为X秒(X可自己设置)。主持人按下抢答控制开关按键2,抢答才能开始,启动定时器,并将倒数计时时间用数码管显示。若定时时间到,无人抢答,则该轮抢答结束,系统通过蜂鸣器报警,选手禁止抢答。(5)选手在设定的时间内进行抢答,抢答有效,定时器停止工作,蜂鸣器报警,数码管显示选手编号及倒计时剩余时间,并保持到主持人将系统清除为止。

Proteus仿真:





LY-51S开发板实物:
[ i]

单片机源程序如下:
  1. #include<reg52.h>        //头文件
  2. #define uchar unsigned char                //宏定义
  3. #define uint unsigned int                //宏定义


  4. //单片机引脚定义

  5. #define DataPort P0 //定义数据端口 程序中遇到DataPort 则用P0 替换
  6. #define KEY P3
  7. sbit LATCH1=P2^6;//定义锁存使能端口 段锁存
  8. sbit LATCH2=P2^7;//                 位锁存
  9. sbit BEEP = P1^4;

  10. uchar code dofly_DuanMa[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};// 显示段码值0~9
  11. uchar code dofly_WeiMa[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//分别对应相应的数码管点亮,即位码
  12. uchar TempData[8]; //存储显示值的全局变量


  13. #define TIMEINIT 10

  14. uchar  time=TIMEINIT;        //倒计时
  15. uchar  player = 0;


  16. //延时函数
  17. void DelayMS(uint ms)
  18. {
  19.          uchar t;
  20.         while(ms--)
  21.         {
  22.                  for(t=0;t<120;t++);
  23.         }
  24. }
  25. //简单延时
  26. void Delay(unsigned int t)
  27. {
  28.         while(--t);
  29. }
  30. //显示驱动
  31. void Display(unsigned char FirstBit,unsigned char Num)
  32. {
  33.       unsigned char i;         
  34.           for(i=0;i<Num;i++)
  35.            {
  36.            DataPort=0;   //清空数据,防止有交替重影
  37.        LATCH1=1;     //段锁存
  38.        LATCH1=0;

  39.             if(i<2)
  40.            {
  41.                DataPort=dofly_WeiMa[i+FirstBit]; //取位码
  42.                LATCH2=1;     //位锁存
  43.                LATCH2=0;           
  44.            }else
  45.            {
  46.                DataPort=dofly_WeiMa[i+FirstBit+2]; //取位码
  47.                LATCH2=1;     //位锁存
  48.                LATCH2=0;           
  49.            }               

  50.        DataPort=TempData[ i]; //取显示数据,段码
  51.        LATCH1=1;     //段锁存
  52.        LATCH1=0;
  53.       
  54.            Delay(200); // 扫描间隙延时,时间太长会闪烁,太短会造成重影

  55.        }
  56. }
  57. //按键扫描
  58. uchar Keys_Scan()
  59. {
  60.         uchar KeyNO=16;
  61.          uchar Tmp;
  62.         KEY = 0x0f;
  63.         DelayMS(10);
  64.         Tmp = KEY ^ 0x0f;
  65.         switch(Tmp)
  66.         {
  67.                  case 1: KeyNO = 0; break;
  68.                 case 2: KeyNO = 1; break;
  69.                 case 4: KeyNO = 2; break;
  70.                 case 8: KeyNO = 3; break;
  71.                 default: KeyNO = 16;
  72.         }
  73.         KEY = 0xf0;
  74.         DelayMS(1);
  75.         Tmp = KEY >> 4 ^ 0x0f;
  76.         switch(Tmp)
  77.         {
  78.                  case 1: KeyNO += 0; break;
  79.                 case 2: KeyNO += 4; break;
  80.                 case 4: KeyNO += 8; break;
  81.                 case 8: KeyNO += 12;
  82.         }
  83.         return KeyNO;
  84. }
  85. //显示数据
  86. void Display_Data()
  87. {
  88.         uint num = 1234;
  89.         TempData[0]=dofly_DuanMa[player/10];//分解显示信息,如要显示68,则68/10=6  68%10=8  
  90.         TempData[1]=dofly_DuanMa[player%10];
  91.         
  92.         TempData[2]=dofly_DuanMa[(time)/10];
  93.         TempData[3]=dofly_DuanMa[(time)%10];
  94.         Display(0,4);
  95. }
  96. //初始化定时器
  97. void Init_Time()
  98. {
  99.         TMOD=0x01;        //设置定时器模式        
  100.         TH0=(65536-46080)/256;// 由于晶振为11.0592,故所记次数应为46080,计时器每隔50000微秒发起一次中断。
  101.         TL0=(65536-46080)%256;//46080的来历,为50000*11.0592/12           //设置初值
  102.         ET0=1;                //开T0定时器中断
  103.         EA=1;                 //开总中断
  104. }
  105. void BeepON()
  106. {
  107.         int i;
  108.         for(i=0;i<20;i++)
  109.         {
  110.                 BEEP = 0;
  111.                 Delay(5000);
  112.                 BEEP = 1;
  113.                 Delay(5000);        
  114.         }
  115. }
  116. //主函数
  117. main()
  118. {
  119.         uchar flag = 0;
  120.         uchar temp;
  121.          BEEP = 1;
  122.         Init_Time(); //初始化定时器
  123.         while(1)
  124.         {
  125.                 temp=Keys_Scan();        //获取选手


  126.                 if(temp!=16) //有按键按下
  127.                 {
  128.                         if(temp ==8) //抢答键,启动键
  129.                         {
  130.                                 TR0 = 1;  //启动定时器
  131.                                 flag =1;  //1:运行中
  132.                         }
  133.                         if(temp ==9) //清零键
  134.                         {
  135.                                 time = TIMEINIT;         //时间恢复为10,初始值
  136.                                 player = 0; //选手号清零
  137.                                 flag =0;    //0:暂停
  138.                                 TR0 = 0;    //关闭定时器
  139.                         }
  140.                         if(temp ==10) //加键
  141.                         {
  142.                                 if(flag == 0) //暂停
  143.                                 {
  144.                                         time+=1;;         //时间加
  145.                                         Delay(50000);                                
  146.                                 }
  147.                         }
  148.                         if(temp ==11) //减键
  149.                         {
  150.                                 if(flag == 0) //暂停
  151.                                 {
  152.                                         time-=1;;         //时间减
  153.                                         Delay(50000);                                
  154.                                 }
  155.                         }


  156.                         if(temp<8)        //选手按下按键
  157.                         {
  158.                                 if((flag==1)&&(time>0))         //程序执行中
  159.                                 {
  160.                                         player=temp+1;        //获取选手编号
  161.                                         flag = 0;  //暂停
  162.                                         TR0 = 0;   //停止计数
  163.                                         /*
  164.                                         BEEP = 0;
  165.                                         Delay(35000);
  166.                                         BEEP = 1;
  167.                                         */
  168.                                         BeepON();                                       
  169.                                 }
  170.                         }               
  171.                 }
  172.                 if((flag==1)&&(time==0))         //结束报警
  173.                 {
  174. ……………………

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

所有资料51hei附件下载:
八路抢答器.7z (2.25 MB, 下载次数: 72)

评分

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

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:301191 发表于 2021-11-26 16:15 | 只看该作者
顶一下
回复

使用道具 举报

板凳
ID:989715 发表于 2021-12-8 18:18 | 只看该作者
您好,请问帖中的程序在哪个文件里了,我下载了附件没找到呀
回复

使用道具 举报

地板
ID:262 发表于 2021-12-9 02:07 | 只看该作者
sundheao66 发表于 2021-12-8 18:18
您好,请问帖中的程序在哪个文件里了,我下载了附件没找到呀

51hei_C语言文件.c
这个文件里面  工程文件也有 慢慢研究吧
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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