当前位置:   article > 正文

基于51单片机的八路抢答器Protues仿真设计_基于51单片机的8路抢答器

基于51单片机的8路抢答器

目录

一、设计背景

二、实现功能

三、仿真演示

四、源程序(部分)


一、设计背景

        近年来随着科技的飞速发展,单片机的应用正在不断的走向深入。本文阐述了基于51单片机的八路抢答器设计。本设计中,51单片机充当了核心控制器的角色,通过IO口与各个功能模块相连接。按键模块负责检测参与者的抢答动作,当有人按下抢答按钮时,会通过IO口电平的变化通知单片机,单片机会记录按键的次序,并通过数码管显示当前的抢答结果。

        为了保证抢答过程的准确性和公平性,设计中还需要考虑到以下因素。首先,按键模块需要具备快速响应和高可靠性,以确保抢答者的动作能够被准确地捕捉到。其次,显示屏模块需要能够实时更新抢答结果,并显示相应的信息,比如参与者的编号和抢答时间。最后,在电路连接方面,需要注意各个模块之间的线路布局,以避免信号干扰和电气问题。

       软件系统采用C语言编写程序,包括显示程序,定时中断服务,延时程序等,并在KEIL5中调试运行,硬件系统利用PROTEUS8.11强大的功能来实现,简单切易于观察,在仿真中就可以观察到实际的工作状态。

二、实现功能

        以51单片机为控制核心,设计一种八路抢答器。整个系统包括MCU、晶振电路、时钟电路、功能按键以及数码管显示。该系统利用共阳数码管实时显示抢答倒计时时间,通过独立按键设计控制抢答器的启动、复位、以及不同选手的抢答。可具体实现以下功能:

(1) 按下启动键后,在20s倒计时的过程中,按下任意路抢答按键,数码管上对应显示抢答选手的序号并清零倒计时。

(2) 按下复位键后,抢答器复位,再次按下启动键可以实现新一轮的抢答。

(3)·定时器定时50ms,20次定时可产生1秒钟计时。

(4) 抢答倒计时开始抢答指示灯亮起,抢答结束,按下复位按键后指示灯熄灭。

三、仿真演示

运行仿真,未按下总开关按键,数码管不显示。

按下系统总开关后,进入准备界面,数码管显示默认抢答序号0和抢答倒计时20秒。

按下启动按键,进入抢答界面,开始20秒抢答倒计时,并在数码管上实时显示。

在抢答倒计时范围内,按下序号为1~8的选手抢答按键,抢答倒计时归零,数码管上显示抢答选手序号和倒计时00秒。

 按下复位按键后,恢复到准备界面,按下启动按钮进行下一次抢答。

四、源程序(部分)

  1. #include "reg52.h"
  2. #include "delay.h"
  3. #include "smg.h"
  4. #include "timer.h"
  5. sbit kaishi=P3^1;
  6. sbit key1 = P1^0;
  7. sbit key2 = P1^1;
  8. sbit key3 = P1^2;
  9. sbit key4 = P1^3;
  10. sbit key5 = P1^4;
  11. sbit key6 = P1^5;
  12. sbit key7 = P1^6;
  13. sbit key8 = P1^7;
  14. sbit state = P3^4;
  15. sbit reset = P3^7;
  16. sbit start_stop = P3^6;
  17. _bool action = 0;
  18. _bool kaishi_flag=0;
  19. _bool key1_flag = 0;
  20. _bool key2_flag = 0;
  21. _bool key3_flag = 0;
  22. _bool key4_flag = 0;
  23. _bool key5_flag = 0;
  24. _bool key6_flag = 0;
  25. _bool key7_flag = 0;
  26. _bool key8_flag = 0;
  27. _bool reset_flag = 0;
  28. _bool start_stop_flag = 0;
  29. uint8 second = 20;
  30. uint8 timer0_count = 0;
  31. uint8 number = 0;
  32. uint8 number_display = 0;
  33. uint8 key_scan8(void);
  34. void reset_keyscan(void);
  35. void start_stop_keyscan(void);
  36. /*-----------------------------------------------------------
  37. 主函数
  38. ------------------------------------------------------------*/
  39. void main()
  40. {
  41. ConfigTimer0();
  42. while(1)
  43. {
  44. while((kaishi == 0)&&(!kaishi_flag))
  45. {
  46. start_stop_keyscan();
  47. reset_keyscan();
  48. while(action)
  49. {
  50. while(!key_scan8())
  51. {
  52. display(number_display,second);
  53. if(second == 0)
  54. {
  55. second = 20;
  56. break;
  57. }
  58. }
  59. TR0 = 0;
  60. second = 0;
  61. display(number_display,second);
  62. action = 0;
  63. break;
  64. }
  65. display(number_display,second);
  66. }
  67. }
  68. }
  69. /*-----------------------------------------------------------
  70. 中断服务函数
  71. ------------------------------------------------------------*/
  72. void timer0() interrupt 1
  73. {
  74. TH0=0x3c;
  75. TL0=0xb0;
  76. timer0_count++;
  77. if(timer0_count == 20)
  78. {
  79. timer0_count = 0;
  80. second--;
  81. if(second == 0)
  82. {
  83. TR0 = 0;
  84. number_display = 0;
  85. state = 1;
  86. action = 0;
  87. }
  88. }
  89. }
  90. /*-----------------------------------------------------------
  91. 开始键扫描函数
  92. ------------------------------------------------------------*/
  93. void start_stop_keyscan(void)
  94. {
  95. if(start_stop == 0)
  96. {
  97. Delay_ms(8);
  98. if((start_stop == 0)&&(!start_stop_flag))
  99. {
  100. start_stop_flag = 1;
  101. action = 1;
  102. TR0 = 1;
  103. state = 0;
  104. }
  105. }
  106. else
  107. {
  108. start_stop_flag = 0;
  109. }
  110. }
  111. /*-----------------------------------------------------------
  112. 八位抢答键扫描函数
  113. ------------------------------------------------------------*/
  114. uint8 key_scan8(void)
  115. {
  116. if(key1 == 0)
  117. {
  118. Delay_ms(8);
  119. if((key1 == 0)&&(!key1_flag))
  120. {
  121. key1_flag = 1;
  122. number = 1;
  123. number_display = number;
  124. }
  125. }
  126. else
  127. {
  128. key1_flag = 0;
  129. number = 0;
  130. }
  131. if(key2 == 0)
  132. {
  133. Delay_ms(8);
  134. if((key2 == 0)&&(!key2_flag))
  135. {
  136. key2_flag = 1;
  137. number = 2;
  138. number_display = number;
  139. }
  140. }
  141. else
  142. {
  143. key2_flag = 0;
  144. number = 0;
  145. }
  146. if(key3 == 0)
  147. {
  148. Delay_ms(8);
  149. if((key3 == 0)&&(!key3_flag))
  150. {
  151. key3_flag = 1;
  152. number = 3;
  153. number_display = number;
  154. }
  155. }
  156. else
  157. {
  158. key3_flag = 0;
  159. number = 0;
  160. }
  161. if(key4 == 0)
  162. {
  163. Delay_ms(8);
  164. if((key4 == 0)&&(!key4_flag))
  165. {
  166. key4_flag = 1;
  167. number = 4;
  168. number_display = number;
  169. }
  170. }
  171. else
  172. {
  173. key4_flag = 0;
  174. number = 0;
  175. }
  176. if(key5 == 0)
  177. {
  178. Delay_ms(8);
  179. if((key5 == 0)&&(!key5_flag))
  180. {
  181. key5_flag = 1;
  182. number = 5;
  183. number_display = number;
  184. }
  185. }
  186. else
  187. {
  188. key5_flag = 0;
  189. number = 0;
  190. }
  191. if(key6 == 0)
  192. {
  193. Delay_ms(8);
  194. if((key6 == 0)&&(!key6_flag))
  195. {
  196. key6_flag = 1;
  197. number = 6;
  198. number_display = number;
  199. }
  200. }
  201. else
  202. {
  203. key6_flag = 0;
  204. number = 0;
  205. }
  206. if(key7 == 0)
  207. {
  208. Delay_ms(8);
  209. if((key7 == 0)&&(!key7_flag))
  210. {
  211. key7_flag = 1;
  212. number = 7;
  213. number_display = number;
  214. }
  215. }
  216. else
  217. {
  218. key7_flag = 0;
  219. number = 0;
  220. }
  221. if(key8 == 0)
  222. {
  223. Delay_ms(8);
  224. if((key8 == 0)&&(!key8_flag))
  225. {
  226. key8_flag = 1;
  227. number = 8;
  228. number_display = number;
  229. }
  230. }
  231. else
  232. {
  233. key8_flag = 0;
  234. number = 0;
  235. }
  236. if(number_display != 0)
  237. {
  238. return 1;
  239. }
  240. else
  241. {
  242. return 0;
  243. }
  244. }
  245. /*-----------------------------------------------------------
  246. 复位键扫描函数
  247. ------------------------------------------------------------*/
  248. void reset_keyscan(void)
  249. {
  250. if(reset == 0)
  251. {
  252. Delay_ms(8);
  253. if((reset == 0)&&(!reset_flag))
  254. { second=20;
  255. reset_flag = 1;
  256. number_display = 0;
  257. state = 1;
  258. }
  259. }
  260. else
  261. {
  262. reset_flag = 0;
  263. }
  264. }

仿真源文件及源程序百度网盘链接:https://pan.baidu.com/s/1WXV4yNoltarwZwnfIL92rQ 
提取码:42b1 
 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/387006
推荐阅读
相关标签
  

闽ICP备14008679号