找回密码
 立即注册

QQ登录

只需一步,快速开始

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

51单片机设计的8路抢答器(Proteus仿真+代码注释详解)

[复制链接]
跳转到指定楼层
楼主
设计要求:1.利用数码管进行显示抢答时间和答题时间倒计时;利用中断定时器进行定时/计数
2.实现按键自锁功能,只有当主持人按键有效后抢答者按键才有效,当任一抢答者按键后,其他抢答者按键无效
3.对优先抢答者进行LED发亮与数码管显示抢答者序号提示是对应抢答者进行抢答

设计者百度贴吧号:wife101,耐性解答

仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)


单片机源程序如下:
  1. /*-----------------------------------------------
  2.   名称:七路抢答器
  3.   名称:单个独立按键控制
  4.   编写:吴柱俊        百度账号:wife101  桂林电子科技大学 电子工程与自动化学院
  5.   内容: 1、试验目的:了解按键的扫描原理
  6.          2、实现现象:同时按键抢答,先按的键有效,其他按键锁死 主持人按开始后后重新开始抢答
  7.          3、硬件要求:按键 LED灯 ,数码管显示原理
  8.          原理:当主持人按键开始后方可按键显示,否则其他应答者按键无效
  9.                  当主持人按键开始后开始等待应答者按键,给予抢答者时间为10秒,抢答者要在这10S内做出抢答反应
  10.                  当有抢答者抢答后显示第几个抢答者为p0口数码管显示
  11.                  P2数码管显示为抢答时间
  12.                  当有抢答者抢答按键后时间暂停

  13.                  关注我贴吧下一个抢答后给予应答着10S时间应答而不是暂停出应答时间
  14. ------------------------------------------------*/
  15. #include<reg51.h>     //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
  16. #define uint unsigned int
  17. #define uchar unsigned char
  18. uchar code DSY_CODE[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
  19. //共地数码管段码0到9
  20. uchar i=1,count=9,scount=0;
  21. uchar Flag=0;

  22. void int0();//定时/计数中断初始化



  23. sbit key1=P1^0;//定义按键位置 独立按键模式
  24. sbit key2=P1^1;
  25. sbit key3=P1^2;
  26. sbit key4=P1^3;
  27. sbit key5=P1^4;//定义按键位置 独立按键模式
  28. sbit key6=P1^5;
  29. sbit key7=P1^6;
  30. sbit key8=P1^7;

  31. /*-----------------------------------------------
  32.                     主函数
  33. ------------------------------------------------*/
  34. main()
  35. {
  36. int0();//定时/计数中断初始化
  37. P0=0x3f;//刚开始显示0
  38. P2=0X3F;//刚开始显示0
  39. while(1)
  40. {
  41. P0=DSY_CODE[scount];
  42. while(Flag)//执行一次就停止了 先检测到的相应 复位后有效
  43.       {
  44.       if (!key1)    {scount=1;P3=0xFE;Flag=0;EA=0;ET0=0;TR0=0;P0=DSY_CODE[scount];        }//   第一路灯亮,令falg=0,退出循环,使其他路应答无效,停止中断
  45.           else if(!key2){scount=2;P3=0xFD;Flag=0;EA=0;ET0=0;TR0=0;P0=DSY_CODE[scount];}//   第一路灯亮,令falg=0,退出循环,使其他路应答无效,停止中断
  46.           else if(!key3){scount=3;P3=0xFB;Flag=0;EA=0;ET0=0;TR0=0;P0=DSY_CODE[scount];}//   第一路灯亮,令falg=0,退出循环,使其他路应答无效,停止中断
  47.           else if(!key4){scount=4;P3=0xF7;Flag=0;EA=0;ET0=0;TR0=0;P0=DSY_CODE[scount];}//   第一路灯亮,令falg=0,退出循环,使其他路应答无效,停止中断
  48.           else if(!key5){scount=5;P3=0xEF;Flag=0;EA=0;ET0=0;TR0=0;P0=DSY_CODE[scount];}//   第一路灯亮,令falg=0,退出循环,使其他路应答无效,停止中断
  49.           else if(!key6){scount=6;P3=0xDF;Flag=0;EA=0;ET0=0;TR0=0;P0=DSY_CODE[scount];}//   第一路灯亮,令falg=0,退出循环,使其他路应答无效,停止中断
  50.           else if(!key7){scount=7;P3=0xBF;Flag=0;EA=0;ET0=0;TR0=0;P0=DSY_CODE[scount];}//   第一路灯亮,令falg=0,退出循环,使其他路应答无效,停止中断

  51.                      if(key8==0)                //主持人按键重新开始
  52.           {
  53.           P3=0XFF;           // 令所有灯灭
  54.           EA=1;                   //开中断计数
  55.           ET0=1;
  56.           TR0=1;
  57.           Flag=1;        //另flag=1使指向while(flag)进入抢答环节
  58.           count=9;
  59.                   scount=0;         
  60.           }
  61.       }

  62.            if(key8==0)                //主持人按键重新开始
  63.           {
  64.           P3=0XFF;           // 令所有灯灭
  65.           EA=1;                   //开中断计数
  66.           ET0=1;
  67.           TR0=1;
  68.           Flag=1;        //另flag=1使指向while(flag)进入抢答环节
  69.           count=9;
  70.                   scount=0;         
  71.           }

  72. }
  73. }


  74. void int0()//定时/计数中断初始化
  75. {
  76. TMOD=0X01;//方式选择
  77. //方式0 13位 8192,最大定时8.192ms;方式1 16位,65536,最大定时65.536ms

  78. TH0=(65536-50000)/256;        //整除得高位  如12/10=1        定时50ms
  79. TL0=(65535-50000)%256 ;        //取余得低位   如12%10=2  定时50ms
  80. //EA=1;
  81. //ET0=1;
  82. //TR0=1;
  83. }

  84. void int0_interrupt() interrupt 1
  85. {
  86. TH0=(65536-50000)/256;                //恢复定时器0初值
  87. TL0=(65536-50000)%256;
  88. i++;  //每来一次中断对i进行自加1
  89. if(i==20)//定时1s,50ms*20=1秒,定时器中断20次
  90. {
  91. i=0;
  92. count--;   //当定时够1S,count赋值为1
  93. }
  94. P2=DSY_CODE[count%10];        //取低位
  95. if(count==0)   //当count=60秒进行自动清零复位
  96. {
  97. EA=0;ET0=0;TR0=0;
  98. }
  99. }
复制代码

所有资料51hei提供下载:
单片机控制的多路抢答器程序 仿真.rar (75.61 KB, 下载次数: 108)


评分

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

查看全部评分

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

使用道具 举报

沙发
ID:328014 发表于 2019-5-5 22:10 | 只看该作者
好资料,51黑有你更精彩!!!
回复

使用道具 举报

板凳
ID:138119 发表于 2019-5-6 02:48 | 只看该作者
不错不错!多学习~!
回复

使用道具 举报

地板
ID:344089 发表于 2020-12-26 16:02 | 只看该作者
好资料,谢谢楼主分享,学到了
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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