找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机抢答器汇编代码在计分跳转的地方有问题

[复制链接]
跳转到指定楼层
楼主
ID:409772 发表于 2019-3-29 17:15 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
30黑币
代码在计分跳转的地方有问题。最好能再帮我测试一下。谢谢

仿真原理图如下


单片机源程序如下:
  1.         OK EQU 20H                       ;抢答开始标志位
  2.         RING EQU 22H                     ;响铃标志位
  3.         DATA0 EQU 36H                    ;抢答按键口数据存放地址
  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                       ;初设抢答时间为20s
  14.         MOV R2,#30                       ;初设答题时间为30s
  15.         mov 38h,#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                         ;允许二个中断,T0/T1
  24.         CLR OK
  25.         CLR RING
  26.          SETB TR1
  27.          SETB TR0                        ;一开始就运行定时器,以开始显示FFF.如果想重新计数,重置TH1/TL1就可以了

  28. ;查询程序:
  29. START:   MOV DATA0,#0FFH                 ;初始化
  30.          MOV R5,#0BH
  31.          MOV R4,#0BH
  32.          MOV R3,#0BH
  33.          ACALL DISPLAY                   ;未开始抢答时候显示FFF
  34.          JNB P3.3,SELSUB0
  35.          JNB P3.4,TZ3                    ;倒计时调整
  36.                        ;进入计分
  37.          JNB P2.4,start                 ;复位键,进入主程序
  38.          JB P3.0,NEXT
  39.          ACALL DELAY
  40.          JB P3.0,NEXT                    ;去抖动,如果"开始键"按下就向下执行,否者跳到非法抢答查询
  41.          SETB EX0                        ;开放INT0
  42.          ACALL BARK                      ;按键发声
  43.          MOV A,R1
  44.          MOV R6,A                    ;送R1->R6,因为R1中保存了抢答时间
  45.          SETB OK                         ;抢答标志位,在使用锦囊时用作判断是抢答倒计时还是回答倒计时
  46.          MOV R3,#0AH                     ;抢答只显示计时,灭号数
  47.          AJMP COUNT                      ;进入倒计时程序,"查询有效抢答的程序"在COUNT里面
  48. NEXT:    JNB P1.0,FALSE1
  49.          JNB P1.1,FALSE2
  50.          JNB P1.2,FALSE3
  51.          JNB P1.3,FALSE4
  52.          JNB P1.4,FALSE5
  53.          JNB P1.5,FALSE6
  54.          JNB P1.6,TZ1
  55.          JNB P1.7,TZ2
  56.          AJMP START
  57. TZ1:     AJMP FALSE7
  58. TZ2:     AJMP FALSE8
  59. TZ3:     AJMP SELSUB1

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

  77. ;SELSUB0(抢答时间R1调整程序):
  78. SELSUB0: MOV A,R1
  79.          MOV B,#0AH
  80.          DIV AB
  81.          MOV R5,A
  82.          MOV R4,B
  83.          MOV R3,#0AH
  84.          ACALL DISPLAY                   ;先在两个时间LED上显示R1
  85.          JNB P3.5,INC0                   ;P3.5为+1s键,如按下跳到INCO
  86.          JNB P3.6,DEC0                   ;P3.6为-1s键,如按下跳到DECO
  87.          JNB P3.1,BACK0                  ;P3.1为确定键,如按下跳到BACKO
  88.          AJMP SELSUB0
  89. INC0:   MOV A,R1
  90.         CJNE A,#63H,ADD0                 ;如果不是99,R2加1,如果加到99,R1就置0,重新加起。
  91.         MOV R1,#00H
  92.         ACALL DELAY1
  93.         AJMP SELSUB0
  94. ADD0:   INC R1
  95.         ACALL DELAY1
  96.         AJMP SELSUB0
  97. DEC0:   MOV A,R1
  98.         JZ SETR1                         ;如果R1为0, R1就置99,
  99.         DEC R1
  100.         ACALL DELAY1
  101.         AJMP SELSUB0
  102. SETR1:  MOV R1,#63H
  103.         ACALL DELAY1
  104.         AJMP SELSUB0
  105. BACK0:  AJMP START

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

  135. ;启用锦囊程序:
  136. REPEAT:MOV A,38h                        ;使用锦囊时重新计时
  137.        MOV R6,A
  138.        CLR RING         ;当倒计时进入最后5秒的时候,启用锦囊能消除蜂鸣

  139. ;倒计时程序(抢答倒计时和回答倒计时都跳到改程序):
  140. COUNT:  MOV R0,#00H                    ;重置定时器中断次数
  141.         MOV TH1,#3CH
  142.         MOV TL1,#0B0H                  ;重置定时器
  143. RECOUNT:MOV A,R6                       ;R6保存了倒计时的时间,之前先将抢答时间或回答时间给R6
  144.         MOV B,#0AH
  145.     DIV AB                             ;除十分出个位/十位
  146.     MOV 30H,A                          ;十位存于(30H)
  147.     MOV 31H,B                          ;个位存于(31H)
  148.     MOV R5,30H                         ;取十位
  149.     MOV R4,31H                         ;取个位
  150.     MOV A,R6
  151.     SUBB A,#07H
  152.     JNC LARGER                   ;大于5s跳到LARGER,小于等于5s会提醒
  153.     MOV A,R0
  154.         CJNE A,#0AH,FULL               ;1s中0.5s向下运行
  155.     CLR RING
  156.     AJMP CHECK
  157. FULL: CJNE A,#14H,CHECK              ;下面是1s的情况,响并显示号数并清R0,重新计
  158.       SETB RING
  159.       MOV A,R6
  160.     JZ QUIT                            ;计时完毕
  161.     MOV R0,#00H
  162.     DEC R6                            ;一秒标志减1
  163.       AJMP CHECK
  164. LARGER: MOV A,R0
  165.         CJNE A,#14H,CHECK          ;如果1s向下运行,否者跳到"停/显示"
  166.         DEC R6                           ;计时一秒R6自动减1
  167.         MOV R0,#00H
  168. CHECK: JNB P3.1,QUIT         ;如按下停止键退出
  169.         JNB OK,CHECKK      ;只在回答倒计时才有效
  170.         AJMP NEXTT
  171. CHECKK:JNB P3.0,REPEAT    ;判断是否使用锦囊
  172. NEXTT: ACALL DISPLAY
  173.    JB OK,ACCOUT;如果是抢答倒计时,如是则查询抢答,否者跳过查询继续倒数(这里起到锁抢答作用)
  174.        AJMP RECOUNT
  175. ACCOUT:MOV A,DATA0
  176.        JNB ACC.0,TRUE1
  177.        JNB ACC.1,TRUE2
  178.        JNB ACC.2,TRUE3
  179.        JNB ACC.3,TRUE4
  180.        JNB ACC.4,TRUE5
  181.        JNB ACC.5,TRUE6
  182.        JNB ACC.6,TZ7
  183.       JNB ACC.7,TZ8
  184.       AJMP RECOUNT
  185. TZ7: AJMP TRUE7
  186. TZ8: AJMP TRUE8   
  187. QUIT:  CLR OK                         ;如果按下了"停止键"执行的程序
  188.    CLR RING
  189.    AJMP START

  190. ;正常抢答处理程序:
  191. TRUE1: ACALL BARK
  192.        MOV A,R2
  193.        MOV R6,A              ;抢答时间R2送R6
  194.        MOV R3,#01H
  195.        CLR OK                ;因为答题的计时不再查询抢答,所以就锁了抢答
  196.        AJMP COUNT
  197. TRUE2:ACALL BARK
  198.       MOV A,R2
  199.       MOV R6,A
  200.       MOV R3,#02H
  201.       CLR OK
  202.       AJMP COUNT
  203. TRUE3:ACALL BARK
  204.       MOV A,R2
  205.       MOV R6,A
  206.       MOV R3,#03H
  207.       CLR OK
  208.       AJMP COUNT
  209. TRUE4:ACALL BARK
  210.       MOV A,R2
  211.       MOV R6,A
  212.       MOV R3,#04H
  213.       CLR OK
  214.       AJMP COUNT
  215. TRUE5: ACALL BARK
  216.         MOV A,R2
  217.         MOV R6,A
  218.         MOV R3,#05H
  219.         CLR OK
  220.         AJMP COUNT
  221. TRUE6:  ACALL BARK
  222.         MOV A,R2
  223.         MOV R6,A
  224.         MOV R3,#06H
  225.         CLR OK
  226.         AJMP COUNT
  227. TRUE7:  ACALL BARK
  228.         MOV A,R2
  229.         MOV R6,A
  230.         MOV R3,#07H
  231.         CLR OK
  232.         AJMP COUNT
  233. TRUE8:  ACALL BARK
  234.         MOV A,R2
  235.         MOV R6,A
  236.         MOV R3,#08H
  237.         CLR OK
  238.         AJMP COUNT

  239. ;犯规抢答程序:
  240. ERROR:  MOV R0,#00H
  241.         MOV TH1,#3CH
  242.         MOV TL1,#0B0H
  243.         MOV 34H,R3                ;犯规号数暂存与(34H)
  244. HERE:   MOV A,R0
  245.         CJNE A,#06H,FLASH         ;0.3s向下运行->灭并停响
  246.         CLR RING
  247.         MOV R3,#0AH
  248.         MOV R4,#0AH
  249.         MOV R5,#0AH               ;三灯全灭
  250.         AJMP CHECK1
  251. FLASH:  CJNE A,#0CH,CHECK1        ;下面是0.8s的情况,响并显示号数并清R0,重新计
  252.         SETB RING
  253.         MOV R0,#00H
  254.         MOV R3,34H                ;取回号数
  255.         MOV R5,#0BH
  256.         MOV R4,#0BH               ;显示FF和号数
  257.         AJMP CHECK1
  258. CHECK1: JNB P3.1,QUIT1
  259.         ACALL DISPLAY
  260.         AJMP HERE
  261. QUIT1:  CLR RING
  262.         CLR OK
  263.         AJMP START

  264. ;计分程序
  265. JNB P2.5,score
  266. //************ 负数****************//
  267. fushiwei:xrl p2,#00000110b ;101 //扫描分数负十位 //#00000001b
  268. MOV A,@r1  
  269. MOV DPTR,#DISPLAY  
  270. MOVC A,@A+DPTR
  271. MOV P0,A
  272. mov p0,#0ffh// ajmp huiqu
  273. //************ 计分程序 ************//
  274. score:mov 30h,#00h
  275. mov r0,#30h
  276. mov r1,#31h
  277. mov p2,#0ffh// #0f8h 111
  278. xrl p2,#00000011b //扫描序号 011 // #00000100b
  279. xunhuan:MOV A,30h
  280. MOV DPTR,#DISPLAY
  281. MOVC A,@A+DPTR
  282. MOV P0,A
  283. mov p0,#0ffh//
  284. huanle:xrl p2,#00000110b //101 //扫描分数十位 //#00000001b
  285. MOV A,@r1
  286. MOV DPTR,#DISPLAY
  287. MOVC A,@A+DPTR
  288. MOV P0,A
  289. mov p0,#0ffh//
  290. huiqu: inc r1  //扫描分数个位
  291. xrl p2,#00000011b //110//#00000100b
  292. MOV A,@r1  
  293. MOV DPTR,#DISPLAY
  294. MOVC A,@A+DPTR
  295. MOV P0,A
  296. jb p2.6,x
  297. z: jnb p2.6,z
  298. jb p2.6,plus ;若有按加法的则调至加法处
  299. x: jb p2.7,y
  300. w: jnb p2.7,w
  301. jb p2.7,lower ;若有按键发的则调至减法处
  302. y: jb p2.5,kk
  303. q: jnb p2.5,q
  304. jb p2.5,one  ;若有按换位的则跳转置换为下位
  305. kk: dec r1 ;若无责跳转循环显示本位
  306. mov p0,#0ffh//
  307. xrl p2,#00000101b ;011 // #00000010b
  308. JNB P2.4,hui ;若主持人按下复位信号键,则转向主程序
  309. ajmp xunhuan
  310. one:inc r1
  311. inc 30h
  312. two:mov p0,#0ffh
  313. xrl p2,#00000101b ;011 //#00000010b
  314. cjne @r0,#09h,xunhuan
  315. ajmp score
  316. hui:ljmp start
  317. plus:inc @r1 ;加分并判断满十
  318. cjne @r1,#0ah,kk
  319. ajmp jinwei
  320. lower:dec @r1 ;减分并判断为零
  321. cjne @r1,#0ffh,kk
  322. ajmp panduan ;判断十位是否也为 0
  323. oo: inc @r1
  324. ajmp jiewei
  325. panduan:dec @r1
  326. cjne @r1,#0ffh,oo
  327. ajmp fushu
  328. fushu:mov @r1,#01h  
  329. dec r1
  330. mov @r1,#0ah
  331. mov p0,#0ffh
  332. xrl p2,#00000101b  
  333. ljmp fushiwei //
  334. jinwei:mov @r1,#00h ;满十进 1 并且本为清零
  335. dec r1
  336. inc @r1  
  337. mov p0,#0ffh//
  338. xrl p2,#00000101b ;110 101 // #00000010b
  339. ljmp xunhuan
  340. jiewei:mov @r1,#09h ;借 1 并且本为置九
  341. dec r1
  342. dec @r1
  343. mov p0,#0ffh//
  344. xrl p2,#00000101b ;110 101 //#00000010b
  345. ljmp xunhuan


  346. ;显示程序:
  347. DISPLAY:MOV DPTR,#DAT1           ;查表显示程序,利用P0口做段选码口输出/P2低三位做位选码输出
  348.         MOV A,R3
  349.         MOVC A,@A+DPTR
  350.         MOV P2,#0feH
  351.         MOV P0,A
  352.         ACALL DELAY
  353.         MOV DPTR,#DAT2
  354.         MOV A,R5
  355.         MOVC A,@A+DPTR
  356.         MOV P2,#0fdH
  357.         MOV P0,A
  358.         ACALL DELAY
  359.         MOV A,R4
  360.         MOVC A,@A+DPTR
  361.         MOV P2,#0fbH
  362.         MOV P0,A
  363.         ACALL DELAY
  364.         RET
  365. DAT1:DB 00h,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh,00H,71H  
  366. ;"灭","1","2","3","4","5","6","7","8","9","灭","F"
  367. DAT2:DB 3fh,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh,00H,71H
  368. ;第一个为零,其他与上相同,因为十位如果为零显示熄灭

  369. ;加减时间延时(起到不会按下就加N个数):
  370. DELAY1: MOV 35H,#08H
  371. LOOP0:  ACALL DISPLAY
  372.          DJNZ 35H,LOOP0
  373.          RET

  374. ;延时(显示和去抖动用到):
  375. DELAY:  MOV 32H,#12H
  376. LOOP:   MOV 33H,#0AFH
  377. LOOP1:  DJNZ 33H,LOOP1
  378.         DJNZ 32H,LOOP
  379.     RET

  380. ;发声程序:
  381. BARK:   SETB RING
  382.         ACALL DELAY1
  383.         ACALL DELAY1
  384.         CLR RING                  ;按键发声
  385.     RET

  386. ;TO溢出中断(响铃程序) :
  387. T0INT:  MOV TH0,#0ECH
  388.         MOV TL0,#0FFH
  389.         JNB RING,OUT;
  390. CPL P3.7                ;RING标志位为1时候P3.7口不断取反使喇叭发出一定频率的声音
  391. OUT:    RETI

  392. ;T1溢出中断(计时程序):
  393. T1INT: MOV TH1,#3CH
  394.       MOV TL1,#0B0H
  395.       INC R0
  396.     RETI

  397. ;中断服务程序:
  398. INTT0: MOV DATA0,P1   
  399.        CLR EX0
  400.      RETI
  401.      END
复制代码

所有资料51hei提供下载:
Text1.rar (3.55 KB, 下载次数: 15)


最佳答案

查看完整内容

没有人会帮你测试的,一个几百行的汇编,就算是自己写的,如果出现问题的话,运气好的一下就能找到问题,运气不好的,三五天也不一定能找到问题,更何况还不是自己写的程序呢 你没有学习板吗?为什么要仿真呢?仿真用的时间要比烧录用的时间多,而且,你最终还是要在烧录的,像这种小程序,仿真的作用很小的,还不如直接烧录来得快
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:401564 发表于 2019-3-29 17:15 | 只看该作者
没有人会帮你测试的,一个几百行的汇编,就算是自己写的,如果出现问题的话,运气好的一下就能找到问题,运气不好的,三五天也不一定能找到问题,更何况还不是自己写的程序呢
你没有学习板吗?为什么要仿真呢?仿真用的时间要比烧录用的时间多,而且,你最终还是要在烧录的,像这种小程序,仿真的作用很小的,还不如直接烧录来得快
回复

使用道具 举报

板凳
ID:328014 发表于 2019-3-31 02:47 | 只看该作者
最好附上仿真工程
回复

使用道具 举报

地板
ID:481641 发表于 2019-3-31 09:16 | 只看该作者
用开发板测吧,
回复

使用道具 举报

5#
ID:409772 发表于 2019-3-31 09:59 | 只看该作者
这是仿真

321.rar

18.8 KB, 下载次数: 8

仿真工程

回复

使用道具 举报

6#
ID:775593 发表于 2020-11-3 20:16 | 只看该作者
请问你解决这个问题了吗?可以分享吗?
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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