找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机课程设计抢答器word 含汇编语言源程序,仿真

  [复制链接]
跳转到指定楼层
楼主
抢答器。内含源文件,仿真,课程设计word,程序软件为keil,欢迎分享

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


单片机汇编语言源程序如下:
  1. OK EQU 20H;抢答开始标志位
  2. RING EQU 22H;响铃标志位
  3. ORG 0000H
  4. AJMP MAIN
  5. ORG 0003H
  6. AJMP INT0SUB
  7. ORG 000BH
  8. AJMP T0INT
  9. ORG 0013H
  10. AJMP INT1SUB
  11. ORG 001BH
  12. AJMP T1INT
  13. ORG 0040H
  14. MAIN: MOV R1,#30;初设抢答时间为30s
  15. MOV R2,#60;初设答题时间为60s
  16. MOV TMOD,#11H;设置未定时器/模式1
  17. MOV TH0,#0F0H
  18. MOV TL0,#0FFH;越高发声频率越高,越尖
  19. MOV TH1,#3CH
  20. MOV TL1,#0B0H;50ms为一次溢出中断
  21. SETB EA
  22. SETB ET0
  23. SETB ET1
  24. SETB EX0
  25. SETB EX1;允许四个中断,T0/T1/INT0/INT1
  26. CLR OK
  27. CLR RING
  28. SETB TR1
  29. SETB TR0;一开始就运行定时器,以开始显示FFF.如果想重新计数,重置TH1/TL1就可以了
  30. ;=====查询程序=====
  31. START: MOV R5,#0BH
  32. MOV R4,#0BH
  33. MOV R3,#0BH
  34. ACALL DISPLAY;未开始抢答时候显示FFF
  35. JB P3.0,NEXT;ddddddd
  36. ACALL DELAY
  37. JB P3.0,NEXT;去抖动,如果"开始键"按下就向下执行,否者跳到非法抢答查询
  38. ACALL BARK;按键发声
  39. MOV A,R1
  40. MOV R6,A;送R1->R6,因为R1中保存了抢答时间
  41. SETB OK;抢答标志位,用于COUNT只程序中判断是否查询抢答
  42. MOV R7,#01H ;读抢答键数据信号标志,这里表示只读一次有用信号
  43. MOV R3,#0AH;抢答只显示计时,灭号数
  44. AJMP COUNT;进入倒计时程序,"查询有效抢答的程序"在COUNT里面
  45. NEXT: JNB P1.0,FALSE1
  46. JNB P1.1,FALSE2
  47. JNB P1.2,FALSE3
  48. JNB P1.3,FALSE4
  49. JNB P1.4,FALSE5
  50. JNB P1.5,FALSE6
  51. JNB P1.6,FALSE7
  52. JNB P1.7,FALSE8
  53. AJMP START
  54. ;=====非法抢答处理程序=====
  55. FALSE1: MOV R3,#01H
  56. AJMP ERROR
  57. FALSE2: MOV R3,#02H
  58. AJMP ERROR
  59. FALSE3: MOV R3,#03H
  60. AJMP ERROR
  61. FALSE4: MOV R3,#04H
  62. AJMP ERROR
  63. FALSE5: MOV R3,#05H
  64. AJMP ERROR
  65. FALSE6: MOV R3,#06H
  66. AJMP ERROR
  67. FALSE7: MOV R3,#07H
  68. AJMP ERROR
  69. FALSE8: MOV R3,#08H
  70. AJMP ERROR

  71. ;=====INT0(抢答时间R1调整程序)=====
  72. INT0SUB:MOV A,R1
  73. MOV B,#0AH
  74. DIV AB
  75. MOV R5,A
  76. MOV R4,B
  77. MOV R3,#0AH
  78. ACALL DISPLAY;先在两个时间LED上显示R1
  79. JNB P3.4,INC0;P3.4为+1s键,如按下跳到INCO
  80. JNB P3.5,DEC0;P3.5为-1s键,如按下跳到DECO
  81. JNB P3.1,BACK0;P3.1为确定键,如按下跳到BACKO
  82. AJMP INT0SUB
  83. INC0: MOV A,R1
  84. CJNE A,#63H,ADD0;如果不是99,R2加1,如果加到99,R1就置0,重新加起。
  85. MOV R1,#00H
  86. ACALL DELAY1
  87. AJMP INT0SUB
  88. ADD0: INC R1
  89. ACALL DELAY1
  90. AJMP INT0SUB
  91. DEC0: MOV A,R1
  92. JZ SETR1;如果R1为0, R1就置99,
  93. DEC R1
  94. ACALL DELAY1
  95. AJMP INT0SUB
  96. SETR1: MOV R1,#63H
  97. ACALL DELAY1
  98. AJMP INT0SUB
  99. BACK0: RETI
  100. ;=====INT1(回答时间R2调整程序)=====
  101. INT1SUB:MOV A,R2
  102. MOV B,#0AH
  103. DIV AB
  104. MOV R5,A
  105. MOV R4,B
  106. MOV R3,#0AH
  107. ACALL DISPLAY
  108. JNB P3.4,INC1
  109. JNB P3.5,DEC1
  110. JNB P3.1,BACK1
  111. AJMP INT1SUB
  112. INC1: MOV A,R2
  113. CJNE A,#63H,ADD1
  114. MOV R2,#00H
  115. ACALL DELAY1
  116. AJMP INT1SUB
  117. ADD1: INC R2
  118. ACALL DELAY1
  119. AJMP INT1SUB
  120. DEC1: MOV A,R2
  121. JZ SETR2
  122. DEC R2
  123. ACALL DELAY1
  124. AJMP INT1SUB
  125. SETR2: MOV R2,#63H
  126. ACALL DELAY1
  127. AJMP INT1SUB
  128. BACK1: RETI
  129. ;=====倒计时程序(抢答倒计时和回答倒计时都跳到改程序)=====
  130. REPEAT:MOV A,R2 ;使用锦囊时重新计时
  131. MOV R6,A
  132. CLR RING
  133. COUNT: MOV R0,#00H;重置定时器中断次数
  134. MOV TH1,#3CH
  135. MOV TL1,#0B0H;重置定时器
  136. RECOUNT:MOV A,R6;R6保存了倒计时的时间,之前先将抢答时间或回答时间给R6
  137. MOV B,#0AH
  138. DIV AB;除十分出个位/十位
  139. MOV 30H,A;十位存于(30H)
  140. MOV 31H,B;个位存于(31H)
  141. MOV R5,30H;取十位
  142. MOV R4,31H;取个位
  143. MOV A,R6
  144. SUBB A,#07H
  145. JNC LARGER;大于5s跳到LARGER,小于等于5s会提醒
  146. MOV A,R0
  147. CJNE A,#0AH,FULL;1s中0.5s向下运行
  148. CLR RING
  149. AJMP CHECK
  150. FULL: CJNE A,#14H,CHECK;下面是1s的情况,响并显示号数并清R0,重新计
  151. SETB RING
  152. MOV A,R6
  153. JZ QUIT;计时完毕
  154. MOV R0,#00H
  155. DEC R6;一秒标志减1
  156. AJMP CHECK
  157. LARGER: MOV A,R0
  158. CJNE A,#14H,CHECK;如果1s向下运行,否者跳到查"停/显示"
  159. DEC R6;计时一秒R6自动减1
  160. MOV R0,#00H
  161. CHECK: JNB P3.1,QUIT;如按下停止键退出
  162. JNB OK,CHECKK ;只在回答倒计时才有效
  163. AJMP NEXTT
  164. CHECKK:JNB P3.0,REPEAT ;判断是否使用锦囊
  165. NEXTT: ACALL DISPLAY
  166. JB OK,ACCOUT;如果是抢答倒计时,如是则查询抢答,否者跳过查询继续倒数(这里起到锁抢答作用)
  167. AJMP RECOUNT
  168. ACCOUT:
  169. MOV A,36H
  170. JNB ACC.0,TRUE1
  171. JNB ACC.1,TRUE2
  172. JNB ACC.2,TRUE3
  173. JNB ACC.3,TRUE4
  174. JNB ACC.4,TRUE5
  175. JNB ACC.5,TRUE6
  176. JNB ACC.6,TZ1
  177. JNB ACC.7,TZ2
  178. AJMP RECOUNT
  179. TZ1:JMP TRUE7
  180. TZ2:JMP TRUE8
  181. QUIT: CLR OK;如果按下了"停止键"执行的程序
  182. CLR RING
  183. AJMP START
  184. ;=====正常抢答处理程序=====
  185. TRUE1: ACALL BARK
  186. MOV A,R2
  187. MOV R6,A;抢答时间R2送R6
  188. MOV R3,#01H
  189. CLR OK;因为答题的计时不再查询抢答,所以就锁了抢答
  190. AJMP COUNT
  191. TRUE2:ACALL BARK
  192. MOV A,R2
  193. MOV R6,A
  194. MOV R3,#02H
  195. CLR OK
  196. AJMP COUNT
  197. TRUE3:ACALL BARK
  198. MOV A,R2
  199. MOV R6,A
  200. MOV R3,#03H
  201. CLR OK
  202. AJMP COUNT
  203. TRUE4:ACALL BARK
  204. MOV A,R2
  205. MOV R6,A
  206. MOV R3,#04H
  207. CLR OK
  208. AJMP COUNT
  209. TRUE5:ACALL BARK
  210. MOV A,R2
  211. MOV R6,A
  212. MOV R3,#05H
  213. CLR OK
  214. AJMP COUNT
  215. TRUE6: ACALL BARK
  216. MOV A,R2
  217. MOV R6,A
  218. MOV R3,#06H
  219. CLR OK
  220. AJMP COUNT
  221. TRUE7:ACALL BARK
  222. MOV A,R2
  223. MOV R6,A
  224. MOV R3,#07H
  225. CLR OK
  226. AJMP COUNT
  227. TRUE8:ACALL BARK
  228. MOV A,R2
  229. MOV R6,A
  230. MOV R3,#08H
  231. CLR OK
  232. AJMP COUNT
  233. ;=====犯规抢答程序=====
  234. ERROR: MOV R0,#00H
  235. MOV TH1,#3CH
  236. MOV TL1,#0B0H
  237. MOV 34H,R3;犯规号数暂存与(34H)
  238. HERE: MOV A,R0
  239. CJNE A,#06H,FLASH;0.3s向下运行->灭并停响
  240. CLR RING
  241. MOV R3,#0AH
  242. MOV R4,#0AH
  243. MOV R5,#0AH;三灯全灭
  244. AJMP CHECK1
  245. FLASH: CJNE A,#0CH,CHECK1;下面是0.8s的情况,响并显示号数并清R0,重新计
  246. SETB RING
  247. MOV R0,#00H
  248. MOV R3,34H;取回号数
  249. MOV R5,#0BH
  250. MOV R4,#0BH;显示FF和号数
  251. AJMP CHECK1
  252. CHECK1: JNB P3.1,QUIT1
  253. ACALL DISPLAY
  254. AJMP HERE
  255. QUIT1: CLR RING
  256. CLR OK
  257. AJMP START
  258. ;=====显示程序=====
  259. DISPLAY:MOV DPTR,#DAT1;查表显示程序,利用P0口做段选码口输出/P2低三位做位选码输出,
  260. MOV A,R3
  261. MOVC A,@A+DPTR
  262. MOV P2,#0feH
  263. MOV P0,A
  264. ACALL DELAY2
  265. MOV DPTR,#DAT2
  266. MOV A,R5
  267. MOVC A,@A+DPTR
  268. MOV P2,#0fdH
  269. MOV P0,A
  270. ACALL DELAY2
  271. MOV A,R4
  272. MOVC A,@A+DPTR
  273. MOV P2,#0fbH
  274. MOV P0,A
  275. ACALL DELAY2
  276. RET
  277. DAT1:DB 00h,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh,00H,71H
  278. ;"灭","1","2","3","4","5","6","7","8","9","灭","F"
  279. DAT2:DB 3fh,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh,00H,71H
  280. ;第一个为零,其他与上相同,因为十位如果为零显示熄灭
  281. ;====加减时间延时(起到不会按下就加N个数)======
  282. DELAY1: MOV 35H,#08H
  283. LOOP0: ACALL DISPLAY
  284. DJNZ 35H,LOOP0
  285. RET
  286. ;=====延时4236个机器周期(去抖动用到)=====
  287. DELAY: MOV 32H,#12H
  288. LOOP: MOV 33H,#0AFH
  289. LOOP1: DJNZ 33H,LOOP1
  290. DJNZ 32H,LOOP
  291. RET
  292. ;=====延时4236个机器周期(显示用到)=====
  293. DELAY2: MOV 32H,#43H
  294. ……………………

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

