求助!!8路抢答器设计protues仿真求大神帮忙看看程序是否出错

2019-07-18 09:01发布

本人最近正在做一个八路抢答器的设计,程序敲好了,但在仿真的过程中设定好抢答时间之后,抢答开始时倒计时无法进行,我觉得可以是程序的某些语句写错了,经我检查没有发现问题出在何处,因此发帖问问各位大神帮我看看
8路抢答器.jpg
八路抢答器程序.docx 15.16 KB, 下载次数: 9
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
5条回答
晓晓江南
1楼-- · 2019-07-18 14:15
yyaing 发表于 2018-1-18 13:47
把程序代码贴出来,便于大神们帮忙分析

汇编代码用的人很少了,论坛里大神们都是用C语言,方便维护,不过我看了一下代码中有很多JNB和JB指令,且与P3端口有关,还有查了一下P3口需要上拉电阻,你的电路图没有为P3口提供上拉电阻,你不妨为P3口提供上拉电阻试试。 最佳答案
晓晓江南
2楼-- · 2019-07-18 18:56
楼主应该把代码贴出来,好让大神们分析,另外这个喇叭直接用单片机引脚驱动?最后采用三极管+电阻来驱动喇叭,还有就是与非门输入与单片机八个引脚直接相连,之间连接开关到地,最好还是在单片机八个引脚加电阻。
yyaing
3楼-- · 2019-07-19 00:47
晓晓江南 发表于 2018-1-18 11:29
楼主应该把代码贴出来,好让大神们分析,另外这个喇叭直接用单片机引脚驱动?最后采用三极管+电阻来驱动喇叭,还有就是与非门输入与单片机八个引脚直接相连,之间连接开关到地,最好还是在单片机八个引脚加电阻。

好的好的,感谢指导,现在改进
yyaing
4楼-- · 2019-07-19 05:05
本帖最后由 yyaing 于 2018-1-18 13:56 编辑

