找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2395|回复: 0
收起左侧

基于单片机汇编语言和proteus的最新抢答器设计

[复制链接]
ID:342991 发表于 2018-6-2 18:10 | 显示全部楼层 |阅读模式
毕业设计做的项目,用proteus和keil软件做的抢答器,下面是仿真原理图:
11.png 0.png

单片机汇编语言源程序如下:
  1. SO BIT 2FH.0               ;发声标志
  2. RESET EQU P2.0             ;抢答复位与设定时间
  3. STA EQU P2.1               ;抢答开始
  4. TTIME EQU 10H            ;暂存时间16进制
  5. TIME EQU 15H                 ;时间10进制
  6. PL EQU 12H                 ;抢答到的人
  7. TEAM EQU 39H                ;抢答到的人所在组
  8.                            ;LCD n的程序为显示子程序
  9.                            ;F0为时间是否已到与
  10. KEY0 EQU P3.3
  11. KEY1 EQU P3.4
  12. FLAGT EQU 2FH.1            ;是否进HOLDON循环标志
  13. ANS EQU  P2.2              ;回答按键
  14. FLAG0 EQU 2FH.2            ;选手编号跳出循环标志
  15. WRO EQU P2.6               ;抢答正确与否
  16. RIG EQU P2.7               
  17. ORG 0000H
  18. LJMP MAIN
  19. ORG 000BH
  20. LJMP T00
  21. ORG 001BH
  22. LJMP T11
  23. ;******************************************************************************************************
  24. ;初始设置
  25. MAIN:
  26. MOV SP,#50H
  27. MOV 18H,#0FFH
  28. MOV TMOD,#11H
  29. MOV TH0,#3CH
  30. MOV TL0,#0B0H
  31. MOV TH1,#0FCH
  32. MOV TL1,#18H
  33. SETB EA
  34. SETB ET0
  35. SETB ET1
  36. SETB TR1
  37. CLR F0
  38. CLR SO
  39. CLR KEY0               ;矩阵式键盘初始化
  40. SETB KEY1



  41. ;******************************************************************************************************
  42. ;复位位置
  43. INI:
  44. CLR SO                   ;停止发声
  45. CLR FLAGT
  46. CLR FLAG0
  47. CLR TR0
  48. MOV TTIME,#30            ;设置30S计时时间
  49. MOV PL,#00
  50. MOV A,TTIME             ;计时时间10进制        
  51. MOV B,#10
  52. DIV AB
  53. SWAP A
  54. ADD A,B
  55. MOV TIME,A             ;TIME计时时间10进制   
  56. MOV 11H,#20            ;设置11H计时中间点1秒
  57. LCALL Init_M7219 ;数码管等器件初始显示
  58. LCALL LCD2            ;显示ready
  59. LCALL DELAYX

  60. ;******************************************************************************************************
  61. ;判断开关是否按下
  62. ST0:
  63. LCALL DISPLAY
  64. JB RESET,ST1          ;判断是否需要调整时间
  65. JNB SO,NEXT1
  66. JNB RESET,INI              ;作弊复位
  67. NEXT1:
  68. LCALL DELAYX
  69. INC TTIME             ;这里设置为加1调整,
  70. MOV A,TTIME            
  71. MOV B,#10
  72. DIV AB
  73. SWAP A
  74. ADD A,B
  75. MOV TIME,A             ;显示时间进制转换
  76. MOV A,TTIME            
  77. CLR C
  78. CJNE A,#31,ST1         ;最高允许30s,也是默认值
  79. MOV TTIME,#01H
  80. MOV TIME,#01H          ;超出30s重置为1s开始

  81. ;******************************************************************************************************
  82. ;判断是否有人作弊
  83. ST1:
  84. LCALL MAT
  85. MOV A,P1
  86. CPL A
  87. MOV B,A
  88. JZ NEXT
  89. MOV CHEATER,#00H;      
  90. DEAL0:                  ;将P0口读到的数据转换至对应作弊选手编号(移位)
  91. CLR C                   ;移位前准备
  92. RRC A
  93. CLR C
  94. INC CHEATER             ;移位计数,获得作弊选手号
  95. JNZ DEAL0
  96. MOV A,CHEATER
  97. MOV A,#00H
  98. ADD A,TEAM
  99. ADD A,CHEATER               ;得到编号
  100. MOV B,#10
  101. DIV AB
  102. MOV TEAM,A
  103. MOV CHEATER,B
  104. SETB SO                    ;发声报警
  105. LCALL LCD1
  106. NEXT:
  107. JB STA,ST0                   ;没有开关按下,返回判断是否修正时间,否则执行抢答
  108. LCALL LCD3
  109. SETB F0                     ;循环标志,后续用于跳出循环,时间到可使之置0        
  110. SETB TR0                    ;启动定时
  111. LCALL DELAYSO                 ;短暂发声

  112. ;******************************************************************************************************
  113. ;关键循环,用于判断是否有按下
  114. START:
  115. JNB F0,HOLDON               ;时间是否已到
  116. LCALL MAT                   ;矩阵式键盘子程序
  117. MOV A,P1
  118. XRL A,#0FFH
  119. JNZ HOLDON
  120. LJMP START


  121. ;******************************************************************************************************
  122. ;时间到或者有人抢答,转入此循环等待
  123. HOLDON:
  124. MOV 17H,A              ;A数据暂存
  125. CLR TR0                ;有人抢答停止计时
  126. H1:
  127. JB F0,H2
  128. LCALL LCD4              ;LCD显示结束
  129. H2:
  130. JNB F0,HOLD
  131. LCALL LCD5              ;LCD显示抢答成功
  132. HOLD:
  133. MOV A,17H                ;数据恢复
  134. JZ CONTINUE              ;用于下面移位转换循环的执行条件
  135. MOV PL,#00H;
  136. SETB FLAGT               ;有人抢答才置1
  137. DEAL:                    ;转换
  138. CLR C
  139. RRC A
  140. CLR C                   ;移位转换
  141. INC PL
  142. JNZ DEAL
  143. CONTINUE:
  144. JB FLAG0,KO
  145. ADD A,TEAM
  146. ADD A,PL               ;得到编号
  147. MOV B,#10
  148. DIV AB
  149. MOV TEAM,A
  150. MOV PL,B
  151. SETB FLAG0
  152. MOV 17H,#00H
  153. SJMP KO
  154. ST00:
  155. LJMP INI
  156. KO:
  157. JNB FLAGT,$+6
  158. JNB ANS,ANSWER               ;回答倒计时
  159. JNB RESET,ST00              ;按下复位键后回到起始状态,但由于此处转移字节已超过128B,所以迂回使用了LJMP
  160. SETB SO
  161. LCALL DISPLAY
  162. AJMP HOLD                   ;否则维持状态


  163. ;******************************************************************************************************
  164. ;回答倒计时
  165. ANSWER:
  166. CLR SO                    ;停止报警
  167. MOV TTIME,#31             ;默认回答倒计时30S
  168. SETB TR0
  169. LCALL LCD6                ;LCD显示
  170. L1:
  171. JNB TR0,L3                 ;封锁
  172. JB WRO,L2                 ;回答正确与否
  173. LCALL LCD7
  174. CLR TR0
  175. L2:
  176. JB RIG,L1
  177. LCALL LCD8
  178. CLR TR0
  179. L3:
  180. JB RESET,$
  181. LJMP INI

  182. ;******************************************************************************************************
  183. ;矩阵式键盘子程序
  184. MAT:                     
  185. CPL KEY0
  186. CPL KEY1
  187. JB KEY0,ELSE0
  188. MOV TEAM,#00H
  189. RET
  190. ELSE0:
  191. MOV TEAM,#08H
  192. RET


  193. ;******************************************************************************************************
  194. ;MAX7219显示程序
  195. M7219_CLK BIT P3.2
  196. M7219_DIN BIT P3.0
  197. M7219_LOAD BIT P3.1
  198. LED_BUF   EQU 50H
  199. SET_MODEL EQU 0FFH
  200. SET_BRIGHT EQU 04H
  201. SET_LIMIT EQU 03H
  202. SET_NORMAL EQU 01H
  203. SET_START EQU 01H

  204. DISPLAY:
  205. MOV A,#00H
  206. JNB FLAGT,GVA0;是否抢答
  207. MOV A,PL  
  208. GVA0:
  209. MOV B,A;TTIME送端口   
  210. MOV A,#01H
  211. LCALL w_7219;放入MAX7290子程序
  212. JB FLAGT,GVA
  213. MOV A,#00H
  214. SJMP GVA2
  215. GVA:
  216. MOV A,TEAM
  217. GVA2:
  218. MOV B,A   
  219. MOV A,#02H
  220. LCALL w_7219
  221. MOV A,TIME
  222. ANL A,#0FH
  223. MOV B,A
  224. MOV A,#03H
  225. LCALL w_7219
  226. MOV A,TIME
  227. SWAP A
  228. ANL A,#0FH
  229. MOV B,A
  230. MOV A,#04H
  231. LCALL w_7219
  232. LCALL DELAY
  233. RET


  234. INIT_M7219:  ;初始化MAX7219
  235. MOV A,#0BH  
  236. MOV B,#SET_LIMIT
  237. LCALL W_7219
  238. MOV A,#09H
  239. MOV B,#SET_MODEL
  240. LCALL W_7219
  241. MOV A,#0AH  ;设置亮度
  242. MOV B,#SET_BRIGHT ;15/32亮度
  243. LCALL W_7219
  244. MOV A,#0FH  
  245. MOV B,#SET_NORMAL
  246. LCALL W_7219
  247. MOV A,#0CH  
  248. MOV B,#SET_START
  249. LCALL  W_7219
  250. RET

  251. DISP:
  252. MOV R0,#LED_BUF
  253. MOV R4,#01H
  254. MOV R3,#SET_LIMIT
  255. DISP1:
  256. MOV A,@R0
  257. MOV B,A
  258. MOV A,R4
  259. LCALL W_7219
  260. INC R0
  261. INC R4
  262. DJNZ R3,DISP1
  263. RET

  264. W_7219:
  265. CLR M7219_CLK
  266. CLR M7219_DIN
  267. CLR  M7219_LOAD ;置LOAD=0
  268. LCALL  SD_7219  ;传送7219的地址
  269. MOV A,B
  270. LCALL SD_7219  ;传送数据
  271. SETB M7219_LOAD  ;数据装载
  272. CLR M7219_DIN
  273. RET

  274. SD_7219:   ;向7219送地址与数据
  275. MOV R2,#08H  
  276. C_SD: CLR C
  277. CLR M7219_CLK
  278. RLC A
  279. MOV M7219_DIN,C ;准备数据
  280. NOP
  281. SETB M7219_CLK ;上升沿将数据传入
  282. NOP
  283. NOP
  284. CLR M7219_CLK
  285. DJNZ R2,C_SD
  286. RET







  287. ;******************************************************************************************************
  288. ;LCD显示程序
  289. RS EQU P2.3
  290. RW EQU P2.4
  291. E EQU P2.5
  292. LCD EQU P0
  293. BF EQU P0.7
  294. CHEATER EQU 36H

  295. ;LCD显示区                      (LCD显示内容)
  296. LCD1:
  297. LCALL LCDINI
  298. MOV A,#84H
  299. LCALL W_CMD
  300. MOV DPTR,#TAB
  301. MOV R7,#0                      ;CHEAT
  302. LP1:
  303. MOV        A,R7
  304. MOVC A,@A+DPTR
  305. LCALL W_DATA
  306. INC R7
  307. CJNE R7,#06,LP1
  308. MOV A,#32;空格
  309. LCALL W_DATA
  310. MOV A,#30H
  311. ADD A,TEAM
  312. LCALL W_DATA
  313. MOV A,#30H
  314. ADD A,CHEATER
  315. LCALL W_DATA
  316. MOV A,#0C6H
  317. ACALL W_CMD
  318. LP2:
  319. MOV A,R7
  320. MOVC A,@A+DPTR
  321. LCALL W_DATA
  322. INC R7
  323. CJNE R7,#11,LP2
  324. RET

  325. LCD2:
  326. LCALL LCDINI
  327. MOV A,#85H
  328. LCALL W_CMD
  329. MOV DPTR,#READY
  330. MOV R7,#0                      ;READY
  331. LP11:
  332. MOV        A,R7
  333. MOVC A,@A+DPTR
  334. LCALL W_DATA
  335. INC R7
  336. CJNE R7,#5,LP11
  337. RET

  338. LCD3:
  339. LCALL LCDINI
  340. MOV A,#84H
  341. LCALL W_CMD
  342. MOV DPTR,#REACING
  343. MOV R7,#0                      ;REACING
  344. LP111:
  345. MOV        A,R7
  346. MOVC A,@A+DPTR
  347. LCALL W_DATA
  348. INC R7
  349. CJNE R7,#7,LP111
  350. RET

  351. LCD4:
  352. LCALL LCDINI
  353. MOV A,#86H
  354. LCALL W_CMD
  355. MOV DPTR,#OVER
  356. MOV R7,#0                      ;OVER
  357. LP1111:
  358. MOV        A,R7
  359. MOVC A,@A+DPTR
  360. LCALL W_DATA
  361. INC R7
  362. CJNE R7,#4,LP1111
  363. RET

  364. LCD5:
  365. LCALL LCDINI
  366. MOV A,#86H
  367. LCALL W_CMD
  368. MOV DPTR,#DONE
  369. MOV R7,#0                      ;DONE
  370. LP11111:
  371. MOV        A,R7
  372. MOVC A,@A+DPTR
  373. LCALL W_DATA
  374. INC R7
  375. CJNE R7,#4,LP11111
  376. RET

  377. LCD6:
  378. LCALL LCDINI
  379. MOV A,#83H
  380. LCALL W_CMD
  381. MOV DPTR,#ANSWERING
  382. MOV R7,#0                      ;ANSWERING
  383. LP111111:
  384. MOV        A,R7
  385. MOVC A,@A+DPTR
  386. LCALL W_DATA
  387. INC R7
  388. CJNE R7,#9,LP111111
  389. RET

  390. LCD7:
  391. LCALL LCDINI
  392. MOV A,#85H
  393. LCALL W_CMD
  394. MOV DPTR,#RIGHT
  395. MOV R7,#0                      ;RIGHT
  396. LP1111111:
  397. MOV        A,R7
  398. MOVC A,@A+DPTR
  399. LCALL W_DATA
  400. INC R7
  401. CJNE R7,#5,LP1111111
  402. RET

  403. LCD8:
  404. LCALL LCDINI
  405. MOV A,#85H
  406. LCALL W_CMD
  407. MOV DPTR,#WRONG
  408. MOV R7,#0                      ;WRONG
  409. LP111111111:
  410. MOV        A,R7
  411. MOVC A,@A+DPTR
  412. LCALL W_DATA
  413. INC R7
  414. CJNE R7,#5,LP111111111
  415. RET

  416. ;LCD初始化
  417. LCDINI:
  418. MOV A,#38H
  419. LCALL W_CMD
  420. MOV A,#0CH
  421. LCALL W_CMD
  422. MOV A,#06H
  423. LCALL W_CMD
  424. MOV A,#01H
  425. LCALL W_CMD
  426. RET

  427. W_CMD:
  428. ACALL WAIT
  429. CLR RS
  430. CLR RW
  431. MOV LCD,A
  432. SETB E
  433. CLR E
  434. RET
  435. W_DATA:
  436. ACALL WAIT
  437. SETB RS
  438. CLR RW
  439. MOV LCD,A
  440. SETB E
  441. CLR E
  442. RET
  443. WAIT:
  444. MOV R6,#20
  445. W1:
  446. MOV R5,#250
  447. DJNZ R5,$
  448. DJNZ R6,W1
  449. RET


  450. ;******************************************************************************************************
  451. ;延迟1
  452. DELAY:                   ;延迟用于MAX7219,7219在循环中写入不能过快
  453. MOV R7,#02H
  454. DELAY0:
  455. MOV R6,#0AH
  456. DELAY1:
  457. MOV R5,#0AH
  458. DELAY2:
  459. DJNZ R5,DELAY2
  460. DJNZ R6,DELAY1
  461. DJNZ R7,DELAY0
  462. RET
  463. ;延迟2
  464. DELAYX:                ;RESET键软件防抖动,以及长按设置时间时的时间轮转速度
  465. LCALL DELAY
  466. LCALL DELAY
  467. LCALL DELAY
  468. LCALL DELAY
  469. DJNZ 18H,DELAYX
  470. RET
  471. ;延迟3
  472. DELAYSO:                   ;开始开关按下短时发声延时
  473. SETB SO
  474. ACALL DELAYX
  475. CLR SO
  476. RET



  477. ;******************************************************************************************************
  478. ;中断
  479. ;定时器T0中断
  480. T00:                        ;定时器t0中断
  481. MOV TH0,#3CH
  482. MOV TL0,#0B0H                ;50ms定时
  483. DJNZ 11H,RETI1
  484. MOV 11H,#20                 ;1s定时
  485. MOV A,TTIME
  486. DEC A           
  487. MOV B,#10
  488. DIV AB
  489. SWAP A
  490. ADD A,B
  491. MOV TIME,A                ;定时进制转换16转10   
  492. LCALL DISPLAY
  493. DJNZ TTIME,RETI1
  494. CLR TR0                   ;自停止
  495. CLR F0                    ;时间到无人抢答清零F0跳出检测循环
  496. SETB SO                   ;发声
  497. RETI1:
  498. RETI
  499. ;定时器1中断,频率1KHZ,用于喇叭发声
  500. T11:                     
  501. MOV TH1,#0FCH            
  502. MOV TL1,#18H
  503. JNB SO, RETT11            ;判断发声标志位SO
  504. CPL P3.7
  505. RETT11:
  506. RETI


  507. ;******************************************************************************************************
  508. ;LCD显示表
  509. TAB:                  
  510. DB 'PLAYER'
  511. DB 'CHEAT'
  512. READY:
  513. DB 'READY'
  514. REACING:
  515. DB 'REACING'
  516. OVER:
  517. DB 'OVER'
  518. DONE:
  519. DB 'DONE'
  520. ANSWERING:
  521. DB 'ANSWERING'
  522. RIGHT:
  523. DB 'RIGHT'
  524. WRONG:
  525. DB 'WRONG'
  526. END
复制代码

所有资料51hei提供下载:
程序及仿真.rar (36.86 KB, 下载次数: 25)
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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