找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机抢答器汇编代码与仿真(带抢答和回答时间调整键按键)

[复制链接]
跳转到指定楼层
楼主
这个proteus仿真文件有抢答时间调整键,回答时间调整键等功能,采用单片机控制4位数码管显示.
51单片机抢答器仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)


单片机源程序如下:
  1.           OK EQU 20H              //抢答开始标志位
  2.          RING EQU 22H            //响铃标志位  
  3.      DATA0 EQU 36H             //抢答按键口数据存放地址  
  4.      ORG 0000H
  5.      AJMP MAIN
  6.      ORG 0004H   
  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 IT0
  24.      MOV IE,#81H
  25.      SETB ET1                  //允许二个中断,T0/T1
  26.      CLR OK
  27.      SETB TR1
  28.      SETB TR0
  29.          ACALL START                           //一开始就运行定时器,以开始显示FFF.如果想重新计数,重置TH1/TL1就可以了
  30.      SJMP $
  31. START:MOV DATA0,#0FFH           //初始化  
  32.       MOV R5,#0BH
  33.       MOV R4,#0BH
  34.       MOV R3,#0BH
  35.       ACALL DISPLAY            //未开始抢答时候显示FFF  
  36.       JNB P3.3,SELSUB0
  37.       JNB P3.4,TZ3               //倒计时调整  
  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. FALSE1:MOV R3,#01H
  61.        AJMP ERROR
  62. FALSE2:MOV R3,#02H
  63.        AJMP ERROR
  64. FALSE3:MOV R3,#03H
  65.        AJMP ERROR
  66. FALSE4:MOV R3,#04H
  67.        AJMP ERROR
  68. FALSE5:MOV R3,#05H
  69.        AJMP ERROR
  70. FALSE6:MOV R3,#06H
  71.        AJMP ERROR
  72. FALSE7:MOV R3,#07H
  73.        AJMP ERROR
  74. FALSE8:MOV R3,#08H
  75.        AJMP ERROR

  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.          LCALL 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         //如果不是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:MOV A,R2
  105.         MOV B,#0AH
  106.         DIV AB
  107.         MOV R5,A
  108.         MOV R4,B
  109.         MOV R3,#0AH
  110.         ACALL DISPLAY
  111.         JNB P3.5,INC1
  112.         JNB P3.6,DEC1
  113.         JNB P3.1,BACK1
  114.             AJMP SELSUB1
  115. INC1:MOV A,R2
  116.      CJNE A,#63H,ADD1
  117.      MOV R2,#00H
  118.      ACALL DELAY1
  119.      AJMP SELSUB1
  120. ADD1:INC R2
  121.      ACALL DELAY1  
  122.      AJMP SELSUB1
  123. DEC1:MOV A,R2
  124.      JZ SETR2
  125.      DEC R2
  126.      ACALL DELAY1
  127.      AJMP SELSUB1
  128. SETR2:MOV R2,#63H
  129.       ACALL DELAY1
  130.       AJMP SELSUB1
  131. BACK1:AJMP START

  132. REPEAT:MOV A,38h                      //使用锦囊时重新计时
  133.        MOV R6,A
  134.        CLR RING                       //当倒计时进入最后5秒的时候,启用锦囊能消除蜂鸣

  135. COUNT:MOV R0,#00H                     //重置定时器中断次数
  136.       MOV TH1,#3CH
  137.       MOV TL1,#0B0H                 //重置定时器
  138. RECOUNT:MOV A,R6                   //R6保存了倒计时的时间,之前先将抢答时间或回答时间给R6
  139.         MOV B,#0AH
  140.         DIV AB                       //除十分出个位/十位
  141.         MOV 30H,A                   //十位存于(30H)  
  142.         MOV 31H,B                   //个位存于(31H)  
  143.         MOV R5,30H                  //取十位
  144.         MOV R4,31H                  //取个位
  145.         MOV A,R6
  146.         SUBB A,#07H
  147.         JNC LARGER                  //大于5s跳到LARGER,小于等于5s会提醒
  148.         MOV A,R0
  149.         CJNE A,#0AH,FULL            //1s中0.5s向下运行
  150.         CLR RING  
  151.         AJMP CHECK
  152. FULL:CJNE A,#14H,CHECK               //下面是1s的情况,响并显示号数并清R0,重新计数
  153.      SETB RING
  154.      MOV A,R6
  155.      JZ QUIT                        //计时完毕
  156.      MOV R0,#00H
  157.      DEC R6                              //一秒标志减1
  158.      AJMP CHECK
  159. LARGER:MOV A,R0
  160.        CJNE A,#14H,CHECK           //如果1s向下运行
  161.        DEC R6                     //计时一秒R6自动减1
  162.        MOV R0,#00H
  163. CHECK:JNB P3.1,QUIT               //如按下停止键退出
  164.       JNB OK,CHECKK            //只在回答倒计时才有效  
  165.       AJMP NEXTT
  166. CHECKK:JNB P3.0,REPEAT            //判断是否使用锦囊
  167. NEXTT: ACALL DISPLAY
  168.        JB OK,ACCOUT              //如果是抢答倒计时,如是则查询抢答,否者跳过查询继续倒数(这里起到锁抢答作用)  
  169.        AJMP RECOUNT
  170. ACCOUT:MOV A,DATA0  
  171.           JNB ACC.0,TRUE1
  172.           JNB ACC.1,TRUE2
  173.           JNB ACC.2,TRUE3
  174.           JNB ACC.3,TRUE4
  175.           JNB ACC.4,TRUE5
  176.           JNB ACC.5,TRUE6
  177.           JNB ACC.6,TZ7
  178.           JNB ACC.7,TZ8
  179.           AJMP RECOUNT
  180. TZ7:AJMP TRUE7
  181. TZ8:AJMP TRUE8
  182. QUIT:CLR OK                   //如果按下了“停止键”执行的程序
  183.      CLR RING
  184.      AJMP START
  185. TRUE1:ACALL BARK
  186.       MOV A,R2
  187.       MOV R6,A               //抢答时间R2送R6
  188.       MOV R3,#01H
  189.       CLR OK                  //因为答题的计时不再查询抢答,所以就锁了抢答
  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. ERROR: MOV R0,#00H
  234.         MOV TH1,#3CH
  235.         MOV TL1,#0B0H
  236.         MOV 34H,R3                 //犯规号数暂存与(34H)  
  237. HERE: MOV A,R0
  238.         CJNE A,#06H,FLASH         //0.3s向下运行->灭并停响
  239.         CLR RING  
  240.         MOV R3,#0AH
  241.         MOV R4,#0AH
  242.         MOV R5,#0AH              //三灯全灭
  243.         AJMP CHECK1  
  244. FLASH: CJNE A,#0CH,CHECK1        //下面是0.8s的情况,响并显示号数并清R0,重新计
  245.         SETB RING
  246.         MOV R0,#00H
  247.         MOV R3,34H                //取回号数
  248.         MOV R5,#0BH
  249.         MOV R4,#0BH              //显示FF和号数
  250.         AJMP CHECK1
  251. CHECK1: JNB P3.1,QUIT1
  252.         ACALL DISPLAY
  253.         AJMP HERE
  254. QUIT1:  CLR RING
  255.         CLR OK
  256.         AJMP START
  257. DISPLAY:MOV DPTR,#DAT1           //查表显示程序,利用P0口做段选码口输出/P2低三位做位选码输出  
  258.         MOV A,R3
  259.         MOVC A,@A+DPTR
  260.         MOV P2,#0feH
  261.         MOV P0,A
  262.         ACALL DELAY
  263.         MOV DPTR,#DAT2
  264.         MOV A,R5
  265.         MOVC A,@A+DPTR
  266.         MOV P2,#0fdH
  267.         MOV P0,A
  268.         ACALL DELAY
  269.         MOV A,R4
  270.         MOVC A,@A+DPTR
  271.         MOV P2,#0fbH
  272.         MOV P0,A
  273. ……………………

  274. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
改2.0.zip (49.88 KB, 下载次数: 43)




分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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