找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

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

這個(gè)單片機(jī)匯編搶答器仿真怎么添加一個(gè)計(jì)分功能?

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
在不動(dòng)原有基礎(chǔ)上,另行添加功能。調(diào)整時(shí)間的地方也有問題,最好也能幫我一下。謝謝了
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)


單片機(jī)源程序如下:
  1.         OK EQU 20H                       ;搶答開始標(biāo)志位
  2.         RING EQU 22H                     ;響鈴標(biāo)志位
  3.         DATA0 EQU 36H                    ;搶答按鍵口數(shù)據(jù)存放地址
  4.         ORG 0000H
  5.         AJMP MAIN
  6.         ORG 0003H  
  7.         AJMP INTT0
  8.         ORG 000BH
  9.         AJMP T0INT
  10.         ORG 001BH
  11.         AJMP T1INT
  12.         ORG 0040H
  13. MAIN:   MOV R1,#20                       ;初設(shè)搶答時(shí)間為20s
  14.         MOV R2,#30                       ;初設(shè)答題時(shí)間為30s
  15.         mov 38h,#60                      ;啟用錦囊時(shí)間從60s倒計(jì)時(shí)
  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                         ;允許二個(gè)中斷,T0/T1
  24.         CLR OK
  25.         CLR RING
  26.          SETB TR1
  27.          SETB TR0                        ;一開始就運(yùn)行定時(shí)器,以開始顯示FFF.如果想重新計(jì)數(shù),重置TH1/TL1就可以了

  28. ;查詢程序:
  29. START:   MOV DATA0,#0FFH                 ;初始化
  30.          MOV R5,#0BH
  31.          MOV R4,#0BH
  32.          MOV R3,#0BH
  33.          ACALL DISPLAY                   ;未開始搶答時(shí)候顯示FFF
  34.          JNB P3.3,SELSUB0
  35.          JNB P3.4,TZ3                    ;倒計(jì)時(shí)調(diào)整
  36.          JB P3.0,NEXT
  37.          ACALL DELAY
  38.          JB P3.0,NEXT                    ;去抖動(dòng),如果"開始鍵"按下就向下執(zhí)行,否者跳到非法搶答查詢
  39.          SETB EX0                        ;開放INT0
  40.          ACALL BARK                      ;按鍵發(fā)聲
  41.          MOV A,R1
  42.          MOV R6,A                    ;送R1->R6,因?yàn)镽1中保存了搶答時(shí)間
  43.          SETB OK                         ;搶答標(biāo)志位,在使用錦囊時(shí)用作判斷是搶答倒計(jì)時(shí)還是回答倒計(jì)時(shí)
  44.          MOV R3,#0AH                     ;搶答只顯示計(jì)時(shí),滅號(hào)數(shù)
  45.          AJMP COUNT                      ;進(jìn)入倒計(jì)時(shí)程序,"查詢有效搶答的程序"在COUNT里面
  46. NEXT:    JNB P1.0,FALSE1
  47.          JNB P1.1,FALSE2
  48.          JNB P1.2,FALSE3
  49.          JNB P1.3,FALSE4
  50.          JNB P1.4,FALSE5
  51.          JNB P1.5,FALSE6
  52.          JNB P1.6,TZ1
  53.          JNB P1.7,TZ2
  54.          AJMP START
  55. TZ1:     AJMP FALSE7
  56. TZ2:     AJMP FALSE8
  57. TZ3:     AJMP SELSUB1

  58. ;非法搶答處理程序:
  59. FALSE1: MOV R3,#01H
  60.         AJMP ERROR
  61. FALSE2: MOV R3,#02H
  62.         AJMP ERROR
  63. FALSE3: MOV R3,#03H
  64.         AJMP ERROR
  65. FALSE4: MOV R3,#04H
  66.         AJMP ERROR
  67. FALSE5: MOV R3,#05H
  68.         AJMP ERROR
  69. FALSE6: MOV R3,#06H
  70.         AJMP ERROR
  71. FALSE7: MOV R3,#07H
  72.         AJMP ERROR
  73. FALSE8: MOV R3,#08H
  74.         AJMP ERROR

  75. ;SELSUB0(搶答時(shí)間R1調(diào)整程序):
  76. SELSUB0: MOV A,R1
  77.          MOV B,#0AH
  78.          DIV AB
  79.          MOV R5,A
  80.          MOV R4,B
  81.          MOV R3,#0AH
  82.          ACALL DISPLAY                   ;先在兩個(gè)時(shí)間LED上顯示R1
  83.          JNB P3.5,INC0                   ;P3.5為+1s鍵,如按下跳到INCO
  84.          JNB P3.6,DEC0                   ;P3.6為-1s鍵,如按下跳到DECO
  85.          JNB P3.1,BACK0                  ;P3.1為確定鍵,如按下跳到BACKO
  86.          AJMP SELSUB0
  87. INC0:   MOV A,R1
  88.         CJNE A,#63H,ADD0                 ;如果不是99,R2加1,如果加到99,R1就置0,重新加起。
  89.         MOV R1,#00H
  90.         ACALL DELAY1
  91.         AJMP SELSUB0
  92. ADD0:   INC R1
  93.         ACALL DELAY1
  94.         AJMP SELSUB0
  95. DEC0:   MOV A,R1
  96.         JZ SETR1                         ;如果R1為0, R1就置99,
  97.         DEC R1
  98.         ACALL DELAY1
  99.         AJMP SELSUB0
  100. SETR1:  MOV R1,#63H
  101.         ACALL DELAY1
  102.         AJMP SELSUB0
  103. BACK0:  AJMP START

  104. ;SELSUB1(回答時(shí)間R2調(diào)整程序):
  105. SELSUB1: MOV A,R2
  106.         MOV B,#0AH
  107.         DIV AB
  108.        MOV R5,A
  109.        MOV R4,B
  110.        MOV R3,#0AH
  111.        ACALL DISPLAY
  112.     JNB P3.5,INC1
  113.     JNB P3.6,DEC1
  114.     JNB P3.1,BACK1
  115.     AJMP SELSUB1
  116. INC1:   MOV A,R2
  117.         CJNE A,#63H,ADD1
  118.         MOV R2,#00H
  119.         ACALL DELAY1
  120. AJMP SELSUB1
  121. ADD1:   INC R2
  122.          ACALL DELAY1
  123.          AJMP SELSUB1
  124. DEC1:   MOV A,R2
  125.      JZ SETR2
  126.      DEC R2
  127.     ACALL DELAY1
  128.     AJMP SELSUB1
  129. SETR2:  MOV R2,#63H
  130.         ACALL DELAY1
  131.         AJMP SELSUB1
  132. BACK1: AJMP START

  133. ;啟用錦囊程序:
  134. REPEAT:MOV A,38h                        ;使用錦囊時(shí)重新計(jì)時(shí)
  135.        MOV R6,A
  136.        CLR RING         ;當(dāng)?shù)褂?jì)時(shí)進(jìn)入最后5秒的時(shí)候,啟用錦囊能消除蜂鳴

  137. ;倒計(jì)時(shí)程序(搶答倒計(jì)時(shí)和回答倒計(jì)時(shí)都跳到改程序):
  138. COUNT:  MOV R0,#00H                    ;重置定時(shí)器中斷次數(shù)
  139.         MOV TH1,#3CH
  140.         MOV TL1,#0B0H                  ;重置定時(shí)器
  141. RECOUNT:MOV A,R6                       ;R6保存了倒計(jì)時(shí)的時(shí)間,之前先將搶答時(shí)間或回答時(shí)間給R6
  142.         MOV B,#0AH
  143.     DIV AB                             ;除十分出個(gè)位/十位
  144.     MOV 30H,A                          ;十位存于(30H)
  145.     MOV 31H,B                          ;個(gè)位存于(31H)
  146.     MOV R5,30H                         ;取十位
  147.     MOV R4,31H                         ;取個(gè)位
  148.     MOV A,R6
  149.     SUBB A,#07H
  150.     JNC LARGER                   ;大于5s跳到LARGER,小于等于5s會(huì)提醒
  151.     MOV A,R0
  152.         CJNE A,#0AH,FULL               ;1s中0.5s向下運(yùn)行
  153.     CLR RING
  154.     AJMP CHECK
  155. FULL: CJNE A,#14H,CHECK              ;下面是1s的情況,響并顯示號(hào)數(shù)并清R0,重新計(jì)
  156.       SETB RING
  157.       MOV A,R6
  158.     JZ QUIT                            ;計(jì)時(shí)完畢
  159.     MOV R0,#00H
  160.     DEC R6                            ;一秒標(biāo)志減1
  161.       AJMP CHECK
  162. LARGER: MOV A,R0
  163.         CJNE A,#14H,CHECK          ;如果1s向下運(yùn)行,否者跳到"停/顯示"
  164.         DEC R6                           ;計(jì)時(shí)一秒R6自動(dòng)減1
  165.         MOV R0,#00H
  166. CHECK: JNB P3.1,QUIT         ;如按下停止鍵退出
  167.         JNB OK,CHECKK      ;只在回答倒計(jì)時(shí)才有效
  168.         AJMP NEXTT
  169. CHECKK:JNB P3.0,REPEAT    ;判斷是否使用錦囊
  170. NEXTT: ACALL DISPLAY
  171.    JB OK,ACCOUT;如果是搶答倒計(jì)時(shí),如是則查詢搶答,否者跳過查詢繼續(xù)倒數(shù)(這里起到鎖搶答作用)
  172.        AJMP RECOUNT
  173. ACCOUT:MOV A,DATA0
  174.        JNB ACC.0,TRUE1
  175.        JNB ACC.1,TRUE2
  176.        JNB ACC.2,TRUE3
  177.        JNB ACC.3,TRUE4
  178.        JNB ACC.4,TRUE5
  179.        JNB ACC.5,TRUE6
  180.        JNB ACC.6,TZ7
  181.       JNB ACC.7,TZ8
  182.       AJMP RECOUNT
  183. TZ7: AJMP TRUE7
  184. TZ8: AJMP TRUE8   
  185. QUIT:  CLR OK                         ;如果按下了"停止鍵"執(zhí)行的程序
  186.    CLR RING
  187.    AJMP START

  188. ;正常搶答處理程序:
  189. TRUE1: ACALL BARK
  190.        MOV A,R2
  191.        MOV R6,A              ;搶答時(shí)間R2送R6
  192.        MOV R3,#01H
  193.        CLR OK                ;因?yàn)榇痤}的計(jì)時(shí)不再查詢搶答,所以就鎖了搶答
  194.        AJMP COUNT
  195. TRUE2:ACALL BARK
  196.       MOV A,R2
  197.       MOV R6,A
  198.       MOV R3,#02H
  199.       CLR OK
  200.       AJMP COUNT
  201. TRUE3:ACALL BARK
  202.       MOV A,R2
  203.       MOV R6,A
  204.       MOV R3,#03H
  205.       CLR OK
  206.       AJMP COUNT
  207. TRUE4:ACALL BARK
  208.       MOV A,R2
  209.       MOV R6,A
  210.       MOV R3,#04H
  211.       CLR OK
  212.       AJMP COUNT
  213. TRUE5: ACALL BARK
  214.         MOV A,R2
  215.         MOV R6,A
  216.         MOV R3,#05H
  217.         CLR OK
  218.         AJMP COUNT
  219. TRUE6:  ACALL BARK
  220.         MOV A,R2
  221.         MOV R6,A
  222.         MOV R3,#06H
  223.         CLR OK
  224.         AJMP COUNT
  225. TRUE7:  ACALL BARK
  226.         MOV A,R2
  227.         MOV R6,A
  228.         MOV R3,#07H
  229.         CLR OK
  230.         AJMP COUNT
  231. TRUE8:  ACALL BARK
  232.         MOV A,R2
  233.         MOV R6,A
  234.         MOV R3,#08H
  235.         CLR OK
  236.         AJMP COUNT

  237. ;犯規(guī)搶答程序:
  238. ERROR:  MOV R0,#00H
  239.         MOV TH1,#3CH
  240.         MOV TL1,#0B0H
  241.         MOV 34H,R3                ;犯規(guī)號(hào)數(shù)暫存與(34H)
  242. HERE:   MOV A,R0
  243.         CJNE A,#06H,FLASH         ;0.3s向下運(yùn)行->滅并停響
  244.         CLR RING
  245.         MOV R3,#0AH
  246.         MOV R4,#0AH
  247.         MOV R5,#0AH               ;三燈全滅
  248.         AJMP CHECK1
  249. FLASH:  CJNE A,#0CH,CHECK1        ;下面是0.8s的情況,響并顯示號(hào)數(shù)并清R0,重新計(jì)
  250.         SETB RING
  251.         MOV R0,#00H
  252.         MOV R3,34H                ;取回號(hào)數(shù)
  253.         MOV R5,#0BH
  254.         MOV R4,#0BH               ;顯示FF和號(hào)數(shù)
  255.         AJMP CHECK1
  256. CHECK1: JNB P3.1,QUIT1
  257.         ACALL DISPLAY
  258.         AJMP HERE
  259. QUIT1:  CLR RING
  260.         CLR OK
  261.         AJMP START

  262. ;顯示程序:
  263. DISPLAY:MOV DPTR,#DAT1           ;查表顯示程序,利用P0口做段選碼口輸出/P2低三位做位選碼輸出
  264.         MOV A,R3
  265.         MOVC A,@A+DPTR
  266.         MOV P2,#0feH
  267.         MOV P0,A
  268.         ACALL DELAY
  269.         MOV DPTR,#DAT2
  270.         MOV A,R5
  271.         MOVC A,@A+DPTR
  272.         MOV P2,#0fdH
  273.         MOV P0,A
  274.         ACALL DELAY
  275.         MOV A,R4
  276.         MOVC A,@A+DPTR
  277.         MOV P2,#0fbH
  278.         MOV P0,A
  279.         ACALL DELAY
  280.         RET
  281. DAT1:DB 00h,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh,00H,71H  
  282. ;"滅","1","2","3","4","5","6","7","8","9","滅","F"
  283. DAT2:DB 3fh,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh,00H,71H
  284. ;第一個(gè)為零,其他與上相同,因?yàn)槭蝗绻麨榱泔@示熄滅

  285. ;加減時(shí)間延時(shí)(起到不會(huì)按下就加N個(gè)數(shù)):
  286. DELAY1: MOV 35H,#08H
  287. LOOP0:  ACALL DISPLAY
  288.          DJNZ 35H,LOOP0
  289.          RET

  290. ;延時(shí)(顯示和去抖動(dòng)用到):
  291. DELAY:  MOV 32H,#12H
  292. LOOP:   MOV 33H,#0AFH
  293. LOOP1:  DJNZ 33H,LOOP1
  294.         DJNZ 32H,LOOP
  295.     RET

  296. ;發(fā)聲程序:
  297. BARK:   SETB RING
  298.         ACALL DELAY1
  299.         ACALL DELAY1
  300.         CLR RING                  ;按鍵發(fā)聲
  301.     RET

  302. ;TO溢出中斷(響鈴程序) :
  303. T0INT:  MOV TH0,#0ECH
  304.         MOV TL0,#0FFH
  305.         JNB RING,OUT;
  306. CPL P3.7                ;RING標(biāo)志位為1時(shí)候P3.7口不斷取反使喇叭發(fā)出一定頻率的聲音
  307. OUT:    RETI

  308. ;T1溢出中斷(計(jì)時(shí)程序):
  309. T1INT: MOV TH1,#3CH
  310.       MOV TL1,#0B0H
  311.       INC R0
  312.     RETI

  313. ;中斷服務(wù)程序:
  314. INTT0: MOV DATA0,P1   
  315.        CLR EX0
  316.      RETI
  317.      END
復(fù)制代碼

所有資料51hei提供下載:
程序及原理圖.rar (20.98 KB, 下載次數(shù): 14)


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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