找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5339|回复: 1
收起左侧

c51单片机汇编语言单片机八位抢答器程序 求指导

[复制链接]
ID:334971 发表于 2018-5-21 16:14 | 显示全部楼层 |阅读模式
单片机源程序如下:
  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,#0FH
  18. MOV TL0,#0B1H;越高发声频率越高,越尖
  19. MOV TH1,#3CH
  20. MOV TL1,#0B0H;50ms为一次溢出中断
  21. SETB EA
  22. SETB ET0
  23. SETB ET1
  24. SETB EX0
  25. SETB EX1;允许 4个中断, 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
  36. ACALL DELAY
  37. JB P3.0,NEXT;去抖动,如果“开始”按下就向下执行,否则跳到非法抢答查询 ACALL BARK;按键发声
  38. MOV A,R1
  39. MOV R6,A;送 R1->R6,因为 R1中保存了抢答时间
  40. SETB OK;抢答标志位,勇于 COUNT 程序中半段是否查询抢答
  41. MOV R7,#01H;读抢答键数据信号标志,这里表示只读一次有用信号
  42. MOV R3,#0AH;抢答只显示计时,灭号数
  43. AJMP COUNT;进入倒计时程序, “查询有效抢答的程序”在 COUNT 里面 NEXT:JNB P1.0,FALSE1
  44. JNB P1.1,FALSE2
  45. JNB P1.2,FALSE3
  46. JNB P1.3,FALSE4
  47. JNB P1.4,FALSE5
  48. JNB P1.5,FALSE6
  49. JNB P1.6,FALSE7
  50. JNB P1.7,FALSE8
  51. AJMP START
  52. ;====非法抢答处理程序 =====
  53. FALSE1:MOV R3,#01H
  54. AJMP ERROR
  55. FALSE2:MOV R3,#02H
  56. AJMP ERROR
  57. FALSE3:MOV R3,#03H
  58. AJMP ERROR
  59. FALSE4:MOV R3,#04H
  60. AJMP ERROR
  61. FALSE5:MOV R3,#05H
  62. AJMP ERROR
  63. FALSE6:MOV R3,#06H
  64. AJMP ERROR
  65. FALSE7:MOV R3,#07H
  66. AJMP ERROR
  67. FALSE8:MOV R3,#08H
  68. AJMP ERROR
  69. ;======INT0(抢答时间 R1调整程序) =====
  70. INT0SUB:MOV A,R1
  71. MOV B,#0AH
  72. DIV AB
  73. MOV R5,A
  74. MOV R4,B
  75. MOV R3,#0AH
  76. ACALL DISPLAY;现在两个时间 LED 上显示 R1
  77. JNB P3.4,INC0;P3.4为 +1S键,如按下跳到 INC0
  78. JNB P3.5,DEC0;P3.5为 -1s 键,如按下跳到 DEC0
  79. JNB P3.1,BACK0;P3.1为确定键,如按下跳到 BACK0
  80. AJMP INT0SUB
  81. INC0:MOV A,R1
  82. CJNE A,#63H,ADD0;如果不是 99, R2加 1,如果加到 99, R1就置 0,重新加起
  83. MOV R1,#00H
  84. ACALL DELAY1
  85. AJMP INT0SUB
  86. ADD0:INC R1
  87. ACALL DELAY1
  88. AJMP INT0SUB
  89. DEC0:MOV A,R1
  90. JZ SETR1;如果 R1为 0, R1就置 99 DEC R1
  91. ACALL DELAY1
  92. AJMP INT0SUB
  93. SETR1:MOV R1,#63H
  94. ACALL DELAY1
  95. AJMP INT0SUB
  96. BACK0:RETI
  97. ;=====INT1(回答时间 R2调整程序) ===== INT1SUB:MOV A,R2
  98. MOV B,#0AH
  99. DIV AB
  100. MOV R5,A
  101. MOV R4,B
  102. MOV R3,#0AH
  103. ACALL DISPLAY
  104. JNB P3.4,INC1
  105. JNB P3.5,DEC1
  106. JNB P3.1,BACK1
  107. AJMP INT1SUB
  108. INC1:MOV A,R2
  109. CJNE A,#63H,ADD1
  110. MOV R2,#00H
  111. ACALL DELAY1
  112. AJMP INT1SUB
  113. ADD1:INC R2
  114. ACALL DELAY1
  115. AJMP INT1SUB
  116. DEC1:MOV A,R2
  117. JZ SETR2
  118. DEC R2
  119. ACALL DELAY1
  120. AJMP INT1SUB
  121. SETR2:MOV R2,#63H
  122. ACALL DELAY1
  123. AJMP INT1SUB
  124. BACK1:RETI
  125. ;=====倒计时程序(抢答倒计时和回答倒计时都调到该程序) ======
  126. REPEAT:MOV A,R2;使用锦囊时重新计时
  127. MOV R6,A
  128. CLR RING
  129. COUNT:MOV R0,#00H;重置定时器中断次数
  130. MOV TH1,#3CH
  131. MOV TL1,#0B0H;重置定时器
  132. RECOUNT:MOV A,R6;R6保存了倒计时间,之前应先将抢答或答题时间给 R6
  133. MOV B,#0AH
  134. DIV AB;除十分出个位 /十位
  135. MOV 30H,A;十位存于 (30H)
  136. MOV 31H,B;个位存于 (31H)
  137. MOV R5,30H;取十位
  138. MOV R4,31H;取个位
  139. MOV A,R6
  140. SUBB A,#07H
  141. JNC LARGER;大于 5s 调到 LARGER, 小于等于 5s 会提醒
  142. MOV A,R0
  143. CJNE A,#0AH,FULL;1s中 0.5s 向下运行
  144. CLR RING
  145. AJMP CHECK
  146. FULL:CJNE A,#14H,CHECK;下面是 1s 的情况,响并显示号数并请 R0,重新计数
  147. SETB RING
  148. MOV A,R6
  149. JZ QUIT;计时完毕
  150. MOV R0,#00H
  151. DEC R6;一秒标志减 1
  152. AJMP CHECK
  153. LARGER:MOV A,R0
  154. CJNE A,#14H,CHECK;如果 1s 向下运行,否则跳到查“停 /显示”
  155. DEC R6;计时一秒 R6自动减 1
  156. MOV R0,#00H
  157. CHECK:JNB P3.1,QUIT;如按下停止键退出
  158. JNB OK,CHECKK;只在回答倒计时才有效
  159. AJMP NEXTT
  160. CHECKK:JNB P3.0,REPEAT;判断是否使用锦囊
  161. NEXTT:ACALL DISPLAY
  162. JB OK,ACOUNT; 如果是抢答倒计时,如是则查询抢答,否则跳过查询继续倒数(这 里起到锁抢答作用)
  163. AJMP RECOUNT
  164. ACOUNT:MOV A,36H
  165. JNB ACC.0,TRUE1
  166. JNB ACC.1,TRUE2
  167. JNB ACC.2,TRUE3
  168. JNB ACC.3,TRUE4
  169. JNB ACC.4,TRUE5
  170. JNB ACC.5,TRUE6
  171. JNB ACC.6,TZ1
  172. JNB ACC.7,TZ2
  173. AJMP RECOUNT
  174. TZ1:JMP TRUE7
  175. TZ2:JMP TRUE8
  176. QUIT:CLR OK;如果按下了“停止”执行的程序
  177. CLR RING
  178. AJMP START
  179. ;=====正常抢答处理程序 =======
  180. TRUE1:ACALL BARK
  181. MOV A,R2
  182. MOV R6,A;抢答时间 R2送 R6
  183. MOV R3,#01H
  184. CLR OK;因为答题的计时不在查询抢答,所以就锁了抢答 AJMP COUNT
  185. TRUE2:ACALL BARK
  186. MOV A,R2
  187. MOV R6,A
  188. MOV R3,#02H
  189. CLR OK
  190. AJMP COUNT
  191. TRUE3:ACALL BARK
  192. MOV A,R2
  193. MOV R6,A
  194. MOV R3,#03H
  195. CLR OK
  196. AJMP COUNT
  197. TRUE4:ACALL BARK
  198. MOV A,R2
  199. MOV R6,A
  200. MOV R3,#04H
  201. CLR OK
  202. AJMP COUNT
  203. TRUE5:ACALL BARK
  204. MOV A,R2
  205. MOV R6,A
  206. MOV R3,#05H
  207. CLR OK
  208. AJMP COUNT
  209. TRUE6:ACALL BARK
  210. MOV A,R2
  211. MOV R6,A
  212. MOV R3,#06H
  213. CLR OK
  214. AJMP COUNT
  215. TRUE7:ACALL BARK
  216. MOV A,R2
  217. MOV R6,A
  218. MOV R3,#07H
  219. CLR OK
  220. AJMP COUNT
  221. TRUE8:ACALL BARK
  222. MOV A,R2
  223. MOV R6,A
  224. MOV R3,#08H
  225. CLR OK
  226. AJMP COUNT
  227. ;=====犯规抢答程序 =========
  228. ERROR:MOV R0,#00H
  229. MOV TH1,#3CH
  230. MOV TL1,#0B0H
  231. MOV 34H,R3;犯规号数暂存与(34H)
  232. HERE:MOV A,R0
  233. CJNE A,#06H,FLASH;0.3s向下运行 ->灭并停响
  234. CLR RING
  235. MOV R3,#0AH
  236. MOV R4,#0AH
  237. MOV R5,#0AH;三灯全灭
  238. AJMP CHECK1
  239. FLASH:CJNE A,#0CH,CHECK1;下面是 0.8s 的情况,响并显示号数并清 R0,重新计 SETB RING
  240. MOV R0,#00H
  241. MOV R3,34H;取回号数
  242. MOV R5,#0BH
  243. MOV R4,#0BH;显示 FF 和号数
  244. AJMP CHECK1
  245. CHECK1:JNB P3.1,QUIT
  246. ACALL DISPLAY
  247. AJMP HERE
  248. QUIT1:CLR RING
  249. CLR OK
  250. AJMP START
  251. ;=====显示程序 =====
  252. DISPLAY:MOV DPTR,#DAT1; 查表显示程序, 利用 P0口做段选码输出 /P2低三位做位选吗输 出
  253. MOV A,R3
  254. MOVC A,@A+DPTR
  255. MOV P2,#0FEH
  256. MOV P0,A
  257. ACALL DELAY2
  258. MOV DPTR,#DAT2
  259. MOV A,R5
  260. MOVC A,@A+DPTR
  261. MOV P2,#0FDH
  262. MOV P0,A
  263. ACALL DELAY2
  264. MOV A,R4
  265. MOVC A,@A+DPTR
  266. MOV P2,#0FBH
  267. MOV P0,A
  268. ACALL DELAY2
  269. RET
  270. DA T1:DB 00H,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,00H,71H;灭、 1、 2、 3、 4、 5、 6、 7、 8、 9、灭、 F
  271. DA T2:DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,00H,71H;0、 1、 2、 3、 4、 5、 6、 7、 8、 9、灭、 F
  272. ;======加减时间延时(起到不会按下就加 N 个数) =====
  273. DELAY1:MOV 35H,#08H
  274. LOOP0:ACALL DISPLAY
  275. DJNZ 35H,LOOP0
  276. RET
  277. ;======延时 4236个机器周期(去抖动用到) =====
  278. DELAY:MOV 32H,#12H
  279. LOOP:MOV 33H,#0AFH
  280. LOOP1:DJNZ 33H,LOOP1
  281. DJNZ 32H,LOOP
  282. RET
  283. ;======延时 4236个机器周期(显示用到) =======
  284. DELAY2:MOV 32H,#43H
  285. LOOP3:MOV 33H,#1EH
  286. MOV A,R7;每隔 60~70个机器周期读一次 P1口,全为 1时为无效数据,继续读,有 一个不为 1时,转到正常强大处理
  287. JNZ AAAA1;没读到有效数据时继续转到 AAAA1
  288. LOOP2:DJNZ 33H,LOOP2
  289. DJNZ 32H,LOOP3
  290. RET
  291. ;=======读抢答按键数据口程序 ========
  292. ; 由于在度抢答数据口的时候,单片机首先进入倒计时程序,再调用显示程序,最后哎检测 安检口
  293. ; 然而在检测安检口时动态扫描要调用三次(4MS )延时程序。这样就会导致读数据口出现 滞后,造成 1号优先最高, 8号最低
  294. ; 故采用在延时子程序中加了读数据口程序,保证了灵敏度和可靠性
  295. AAAA1:MOV A,P1
  296. CJNE A,#0FFH,AA1; 当不全为 1时的数据为有效数据
  297. AA0:MOV 36H,A;将有效数据送到 36H 暂存
  298. AJMP LOOP2
  299. AA1:DEC R7
  300. AJMP AA0
  301. ;=====发声程序 ======
  302. BARK:SETB RING
  303. ACALL DELAY1
  304. ACALL DELAY1
  305. CLR RING;按键发声
  306. RET
  307. ;=====T0溢出中断(响铃程序) ======
  308. T0INT:MOV TH0,#0ECH
  309. MOV TL0,#0FFH
  310. JNB RING,OUT
  311. CPL P3.6;RING标志位为 1时 P3.6口不短取反使喇叭发出一定频率的声音 OUT:RETI
  312. ;=====T1溢出中断(计时程序) ======
  313. T1INT:MOV TH1,#3CH
  314. MOV TL1,#0B0H
  315. INC R0
  316. RETI
  317. END
复制代码

回复

使用道具 举报

ID:760763 发表于 2021-6-23 09:09 | 显示全部楼层
编译有错误
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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