找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 8897|回復(fù): 7
打印 上一主題 下一主題
收起左側(cè)

單片機(jī)課程設(shè)計(jì)搶答器word 含匯編語言源程序,仿真

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
#
搶答器。內(nèi)含源文件,仿真,課程設(shè)計(jì)word,程序軟件為keil,歡迎分享

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


單片機(jī)匯編語言源程序如下:
  1. OK EQU 20H;搶答開始標(biāo)志位
  2. RING EQU 22H;響鈴標(biāo)志位
  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;初設(shè)搶答時(shí)間為30s
  15. MOV R2,#60;初設(shè)答題時(shí)間為60s
  16. MOV TMOD,#11H;設(shè)置未定時(shí)器/模式1
  17. MOV TH0,#0F0H
  18. MOV TL0,#0FFH;越高發(fā)聲頻率越高,越尖
  19. MOV TH1,#3CH
  20. MOV TL1,#0B0H;50ms為一次溢出中斷
  21. SETB EA
  22. SETB ET0
  23. SETB ET1
  24. SETB EX0
  25. SETB EX1;允許四個(gè)中斷,T0/T1/INT0/INT1
  26. CLR OK
  27. CLR RING
  28. SETB TR1
  29. SETB TR0;一開始就運(yùn)行定時(shí)器,以開始顯示FFF.如果想重新計(jì)數(shù),重置TH1/TL1就可以了
  30. ;=====查詢程序=====
  31. START: MOV R5,#0BH
  32. MOV R4,#0BH
  33. MOV R3,#0BH
  34. ACALL DISPLAY;未開始搶答時(shí)候顯示FFF
  35. JB P3.0,NEXT;ddddddd
  36. ACALL DELAY
  37. JB P3.0,NEXT;去抖動(dòng),如果"開始鍵"按下就向下執(zhí)行,否者跳到非法搶答查詢
  38. ACALL BARK;按鍵發(fā)聲
  39. MOV A,R1
  40. MOV R6,A;送R1->R6,因?yàn)镽1中保存了搶答時(shí)間
  41. SETB OK;搶答標(biāo)志位,用于COUNT只程序中判斷是否查詢搶答
  42. MOV R7,#01H ;讀搶答鍵數(shù)據(jù)信號(hào)標(biāo)志,這里表示只讀一次有用信號(hào)
  43. MOV R3,#0AH;搶答只顯示計(jì)時(shí),滅號(hào)數(shù)
  44. AJMP COUNT;進(jìn)入倒計(jì)時(shí)程序,"查詢有效搶答的程序"在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(搶答時(shí)間R1調(diào)整程序)=====
  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;先在兩個(gè)時(shí)間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(回答時(shí)間R2調(diào)整程序)=====
  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. ;=====倒計(jì)時(shí)程序(搶答倒計(jì)時(shí)和回答倒計(jì)時(shí)都跳到改程序)=====
  130. REPEAT:MOV A,R2 ;使用錦囊時(shí)重新計(jì)時(shí)
  131. MOV R6,A
  132. CLR RING
  133. COUNT: MOV R0,#00H;重置定時(shí)器中斷次數(shù)
  134. MOV TH1,#3CH
  135. MOV TL1,#0B0H;重置定時(shí)器
  136. RECOUNT:MOV A,R6;R6保存了倒計(jì)時(shí)的時(shí)間,之前先將搶答時(shí)間或回答時(shí)間給R6
  137. MOV B,#0AH
  138. DIV AB;除十分出個(gè)位/十位
  139. MOV 30H,A;十位存于(30H)
  140. MOV 31H,B;個(gè)位存于(31H)
  141. MOV R5,30H;取十位
  142. MOV R4,31H;取個(gè)位
  143. MOV A,R6
  144. SUBB A,#07H
  145. JNC LARGER;大于5s跳到LARGER,小于等于5s會(huì)提醒
  146. MOV A,R0
  147. CJNE A,#0AH,FULL;1s中0.5s向下運(yùn)行
  148. CLR RING
  149. AJMP CHECK
  150. FULL: CJNE A,#14H,CHECK;下面是1s的情況,響并顯示號(hào)數(shù)并清R0,重新計(jì)
  151. SETB RING
  152. MOV A,R6
  153. JZ QUIT;計(jì)時(shí)完畢
  154. MOV R0,#00H
  155. DEC R6;一秒標(biāo)志減1
  156. AJMP CHECK
  157. LARGER: MOV A,R0
  158. CJNE A,#14H,CHECK;如果1s向下運(yùn)行,否者跳到查"停/顯示"
  159. DEC R6;計(jì)時(shí)一秒R6自動(dòng)減1
  160. MOV R0,#00H
  161. CHECK: JNB P3.1,QUIT;如按下停止鍵退出
  162. JNB OK,CHECKK ;只在回答倒計(jì)時(shí)才有效
  163. AJMP NEXTT
  164. CHECKK:JNB P3.0,REPEAT ;判斷是否使用錦囊
  165. NEXTT: ACALL DISPLAY
  166. JB OK,ACCOUT;如果是搶答倒計(jì)時(shí),如是則查詢搶答,否者跳過查詢繼續(xù)倒數(shù)(這里起到鎖搶答作用)
  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;如果按下了"停止鍵"執(zhí)行的程序
  182. CLR RING
  183. AJMP START
  184. ;=====正常搶答處理程序=====
  185. TRUE1: ACALL BARK
  186. MOV A,R2
  187. MOV R6,A;搶答時(shí)間R2送R6
  188. MOV R3,#01H
  189. CLR OK;因?yàn)榇痤}的計(jì)時(shí)不再查詢搶答,所以就鎖了搶答
  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. ;=====犯規(guī)搶答程序=====
  234. ERROR: MOV R0,#00H
  235. MOV TH1,#3CH
  236. MOV TL1,#0B0H
  237. MOV 34H,R3;犯規(guī)號(hào)數(shù)暫存與(34H)
  238. HERE: MOV A,R0
  239. CJNE A,#06H,FLASH;0.3s向下運(yùn)行->滅并停響
  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的情況,響并顯示號(hào)數(shù)并清R0,重新計(jì)
  246. SETB RING
  247. MOV R0,#00H
  248. MOV R3,34H;取回號(hào)數(shù)
  249. MOV R5,#0BH
  250. MOV R4,#0BH;顯示FF和號(hào)數(shù)
  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. ;第一個(gè)為零,其他與上相同,因?yàn)槭蝗绻麨榱泔@示熄滅
  281. ;====加減時(shí)間延時(shí)(起到不會(huì)按下就加N個(gè)數(shù))======
  282. DELAY1: MOV 35H,#08H
  283. LOOP0: ACALL DISPLAY
  284. DJNZ 35H,LOOP0
  285. RET
  286. ;=====延時(shí)4236個(gè)機(jī)器周期(去抖動(dòng)用到)=====
  287. DELAY: MOV 32H,#12H
  288. LOOP: MOV 33H,#0AFH
  289. LOOP1: DJNZ 33H,LOOP1
  290. DJNZ 32H,LOOP
  291. RET
  292. ;=====延時(shí)4236個(gè)機(jī)器周期(顯示用到)=====
  293. DELAY2: MOV 32H,#43H
  294. ……………………

  295. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼

所有資料51hei提供下載:
搶答器.zip (43.83 KB, 下載次數(shù): 136)

單片機(jī)課程設(shè)計(jì)2.rar (719.13 KB, 下載次數(shù): 144)


評分

參與人數(shù) 1黑幣 +6 收起 理由
吉玉的呆車 + 6 很給力!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏7 分享淘帖 頂2 踩

相關(guān)帖子

回復(fù)

使用道具 舉報(bào)

7#
ID:876573 發(fā)表于 2021-5-11 22:01 | 只看該作者
2個(gè)地方有bug:
1:答題時(shí)間:按下時(shí)間+或者時(shí)間-按鍵基本都是加2秒或者減2秒,甚至是突然加5秒或者減3秒的情況,很不穩(wěn)定;
2、搶答時(shí)間調(diào)整:問題同上

希望樓主幫忙分析一下是什么原因以及如何解決,謝謝。
回復(fù)

使用道具 舉報(bào)

6#
ID:876573 發(fā)表于 2021-5-11 21:59 | 只看該作者
2個(gè)地方有bug:
1、搶答時(shí)間調(diào)整:按下加1s按鍵或者減1s按鍵基本都是加2秒或者減2秒,有時(shí)候加5秒或者減3秒的情況
2、答題時(shí)間調(diào)整模塊:問題同上即時(shí)間+和時(shí)間-是不穩(wěn)定的,希望樓主能不能指點(diǎn)一下是什么原因?謝謝
回復(fù)

使用道具 舉報(bào)

5#
ID:870579 發(fā)表于 2020-12-29 21:15 | 只看該作者
好資料,51黑有你更精彩!!!
回復(fù)

使用道具 舉報(bào)

地板
ID:567859 發(fā)表于 2019-6-20 20:56 | 只看該作者
發(fā)生關(guān)鍵仿真錯(cuò)誤怎么回事
回復(fù)

使用道具 舉報(bào)

板凳
ID:563992 發(fā)表于 2019-6-16 22:10 | 只看該作者
單片機(jī)搶答器
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:486665 發(fā)表于 2019-3-8 09:10 來自手機(jī) | 只看該作者
單片機(jī)搶答器
回復(fù)

使用道具 舉報(bào)

樓主
ID:1 發(fā)表于 2017-6-4 17:23 | 只看該作者
好資料,51黑有你更精彩!!!
回復(fù)

使用道具 舉報(bào)

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表