所有资料51hei提供下载:
抢答器.zip (43.83 KB, 下载次数: 136)

单片机课程设计2.rar (719.13 KB, 下载次数: 144)


评分

参与人数 1黑币 +6 收起 理由
吉玉的呆车 + 6 很给力!

查看全部评分

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

使用道具 举报

沙发
ID:1 发表于 2017-6-4 17:23 | 只看该作者
好资料,51黑有你更精彩!!!
回复

使用道具 举报

板凳
ID:486665 发表于 2019-3-8 09:10 来自手机 | 只看该作者
单片机抢答器
回复

使用道具 举报

地板
ID:563992 发表于 2019-6-16 22:10 | 只看该作者
单片机抢答器
回复

使用道具 举报

5#
ID:567859 发表于 2019-6-20 20:56 | 只看该作者
发生关键仿真错误怎么回事
回复

使用道具 举报

6#
ID:870579 发表于 2020-12-29 21:15 | 只看该作者
好资料,51黑有你更精彩!!!
回复

使用道具 举报

7#
ID:876573 发表于 2021-5-11 21:59 | 只看该作者
2个地方有bug:
1、抢答时间调整:按下加1s按键或者减1s按键基本都是加2秒或者减2秒,有时候加5秒或者减3秒的情况
2、答题时间调整模块:问题同上即时间+和时间-是不稳定的,希望楼主能不能指点一下是什么原因?谢谢
回复

使用道具 举报

8#
ID:876573 发表于 2021-5-11 22:01 | 只看该作者
2个地方有bug:
1:答题时间:按下时间+或者时间-按键基本都是加2秒或者减2秒,甚至是突然加5秒或者减3秒的情况,很不稳定;
2、抢答时间调整:问题同上

希望楼主帮忙分析一下是什么原因以及如何解决,谢谢!!
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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