⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 qdq_8.sdi

📁 八路抢答器说明
💻 SDI
字号:
,,,;============================================================
,,,;================    八路抢答器程序   =======================
,,,;================        李方方       =======================
,,,;================    2008  年  6 月   =======================
,,,;============================================================
,,,        OK EQU 20H;抢答开始标志位
,,,
,,,        RING EQU 22H;响铃标志位
,,,
,,,        ORG 0000H
,,,
0000,01 40,,        AJMP MAIN
,,,
,,,        ORG 0003H
,,,
0003,01 BB,,        AJMP INT0SUB
,,,
,,,        ORG 000BH
,,,
000B,41 93,,        AJMP T0INT
,,,
,,,        ORG 0013H
,,,
0013,01 F0,,        AJMP INT1SUB
,,,
,,,        ORG 001BH
,,,
001B,41 9F,,        AJMP T1INT
,,,
,,,        ORG 0040H
,,,
0040,79 1E,MAIN,MAIN:   MOV R1,#30;初设抢答时间为30s
,,,
0042,7A 3C,,        MOV R2,#60;初设答题时间为60s
,,,
0044,75 89 11,,        MOV TMOD,#11H;设置未定时器/模式1
,,,
0047,75 8C F0,,        MOV TH0,#0F0H
,,,
004A,75 8A FF,,        MOV TL0,#0FFH;越高发声频率越高,越尖
,,,
004D,75 8D 3C,,        MOV TH1,#3CH
,,,
0050,75 8B B0,,        MOV TL1,#0B0H;50ms为一次溢出中断
,,,
0053,D2 AF,,        SETB EA
,,,
0055,D2 A9,,        SETB ET0
,,,
0057,D2 AB,,        SETB ET1
,,,
0059,D2 A8,, SETB EX0
,,,
005B,D2 AA,, SETB EX1;允许四个中断,T0/T1/INT0/INT1
,,,
005D,C2 20,,        CLR OK
,,,
005F,C2 22,, CLR RING
,,,
0061,D2 8E,,         SETB TR1
,,,
0063,D2 8C,,         SETB TR0;一开始就运行定时器,以开始显示FFF.如果想重新计数,重置TH1/TL1就可以了
,,,
,,,;=====查询程序=====
,,,
0065,7D 0B,START,START:   MOV R5,#0BH
,,,
0067,7C 0B,,         MOV R4,#0BH
,,,
0069,7B 0B,,         MOV R3,#0BH
,,,
006B,51 1E,, ACALL DISPLAY;未开始抢答时候显示FFF
,,,
006D,20 B0 11,,         JB P3.0,NEXT;ddddddd
,,,
0070,51 61,,         ACALL DELAY
,,,
0072,20 B0 0C,,         JB P3.0,NEXT;去抖动,如果"开始键"按下就向下执行,否者跳到非法抢答查询
,,,
0075,51 8A,,         ACALL BARK;按键发声
,,,
0077,E9,,         MOV A,R1
,,,
0078,FE,,  MOV R6,A;送R1->R6,因为R1中保存了抢答时间
,,,
0079,D2 20,,     SETB OK;抢答标志位,用于COUNT只程序中判断是否查询抢答
,,,
007B,7F 01,,     MOV R7,#01H  ;读抢答键数据信号标志,这里表示只读一次有用信号
,,,
007D,7B 0A,,     MOV R3,#0AH;抢答只显示计时,灭号数
,,,
007F,21 29,,        AJMP COUNT;进入倒计时程序,"查询有效抢答的程序"在COUNT里面
,,,
0081,30 90 17,NEXT,NEXT:   JNB P1.0,FALSE1
,,,
0084,30 91 18,,    JNB P1.1,FALSE2
,,,
0087,30 92 19,,    JNB P1.2,FALSE3
,,,
008A,30 93 1A,,    JNB P1.3,FALSE4
,,,
008D,30 94 1B,,    JNB P1.4,FALSE5
,,,
0090,30 95 1C,,    JNB P1.5,FALSE6
,,,
0093,30 96 1D,,    JNB P1.6,FALSE7
,,,
0096,30 97 1E,,    JNB P1.7,FALSE8
,,,
0099,01 65,,    AJMP START
,,,
,,,;=====非法抢答处理程序=====
,,,
009B,7B 01,FALSE1,FALSE1: MOV R3,#01H
,,,
009D,21 EA,,        AJMP ERROR
,,,
009F,7B 02,FALSE2,FALSE2: MOV R3,#02H
,,,
00A1,21 EA,,        AJMP ERROR
,,,
00A3,7B 03,FALSE3,FALSE3: MOV R3,#03H
,,,
00A5,21 EA,,        AJMP ERROR
,,,
00A7,7B 04,FALSE4,FALSE4: MOV R3,#04H
,,,
00A9,21 EA,,        AJMP ERROR
,,,
00AB,7B 05,FALSE5,FALSE5: MOV R3,#05H
,,,
00AD,21 EA,,        AJMP ERROR
,,,
00AF,7B 06,FALSE6,FALSE6: MOV R3,#06H
,,,
00B1,21 EA,,        AJMP ERROR
,,,
00B3,7B 07,FALSE7,FALSE7: MOV R3,#07H
,,,
00B5,21 EA,,        AJMP ERROR
,,,
00B7,7B 08,FALSE8,FALSE8: MOV R3,#08H
,,,
00B9,21 EA,,        AJMP ERROR
,,,
,,,
,,,;=====INT0(抢答时间R1调整程序)=====
,,,
00BB,E9,INT0SUB,INT0SUB:MOV A,R1
,,,
00BC,75 F0 0A,,        MOV B,#0AH
,,,
00BF,84,,         DIV AB
,,,
00C0,FD,,         MOV R5,A
,,,
00C1,AC F0,,         MOV R4,B
,,,
00C3,7B 0A,,         MOV R3,#0AH
,,,
00C5,51 1E,,         ACALL DISPLAY;先在两个时间LED上显示R1
,,,
00C7,30 B4 08,,         JNB P3.4,INC0;P3.4为+1s键,如按下跳到INCO
,,,
00CA,30 B5 14,,         JNB P3.5,DEC0;P3.5为-1s键,如按下跳到DECO
,,,
00CD,30 B1 1F,,         JNB P3.1,BACK0;P3.1为确定键,如按下跳到BACKO
,,,
00D0,01 BB,,    AJMP INT0SUB
,,,
00D2,E9,INC0,INC0:   MOV A,R1
,,,
00D3,B4 63 06,,CJNE A,#63H,ADD0;如果不是99,R2加1,如果加到99,R1就置0,重新加起。
,,,
00D6,79 00,,        MOV R1,#00H
,,,
00D8,51 58,,        ACALL DELAY1
,,,
00DA,01 BB,,AJMP INT0SUB
,,,
00DC,09,ADD0,ADD0:   INC R1
,,,
00DD,51 58,,        ACALL DELAY1
,,,
00DF,01 BB,,        AJMP INT0SUB
,,,
00E1,E9,DEC0,DEC0:   MOV A,R1
,,,
00E2,60 05,,    JZ SETR1;如果R1为0, R1就置99,
,,,
00E4,19,,    DEC R1
,,,
00E5,51 58,,    ACALL DELAY1
,,,
00E7,01 BB,,    AJMP INT0SUB
,,,
00E9,79 63,SETR1,SETR1:  MOV R1,#63H
,,,
00EB,51 58,,        ACALL DELAY1
,,,
00ED,01 BB,,        AJMP INT0SUB
,,,
00EF,32,BACK0,BACK0:  RETI
,,,
,,,;=====INT1(回答时间R2调整程序)=====
,,,
00F0,EA,INT1SUB,INT1SUB:MOV A,R2
,,,
00F1,75 F0 0A,,        MOV B,#0AH
,,,
00F4,84,,    DIV AB
,,,
00F5,FD,,MOV R5,A
,,,
00F6,AC F0,,    MOV R4,B
,,,
00F8,7B 0A,,    MOV R3,#0AH
,,,
00FA,51 1E,,    ACALL DISPLAY
,,,
00FC,30 B4 08,,    JNB P3.4,INC1
,,,
00FF,30 B5 14,,    JNB P3.5,DEC1
,,,
0102,30 B1 1F,,    JNB P3.1,BACK1
,,,
0105,01 F0,,    AJMP INT1SUB
,,,
0107,EA,INC1,INC1:   MOV A,R2
,,,
0108,B4 63 06,,    CJNE A,#63H,ADD1
,,,
010B,7A 00,,        MOV R2,#00H
,,,
010D,51 58,,        ACALL DELAY1
,,,
010F,01 F0,,AJMP INT1SUB
,,,
0111,0A,ADD1,ADD1:   INC R2
,,,
0112,51 58,,        ACALL DELAY1
,,,
0114,01 F0,,        AJMP INT1SUB
,,,
0116,EA,DEC1,DEC1:   MOV A,R2
,,,
0117,60 05,,    JZ SETR2
,,,
0119,1A,,    DEC R2
,,,
011A,51 58,,    ACALL DELAY1
,,,
011C,01 F0,,    AJMP INT1SUB
,,,
011E,7A 63,SETR2,SETR2:  MOV R2,#63H
,,,
0120,51 58,,        ACALL DELAY1
,,,
0122,01 F0,,        AJMP INT1SUB
,,,
0124,32,BACK1,BACK1:  RETI
,,,
,,,;=====倒计时程序(抢答倒计时和回答倒计时都跳到改程序)=====
,,,
0125,EA,REPEAT,REPEAT:MOV A,R2     ;使用锦囊时重新计时
,,,
0126,FE,,       MOV R6,A
,,,
0127,C2 22,,       CLR RING
,,,
0129,78 00,COUNT,COUNT:  MOV R0,#00H;重置定时器中断次数
,,,
012B,75 8D 3C,,        MOV TH1,#3CH
,,,
012E,75 8B B0,,        MOV TL1,#0B0H;重置定时器
,,,
0131,EE,RECOUNT,RECOUNT:MOV A,R6;R6保存了倒计时的时间,之前先将抢答时间或回答时间给R6
,,,
0132,75 F0 0A,,        MOV B,#0AH
,,,
0135,84,,    DIV AB;除十分出个位/十位
,,,
0136,F5 30,,    MOV 30H,A;十位存于(30H)
,,,
0138,85 F0 31,,    MOV 31H,B;个位存于(31H)
,,,
013B,AD 30,,    MOV R5,30H;取十位
,,,
013D,AC 31,,    MOV R4,31H;取个位
,,,
013F,EE,,    MOV A,R6
,,,
0140,94 07,,    SUBB A,#07H
,,,
0142,50 15,,    JNC LARGER;大于5s跳到LARGER,小于等于5s会提醒
,,,
0144,E8,,    MOV A,R0
,,,
0145,B4 0A 04,,        CJNE A,#0AH,FULL;1s中0.5s向下运行
,,,
0148,C2 22,,    CLR RING
,,,
014A,21 60,,    AJMP CHECK
,,,
014C,B4 14 11,FULL,FULL:   CJNE A,#14H,CHECK;下面是1s的情况,响并显示号数并清R0,重新计
,,,
014F,D2 22,,        SETB RING
,,,
0151,EE,,        MOV A,R6
,,,
0152,60 40,,    JZ QUIT;计时完毕
,,,
0154,78 00,,    MOV R0,#00H
,,,
0156,1E,,    DEC R6;一秒标志减1
,,,
0157,21 60,,    AJMP CHECK
,,,
0159,E8,LARGER,LARGER: MOV A,R0
,,,
015A,B4 14 03,,        CJNE A,#14H,CHECK;如果1s向下运行,否者跳到查"停/显示"
,,,
015D,1E,,    DEC R6;计时一秒R6自动减1
,,,
015E,78 00,,    MOV R0,#00H
,,,
0160,30 B1 31,CHECK,CHECK: JNB P3.1,QUIT;如按下停止键退出
,,,
0163,30 20 02,,       JNB OK,CHECKK      ;只在回答倒计时才有效
,,,
0166,21 6B,,       AJMP NEXTT
,,,
0168,30 B0 BA,CHECKK,CHECKK:JNB P3.0,REPEAT    ;判断是否使用锦囊
,,,
016B,51 1E,NEXTT,NEXTT:  ACALL DISPLAY
,,,
016D,20 20 02,,   JB OK,ACCOUT;如果是抢答倒计时,如是则查询抢答,否者跳过查询继续倒数(这里起到锁抢答作用)
,,,
0170,21 31,,   AJMP RECOUNT
,,,
0172,,ACCOUT,ACCOUT:
0172,E5 36,,        MOV A,36H
,,,
0174,30 E0 23,,       JNB ACC.0,TRUE1
,,,
0177,30 E1 2A,,       JNB ACC.1,TRUE2
,,,
017A,30 E2 31,,       JNB ACC.2,TRUE3
,,,
017D,30 E3 38,,       JNB ACC.3,TRUE4
,,,
0180,30 E4 3F,,       JNB ACC.4,TRUE5
,,,
0183,30 E5 46,,       JNB ACC.5,TRUE6
,,,
0186,30 E6 05,,       JNB ACC.6,TZ1
,,,
0189,30 E7 05,,       JNB ACC.7,TZ2
,,,
018C,21 31,,       AJMP RECOUNT
,,,
018E,02 01 D6,TZ1, TZ1:JMP TRUE7
,,,
0191,02 01 E0,TZ2, TZ2:JMP TRUE8
0194,C2 20,QUIT, QUIT:  CLR OK;如果按下了"停止键"执行的程序
,,,
0196,C2 22,,   CLR RING
,,,
0198,01 65,,   AJMP START
,,,
,,,;=====正常抢答处理程序=====
,,,
019A,51 8A,TRUE1,TRUE1: ACALL BARK
,,,
019C,EA,,       MOV A,R2
,,,
019D,FE,,   MOV R6,A;抢答时间R2送R6
,,,
019E,7B 01,,   MOV R3,#01H
,,,
01A0,C2 20,,   CLR OK;因为答题的计时不再查询抢答,所以就锁了抢答
,,,
01A2,21 29,,   AJMP COUNT
,,,
01A4,51 8A,TRUE2,TRUE2:ACALL BARK
,,,
01A6,EA,,      MOV A,R2
,,,
01A7,FE,,  MOV R6,A
,,,
01A8,7B 02,,  MOV R3,#02H
,,,
01AA,C2 20,,  CLR OK
,,,
01AC,21 29,,  AJMP COUNT
,,,
01AE,51 8A,TRUE3,TRUE3:ACALL BARK
,,,
01B0,EA,,      MOV A,R2
,,,
01B1,FE,,  MOV R6,A
,,,
01B2,7B 03,,  MOV R3,#03H
,,,
01B4,C2 20,,  CLR OK
,,,
01B6,21 29,,  AJMP COUNT
,,,
01B8,51 8A,TRUE4,TRUE4:ACALL BARK
,,,
01BA,EA,,      MOV A,R2
,,,
01BB,FE,,    MOV R6,A
,,,
01BC,7B 04,,    MOV R3,#04H
,,,
01BE,C2 20,,    CLR OK
,,,
01C0,21 29,,    AJMP COUNT
,,,
01C2,51 8A,TRUE5,TRUE5:ACALL BARK
,,,
01C4,EA,,        MOV A,R2
,,,
01C5,FE,,    MOV R6,A
,,,
01C6,7B 05,,    MOV R3,#05H
,,,
01C8,C2 20,,    CLR OK
,,,
01CA,21 29,,    AJMP COUNT
,,,
01CC,51 8A,TRUE6,TRUE6: ACALL BARK
,,,
01CE,EA,,        MOV A,R2
,,,
01CF,FE,,    MOV R6,A
,,,
01D0,7B 06,,    MOV R3,#06H
,,,
01D2,C2 20,,    CLR OK
,,,
01D4,21 29,,    AJMP COUNT
,,,
01D6,51 8A,TRUE7,TRUE7:ACALL BARK
,,,
01D8,EA,,        MOV A,R2
,,,
01D9,FE,,    MOV R6,A
,,,
01DA,7B 07,,    MOV R3,#07H
,,,
01DC,C2 20,,    CLR OK
,,,
01DE,21 29,,    AJMP COUNT
,,,
01E0,51 8A,TRUE8,TRUE8:ACALL BARK
,,,
01E2,EA,,        MOV A,R2
,,,
01E3,FE,,    MOV R6,A
,,,
01E4,7B 08,,    MOV R3,#08H
,,,
01E6,C2 20,,    CLR OK
,,,
01E8,21 29,,    AJMP COUNT
,,,;=====犯规抢答程序=====
,,,
01EA,78 00,ERROR,ERROR:  MOV R0,#00H
,,,
01EC,75 8D 3C,,        MOV TH1,#3CH
,,,
01EF,75 8B B0,,        MOV TL1,#0B0H
,,,
01F2,8B 34,,        MOV 34H,R3;犯规号数暂存与(34H)
,,,
01F4,E8,HERE,HERE:   MOV A,R0
,,,
01F5,B4 06 0A,,       CJNE A,#06H,FLASH;0.3s向下运行->灭并停响
,,,
01F8,C2 22,,    CLR RING
,,,
01FA,7B 0A,,    MOV R3,#0AH
,,,
01FC,7C 0A,,    MOV R4,#0AH
,,,
01FE,7D 0A,,        MOV R5,#0AH;三灯全灭
,,,
0200,41 11,,    AJMP CHECK1
,,,
0202,B4 0C 0C,FLASH,FLASH:  CJNE A,#0CH,CHECK1;下面是0.8s的情况,响并显示号数并清R0,重新计
,,,
0205,D2 22,,        SETB RING
,,,
0207,78 00,,        MOV R0,#00H
,,,
0209,AB 34,,    MOV R3,34H;取回号数
,,,
020B,7D 0B,,    MOV R5,#0BH
,,,
020D,7C 0B,,        MOV R4,#0BH;显示FF和号数
,,,
020F,41 11,,    AJMP CHECK1
,,,
0211,30 B1 04,CHECK1,CHECK1: JNB P3.1,QUIT1
,,,
0214,51 1E,,        ACALL DISPLAY
,,,
0216,21 F4,,    AJMP HERE
,,,
0218,C2 22,QUIT1,QUIT1:  CLR RING
,,,
021A,C2 20,,        CLR OK
,,,
021C,01 65,,    AJMP START
,,,
,,,;=====显示程序=====
,,,
021E,90 02 40,DISPLAY,DISPLAY:MOV DPTR,#DAT1;查表显示程序,利用P0口做段选码口输出/P2低三位做位选码输出,
,,,
0221,EB,,        MOV A,R3
,,,
0222,93,,    MOVC A,@A+DPTR
,,,
0223,75 A0 FE,,  MOV P2,#0feH
,,,
0226,F5 80,,  MOV P0,A
,,,
0228,51 6E,,  ACALL DELAY2
,,,
022A,90 02 4C,,  MOV DPTR,#DAT2
,,,
022D,ED,,  MOV A,R5
,,,
022E,93,,  MOVC A,@A+DPTR
,,,
022F,75 A0 FD,,  MOV P2,#0fdH
,,,
0232,F5 80,,  MOV P0,A
,,,
0234,51 6E,,  ACALL DELAY2
,,,
0236,EC,,  MOV A,R4
,,,
0237,93,,  MOVC A,@A+DPTR
,,,
0238,75 A0 FB,,  MOV P2,#0fbH
,,,
023B,F5 80,,  MOV P0,A
,,,
023D,51 6E,,  ACALL DELAY2
,,,
023F,22,,  RET
,,,
0240,00 06 5B 4F,DAT1,DAT1:DB 00h,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh,00H,71H
,,,
,,,;"灭","1","2","3","4","5","6","7","8","9","灭","F"
,,,
024C,3F 06 5B 4F,DAT2,DAT2:DB 3fh,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh,00H,71H
,,,
,,,;第一个为零,其他与上相同,因为十位如果为零显示熄灭
,,,
,,,;====加减时间延时(起到不会按下就加N个数)======
,,,
0258,75 35 08,DELAY1,DELAY1: MOV 35H,#08H
,,,
025B,51 1E,LOOP0,LOOP0:  ACALL DISPLAY
,,,
025D,D5 35 FB,,        DJNZ 35H,LOOP0
,,,
0260,22,,        RET
,,,
,,,;=====延时4236个机器周期(去抖动用到)=====
,,,
0261,75 32 12,DELAY,DELAY:  MOV 32H,#12H
,,,
0264,75 33 AF,LOOP,LOOP:   MOV 33H,#0AFH
,,,
0267,D5 33 FD,LOOP1,LOOP1:  DJNZ 33H,LOOP1
,,,
026A,D5 32 F7,,        DJNZ 32H,LOOP
,,,
026D,22,,    RET
,,,
,,,;=====延时4236个机器周期(显示用到)=====
,,,
026E,75 32 43,DELAY2,DELAY2:  MOV 32H,#43H
,,,
0271,75 33 1E,LOOP3,LOOP3:   MOV 33H,#1EH
,,,
0274,EF,,         MOV A,R7           ;每隔60~70个机器周期读一次P1口,全为1时为无效数据,继续读,有一个不为1时,转
,,,
0275,70 07,,         JNZ  AAAA1         ;没读到有效数据时继续转到AAAA1
,,,
0277,D5 33 FD,LOOP2,LOOP2:  DJNZ 33H,LOOP2
,,,
027A,D5 32 F4,,        DJNZ 32H,LOOP3
,,,
027D,22,,    RET
,,,
,,,;=====读抢答按键数据口程序=====
,,,
,,,;由于在读抢答数据口的时候,单片机首先进入倒计时程序,再调用显示程序,最后才检测按键口
,,,;然而在检测按键口时动态扫描要调用三次(4ms)延时程序.这样就会导致读数据口出现滞后,造成1号优先最高.8号

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -