📄 8.lst
字号:
页 1
01-29-03
01:45:43
伟福汇编器 V5.00 Copyright (c) 1989, 2001 by CHY
地址 机器码 源程序
;*************************************
;* *
;* 自 动 往 返 小 汽 车 *
;* 2001年9月 *
;*************************************
;
;
;
;*************************************
;* *
;* 主程序和中断程序入口 *
;* *
;*************************************
;
ORG 0000H ;程序执行起始地址
0000 020060 LJMP START ;跳至START
ORG 0003H ;外中断0入口
0003 020078 LJMP INTEX0 ;跳至INTEX0中断服务程序
ORG 000BH ;定时器T0中断入口
000B 32 RETI ;中断返回
ORG 0013H ;外中断1入口
0013 020102 LJMP INTEX1 ;跳至INTEX1中断服务程序
ORG 001BH ;定时器T1中断入口
001B 020140 LJMP INTT1 ;跳至INTT1中断服务程序
ORG 0023H ;串口中断入口
0023 32 RETI ;中断返回
ORG 002BH ;定时器T2中断入口
002B 32 RETI ;中断返回
;
;***************************
;* *
;* 初始化程序 *
;* *
;****************************
002C 7870 CLEARMEMIO: MOV R0, #70H ;清70H-76H显示单元
002E 7F07 MOV R7, #07H ;循环次数
0030 7600 ML0: MOV @R0, #00H ;清0
0032 08 INC R0 ;下一地址
0033 DFFB DJNZ R7, ML0 ;未完再循环
0035 758910 MOV TMOD,#10H ;T1为16位定时器
0038 7C14 MOV R4,#14H ;1秒定时用(50毫秒20次)
003A 758BB0 MOV TL1,#0B0H ;50毫秒定时用初值
003D 758D3C MOV TH1,#3CH ;
0040 752000 MOV 20H,#00H ;清0操作
0043 752100 MOV 21H,#00H ;
0046 752200 MOV 22H,#00H ;
0049 752300 MOV 23H,#00H ;
004C 752400 MOV 24H,#00H ;
C:\MY DOCUMENTS\2003.02.12书稿\配套光盘源程序\实例8\8.ASM
页 2
01-29-03
01:45:43
伟福汇编器 V5.00 Copyright (c) 1989, 2001 by CHY
地址 机器码 源程序
004F C230 CLR 30H ;清停车标志
0051 D2AB SETB ET1 ;开T1中断
0053 D2AA SETB EX1 ;开外中断1
0055 D28A SETB IT1 ;外中断1采用边沿触发
0057 D288 SETB IT0 ;外中断0优先级为1(最高)
0059 D2A8 SETB EX0 ;开外中断0
005B D2AF SETB EA ;开总中断允许
005D D28E SETB TR1 ;开启定时器T1
005F 22 RET ;子程序返回
;
;*************************************
;* *
;* 主 程 序 *
;* *
;*************************************
;
0060 12002C START: LCALL CLEARMEMIO ;上电初始化
0063 D296 SETB P1.6 ;选择7.5V输出
0065 C297 CLR P1.7 ;选择7.5V输出
0067 D2B7 SETB P3.7 ;前进状态
0069 C2B6 CLR P3.6 ;前进状态
006B C290 CLR P1.0 ;电机供电开始
006D 120186 MAIN: LCALL DISP ;LED显示一次
0070 02006D LJMP MAIN ;转MAIN循环
0073 00 NOP ;PC值出错处理
0074 00 NOP
0075 020060 LJMP START ;重新初始化
;
;*************************************
;* *
;*外中断0服务程序,用作跑道位置处理 *
;* 23H作跑道计数器 *
;*************************************
0078 C0E0 INTEX0: PUSH ACC ;堆栈保护
007A C0D0 PUSH PSW ;
007C C2A8 CLR EX0 ;关中断
007E 120186 LCALL DISP ;LED显示一次(延时抗干扰)
0081 20B225 JB P3.2,IN0RET ;P3.2为1退出(干扰)
0084 0523 INC 23H ;跑道计数器加1
0086 E523 MOV A,23H ;数据入A
0088 B40606 CJNE A,#06H,JUDGE1 ;不是第6道转JUDGE1
008B 1200D0 LCALL STOP ;是第6道,停车
008E 0200A9 LJMP IN0RET ;转中断退出
0091 B40306 JUDGE1: CJNE A,#03H,JUDGE2 ;不是第3道转JUDGE2
0094 1200B5 LCALL STOPSLOW ;是第3道,变慢车
0097 0200A9 LJMP IN0RET ;转中断退出
009A B40406 JUDGE2: CJNE A,#04H,JUDGE3 ;不是第4道转JUDGE3
009D 1200CB LCALL FAST ;是第4道,变快车
C:\MY DOCUMENTS\2003.02.12书稿\配套光盘源程序\实例8\8.ASM
页 3
01-29-03
01:45:43
伟福汇编器 V5.00 Copyright (c) 1989, 2001 by CHY
地址 机器码 源程序
00A0 0200A9 LJMP IN0RET ;转中断退出
00A3 B40503 JUDGE3: CJNE A,#05H,IN0RET ;不是第5道转INORET退出
00A6 1200B5 LCALL STOPSLOW ;是第5道,变慢车
00A9 C289 IN0RET: CLR IE0 ;清外中断0中断标志
00AB D0D0 POP PSW ;恢复现场
00AD D0E0 POP ACC ;
00AF 1201D6 LCALL DL7MS ;延时7毫秒(抗干扰)
00B2 D2A8 SETB EX0 ;开外中断0
00B4 32 RETI ;中断返回
;
;************************************
;* 慢车控制子程序 *
;************************************
00B5 C296 STOPSLOW: CLR P1.6 ;关7.5V电源
00B7 B2B6 CPL P3.6 ;反向驱动(刹车)
00B9 B2B7 CPL P3.7 ;反向驱动
00BB 1201B7 LCALL DS50MS ;刹车时间(可根据试车情况调整)
00BE 1201B7 LCALL DS50MS ;
00C1 1201B7 LCALL DS50MS ;
00C4 B2B6 CPL P3.6 ;正向驱动
00C6 B2B7 CPL P3.7 ;正向驱动
00C8 D297 SETB P1.7 ;开4.3V电源
00CA 22 RET ;返回
;
;************************************
;* 快车控制子程序 *
;************************************
00CB C297 FAST: CLR P1.7 ; 关4.3V电源
00CD D296 SETB P1.6 ; 开7.5V电源
00CF 22 RET ;返回
;
;************************************
;* 停车控制程序 *
;************************************
00D0 752300 STOP: MOV 23H,#00H ;跑道计数单元清0
00D3 B2B6 CPL P3.6 ;反向驱动(刹车)
00D5 B2B7 CPL P3.7 ;反向驱动(刹车)
00D7 1201B7 LCALL DS50MS ;刹车时间
00DA 1201B7 LCALL DS50MS ;刹车时间(可调整)
00DD D290 SETB P1.0 ;关电机电源
00DF D2BB SETB PT1 ;定时器T1为高优先级
00E1 1201CA LCALL DS10S ;停车10秒
00E4 C2BB CLR PT1 ;恢复T1为低优先级
00E6 D296 SETB P1.6 ;开7.5V电源(高速)
00E8 C297 CLR P1.7 ;关4.3V
00EA C290 CLR P1.0 ;电机电源开
00EC B230 CPL 30H ;停车点位置判断标志取反
00EE 203003 JB 30H,STREN ;为1(中途停车)转STREN
C:\MY DOCUMENTS\2003.02.12书稿\配套光盘源程序\实例8\8.ASM
页 4
01-29-03
01:45:43
伟福汇编器 V5.00 Copyright (c) 1989, 2001 by CHY
地址 机器码 源程序
00F1 1200F5 LCALL CLR00 ;是终点,调复0程序
00F4 22 STREN: RET ;返回
;
;*********************************
;* 计时清0程序 *
;*********************************
00F5 757000 CLR00: MOV 70H,#00H ;计时单元清0
00F8 757100 MOV 71H,#00H ;计时单元清0
00FB 757200 MOV 72H,#00H ;计时单元清0
00FE 757300 MOV 73H,#00H ;计时单元清0
0101 22 RET ;返回
;
;*************************************
;* *
;* 外中断1程序,里程计数用 *
;* 20H、21H、22H、24H作计数器 *
;*************************************
0102 C0E0 INTEX1: PUSH ACC ;堆栈保护
0104 C0D0 PUSH PSW ;
0106 C2AA CLR EX1 ;关外中断1
0108 0520 INC 20H ;圈加1
010A E520 LLLL: MOV A,20H ;判断是否满6圈
010C B40621 CJNE A,#06H,LLL ;不满6圈转LLL退出
010F 752000 MOV 20H,#00H ;满6圈清0进位(6圈为1米)
0112 0521 INC 21H ;上位加1
0114 E521 MOV A,21H ;判断是否满10
0116 B40A17 CJNE A,#0AH,LLL ;不满10转LLL
0119 752100 MOV 21H,#00H ; 满10清0进1位
011C 0522 INC 22H ; 高位加1
011E E522 MOV A,22H ; 判断是否满10
0120 B40A0D CJNE A,#0AH,LLL ; 不满10转LLL
0123 752200 MOV 22H,#00H ; 满10清0进1位
0126 0524 INC 24H ; 高位加1
0128 E524 MOV A,24H ; 判断是否满10
012A B40A03 CJNE A,#0AH,LLL ; 不满10转LLL
012D 752400 MOV 24H,#00H ; 满10清0
0130 852174 LLL: MOV 74H,21H ; 将里程数移入显示单元(个位)
0133 852275 MOV 75H,22H ; 将里程数移入显示单元(十位)
0136 852476 MOV 76H,24H ; 将里程数移入显示单元(百位)
0139 D0D0 IN1RET: POP PSW ;恢复堆栈
013B D0E0 POP ACC ;
013D D2AA SETB EX1 ;开外中断1
013F 32 RETI ;中断返回
;
;*************************************
;* 时间计时器程序 *
;* (T1定时中断服务程序) *
;* *
C:\MY DOCUMENTS\2003.02.12书稿\配套光盘源程序\实例8\8.ASM
页 5
01-29-03
01:45:43
伟福汇编器 V5.00 Copyright (c) 1989, 2001 by CHY
地址 机器码 源程序
;*************************************
0140 C0E0 INTT1: PUSH ACC ;堆栈保护
0142 C0D0 PUSH PSW ;
0144 758BB0 MOV TL1,#0B0H ;赋50毫秒定时初值
0147 758D3C MOV TH1,#3CH ;
014A 1C DEC R4 ;减1
014B EC MOV A,R4 ;
014C 701C JNZ RETT0 ;不为0转RETT0
014E 7C14 MOV R4,#14H ;为0(1秒到)重赋初值
0150 7871 MOV R0,#71H ;地址指向71H
0152 316F ACALL ADD1 ;加1秒操作
0154 EB MOV A,R3 ;
0155 C3 CLR C ;
0156 B46000 CJNE A,#60H,CC ;是否为60秒?
0159 400F CC: JC RETT0 ;小于60转RETT0
015B 3181 ACALL CLR0 ;大于或等于60清0
015D 7873 MOV R0,#73H ;指向分计时地址单元
015F 316F ACALL ADD1 ;分加1
0161 EB MOV A,R3 ;
0162 C3 CLR C ;
0163 B46000 CJNE A,#60H,CCC ;是否为60分?
0166 4002 CCC: JC RETT0 ;小于60转RETT0
0168 3181 ACALL CLR0 ;大于或等于60分计时单元清0
016A D0D0 RETT0: POP PSW ;恢复堆栈
016C D0E0 POP ACC ;
016E 32 RETI ;中断返回
;
;;;;;;;;;;;;;; ;;;;
; 加1操作程序 ;
;;;;;;;;;;;;;; ;;;;
016F E6 ADD1: MOV A,@R0 ;取计数值
0170 18 DEC R0 ;指向低一个地址
0171 C4 SWAP A ;计数值高低四位交换
0172 46 ORL A,@R0 ;相或组合成一个数据
0173 2401 ADD A,#01H ;加1
0175 D4 DA A ;十进制调整
0176 FB MOV R3,A ;暂存R3内
0177 540F ANL A,#0FH ;高四位变0
0179 F6 MOV @R0,A ;放回低地址
017A EB MOV A,R3 ;取回R3内数据
017B 08 INC R0 ;地址加1
017C C4 SWAP A ;高低四位交换
017D 540F ANL A,#0FH ;高四位为0
017F F6 MOV @R0,A ;放回原地址
0180 22 RET ;返回
;
;;;;;;;;;;;;;
; 清0程序 ;
C:\MY DOCUMENTS\2003.02.12书稿\配套光盘源程序\实例8\8.ASM
页 6
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -