自动往返电动小汽车系统设计 第5页
CLR PT1 ;恢复T1为低优先级
SETB P1.6 ;开7.5V电源(高速)
CLR P1.7 ;关4.3V
CLR P1.0 ;电机电源开
CPL 30H ;停车点位置判断标志取反
JB 30H,STREN ;为1(中途停车)转STREN
LCALL CLR00 ;是终点,调复0程序
STREN: RET ;返回
CLR00: MOV 70H,#00H ;计时单元清0
MOV 71H,#00H ;计时单元清0
MOV 72H,#00H ;计时单元清0
MOV 73H,#00H ;计时单元清0
RET ;返回
;* 外中断1程序,里程计数用 *
;* 20H、21H、22H、24H作计数器 *
INTEX1: PUSH ACC ;堆栈保护
PUSH PSW ;
CLR EX1 ;关外中断1
INC 20H ;圈加1
LLLL: MOV A,20H ;判断是否满6圈
CJNE A,#06H,LLL ;不满6圈转LLL退出
MOV 20H,#00H ;满6圈清0进位(6圈为1米)
INC 21H ;上位加1
MOV A,21H ;判断是否满10
CJNE A,#0AH,LLL ;不满10转LLL
MOV 21H,#00H ; 满10清0进1位
INC 22H ; 高位加1
MOV A,22H ; 判断是否满10
CJNE A,#0AH,LLL ; 不满10转LLL
MOV 22H,#00H ; 满10清0进1位
INC 24H ; 高位加1
MOV A,24H ; 判断是否满10
CJNE A,#0AH,LLL ; 不满10转LLL
MOV 24H,#00H ; 满10清0
LLL: MOV 74H,21H ; 将里程数移入显示单元(个位)
MOV 75H,22H ; 将里程数移入显示单元(十位)
MOV 76H,24H ; 将里程数移入显示单元(百位)
IN1RET: POP PSW ;恢复堆栈
POP ACC ;
SETB EX1 ;开外中断1
RETI ;中断返回
INTT1: PUSH ACC ;堆栈保护
PUSH PSW ;
MOV TL1,#0B0H ;赋50毫秒定时初值
MOV TH1,#3CH ;
DEC R4 ;减1
MOV A,R4 ;
JNZ RETT0 ;不为0转RETT0
MOV R4,#14H ;为0(1秒到)重赋初值
MOV R0,#71H ;地址指向71H
ACALL ADD1 ;加1秒操作
MOV A,R3 ;
CLR C ;
CJNE A,#60H,CC ;是否为60秒?
CC: JC RETT0 ;小于60转RETT0
ACALL CLR0 ;大于或等于60清0
MOV R0,#73H ;指向分计时地址单元
ACALL ADD1 ;分加1
MOV A,R3 ;
CLR C ;
CJNE A,#60H,CCC ;是否为60分?
CCC: JC RETT0 ;小于60转RETT0
ACALL CLR0 ;大于或等于60分计时单元清0
RETT0: POP PSW ;恢复堆栈
POP ACC ;
RETI ;中断返回
ADD1: MOV A,@R0 ;取计数值
DEC R0 ;指向低一个地址
SWAP A ;计数值高低四位交换
ORL A,@R0 ;相或组合成一个数据
ADD A,#01H ;加1
DA A ;十进制调整
MOV R3,A ;暂存R3内
ANL A,#0FH ;高四位变0
MOV @R0,A ;放回低地址
MOV A,R3 ;取回R3内数据
INC R0 ;地址加1
SWAP A ;高低四位交换
ANL A,#0FH ;高四位为0
MOV @R0,A ;放回原地址
RET ;返回
CLR0: CLR A ;清A
MOV @R0,A ;对应地址单元清0
DEC R0 ;指向低一地址
MOV @R0,A ;清0
RET ;返回
DISP: MOV R1,#70H ;显示数据首址
MOV R5,#0FEH ;扫描字
PLAY: MOV A,R5 ;扫描字入A
MOV P2,A ;从P2口输出
MOV A,@R1 ;取显示数据
MOV DPTR,#TAB ;取段码表首址
MOVC A,@A+DPTR ; 查数据对应段码
MOV P0,A ;段码从P0口输出
LCALL DL1MS ;点亮1毫秒
INC R1 ;指向下显示数地址
上一页 [1] [2] [3] [4] [5] [6] 下一页