把程序代码贴出来,便于大神们帮忙分析
  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.          JB P3.0,NEXT
  37.          ACALL DELAY
  38.       JB P3.0,NEXT  //去抖动,如果"开始键"按下就向下执行,否者跳到非法抢答查询
  39.          SETB EX0                        //开放INT0
  40.          ACALL BARK                      //按键发声
  41.          MOV A,R1
  42.          MOV R6,A                        //送R1->R6,因为R1中保存了抢答时间
  43.          SETB OK                         //抢答标志位,在使用锦囊时用作判断是抢答倒计时还是回答倒计时
  44.          MOV R3,#0AH                     //抢答只显示计时,灭号数
  45.          AJMP COUNT                     //进入倒计时程序,"查询有效抢答的序"在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(抢答时间R1调整程序)============
  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                   //先在两个时间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               //2加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(回答时间R2调整程序)=============
  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                        //使用锦囊时重新计时
  135.        MOV R6,A
  136.        CLR RING                         //当倒计时进入最后5秒的时候,启用锦囊能消除蜂鸣
  137. //=============倒计时程序(抢答倒计时和回答倒计时都跳到改程序)========
  138. COUNT: MOV R0,#00H                   //重置定时器中断次数
  139.        MOV TH1,#3CH
  140.        MOV TL1,#0B0H                //重置定时器
  141. RECOUNT: MOV A,R6                    //R6保存了倒计时的时间,之前先将抢答时间或回答时间给R6
  142.     MOV B,#0AH
  143.     DIV AB                             //除十分出个位/十位
  144.     MOV 30H,A                          //十位存于(30H)
  145.     MOV 31H,B                          //个位存于(31H)
  146.     MOV R5,30H                         //取十位
  147.     MOV R4,31H                         //取个位
  148.     MOV A,R6
  149.     SUBB A,#07H
  150.     JNC LARGER                         //大于5s跳到LARGER,小于等于5s会提醒
  151.     MOV A,R0
  152.         CJNE A,#0AH,FULL               //1s中0.5s向下运行
  153.     CLR RING
  154.     AJMP CHECK
  155. FULL:   CJNE A,#14H,CHECK              //下面是1s的情况,响并显示号数并清R0,重新计
  156.         SETB RING
  157.         MOV A,R6
  158.     JZ QUIT                            //计时完毕
  159.     MOV R0,#00H
  160.    DEC R6                             //一秒标志减1
  161.     AJMP CHECK
  162. LARGER: MOV A,R0
  163.     CJNE A,#14H,CHECK              //如果1s向下运行,否者跳到查"停/显示"
  164.     DEC R6                             //计时一秒R6自动减1
  165.     MOV R0,#00H
  166. CHECK: JNB P3.1,QUIT      //如按下停止键退出
  167.        JNB OK,CHECKK      //只在回答倒计时才有效
  168.          AJMP NEXTT
  169. CHECKK:JNB P3.0,REPEAT    //判断是否使用锦囊
  170. NEXTT:
  171.        ACALL DISPLAY
  172.    JB OK,ACCOUT      //如果是抢答倒计时,如是则查询抢答,否者跳过查询继续倒数(这里起到锁抢答作用)
  173.    AJMP RECOUNT
  174. ACCOUT:MOV A,DATA0
  175.        JNB ACC.0,TRUE1
  176.        JNB ACC.1,TRUE2
  177.        JNB ACC.2,TRUE3
  178.        JNB ACC.3,TRUE4
  179.        JNB ACC.4,TRUE5
  180.        JNB ACC.5,TRUE6
  181.        JNB ACC.6,TZ7
  182.       JNB ACC.7,TZ8
  183.       AJMP RECOUNT
  184. TZ7: AJMP TRUE7
  185. TZ8: AJMP TRUE8   
  186. QUIT:  CLR OK                         //如果按下了"停止键"执行的程序
  187.    CLR RING
  188.    AJMP START
  189. //====================正常抢答处理程序=============================
  190. TRUE1: ACALL BARK
  191.        MOV A,R2
  192.        MOV R6,A                     //抢答时间R2送R6
  193.        MOV R3,#01H
  194.        CLR OK                   //因为答题的计时不再查询抢答,所以就锁了抢答
  195.        AJMP COUNT
  196. TRUE2:ACALL BARK
  197.       MOV A,R2
  198.       MOV R6,A
  199.       MOV R3,#02H
  200.       CLR OK
  201.       AJMP COUNT
  202. TRUE3:ACALL BARK
  203.       MOV A,R2
  204.       MOV R6,A
  205.       MOV R3,#03H
  206.       CLR OK
  207.       AJMP COUNT
  208. TRUE4:ACALL BARK
  209.       MOV A,R2
  210.       MOV R6,A
  211.       MOV R3,#04H
  212.       CLR OK
  213.        AJMP COUNT
  214. TRUE5:  ACALL BARK
  215.         MOV A,R2
  216.         MOV R6,A
  217.         MOV R3,#05H
  218.         CLR OK
  219.         AJMP COUNT
  220. TRUE6:  ACALL BARK
  221.         MOV A,R2
  222.         MOV R6,A
  223.         MOV R3,#06H
  224.         CLR OK
  225.         AJMP COUNT
  226. TRUE7:  ACALL BARK
  227.         MOV A,R2
  228.         MOV R6,A
  229.         MOV R3,#07H
  230.         CLR OK
  231.         AJMP COUNT
  232. TRUE8:  ACALL BARK
  233.        MOV A,R2
  234.         MOV R6,A
  235.         MOV R3,#08H
  236.         CLR OK
  237.         AJMP COUNT
  238. //===================== =犯规抢答程序=============================
  239. ERROR:  MOV R0,#00H
  240.         MOV TH1,#3CH
  241.         MOV TL1,#0B0H
  242.         MOV 34H,R3                //犯规号数暂存与(34H)
  243. HERE:   MOV A,R0
  244.         CJNE A,#06H,FLASH         //0.3s向下运行->灭并停响
  245.         CLR RING
  246.         MOV R3,#0AH
  247.         MOV R4,#0AH
  248.         MOV R5,#0AH               //三灯全灭
  249.         AJMP CHECK1
  250. FLASH:  CJNE A,#0CH,CHECK1        //下面是0.8s的情况,响并显示号数并清R0,重新计
  251.         SETB RING
  252.         MOV R0,#00H
  253.         MOV R3,34H                //取回号数
  254.         MOV R5,#0BH
  255.         MOV R4,#0BH               //显示FF和号数
  256.         AJMP CHECK1
  257. CHECK1: JNB P3.1,QUIT1
  258.         ACALL DISPLAY
  259.         AJMP HERE
  260. QUIT1:  CLR RING
  261.         CLR OK
  262.         AJMP START
  263. //===============================显示程序==============
  264. DISPLAY:MOV DPTR,#DAT1         //查表显示程序,利用P0口做段选码口输出/P2低三位做位选码输出,
  265.         MOV A,R3
  266.         MOVC A,@A+DPTR
  267.         MOV P2,#0feH
  268.         MOV P0,A
  269.         ACALL DELAY
  270.         MOV DPTR,#DAT2
  271.         MOV A,R5
  272.         MOVC A,@A+DPTR
  273.         MOV P2,#0fdH
  274.         MOV P0,A
  275.         ACALL DELAY
  276.         MOV A,R4
  277.         MOVC A,@A+DPTR
  278.         MOV P2,#0fbH
  279.         MOV P0,A
  280.         ACALL DELAY
  281.         RET
  282. DAT1:DB 00h,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh,00H,71H  
  283. //"灭","1","2","3","4","5","6","7","8","9","灭","F"
  284. DAT2:DB 3fh,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh,00H,71H
  285. //第一个为零,其他与上相同,因为十位如果为零显示熄灭
  286. //================加减时间延时(起到不会按下就加N个数)=========
  287. DELAY1: MOV 35H,#08H
  288. LOOP0:  ACALL DISPLAY
  289.         DJNZ 35H,LOOP0
  290.        RET
  291. //=====================延时(显示和去抖动用到)================
  292. DELAY:  MOV 32H,#12H
  293. LOOP:   MOV 33H,#0AFH
  294. LOOP1:  DJNZ 33H,LOOP1
  295.         DJNZ 32H,LOOP
  296.     RET
  297. //============================发声程序=======================
  298. BARK:   SETB RING
  299.         ACALL DELAY1
  300.         ACALL DELAY1
  301.         CLR RING                  //按键发声
  302.     RET
  303. //=======================TO溢出中断(响铃程序)=======================
  304. T0INT:  MOV TH0,#0ECH
  305.         MOV TL0,#0FFH
  306.         JNB RING,OUT;
  307.         CPL P3.7                //RING标志位为1时候P3.7口不断取反使喇叭发出一定频率的声音
  308. OUT:    RETI
  309. //========================T1溢出中断(计时程序)===============
  310. T1INT:  MOV TH1,#3CH
  311.         MOV TL1,#0B0H
  312.     INC R0
  313.     RETI
  314. //===========================INTT0中断服务程序==========
  315. INTT0:MOV DATA0,P1      
  316.             CLR EX0
  317.            RETI
  318.         END
复制代码

晓晓江南
5楼-- · 2019-07-19 08:38
 精彩回答 2  元偷偷看……

一周热门 更多>