jijiaqi.txt
来自「本设计基本实现了计算乘客打的费用、租车行驶里程和显示总金额、里程、单价、时间等基」· 文本 代码 · 共 470 行
TXT
470 行
;出租车计价器源程序:
DAY EQU 6EH;白天单价存储单元
NIGHT EQU 6DH;晚上单价存储单元
DISTANCE EQU 6CH;里程存储单元
HOUR EQU 6BH;小时数存储单元
MIN EQU 6AH;分钟数存储单元
SECOND EQU 69H;秒数存储单元
DANJIA EQU 68H;单价存储单元
M1000 EQU 67H;外部中断次数(霍尔传感器信号)存储单元
MS100 EQU 66H;100MS中断次数存储单元
LEDDISTANCEL EQU 65H;里程显示缓冲单元
LEDDISTANCEH EQU 64H;
LEDZONGL EQU 62H;总金额显示缓冲单元
LEDZONGZ EQU 61H
LEDZONGH EQU 60H
LEDSECONDL EQU 5EH;秒显示缓冲单元
LEDSECONDH EQU 5DH;
LEDMINL EQU 5CH;分钟显示缓冲单元
LEDMINH EQU 5BH
LEDHUORL EQU 5AH;小时缓冲单元
LEDHUORH EQU 59H
LEDDANJIAL EQU 58H ;单价显示存储单元
LEDDANJIAH EQU 57H
ZONG EQU 55H;总金额存储单元
ZONGL EQU 54H;总金额存储单元低位
ZONGH EQU 53H;总金额存储单元高位
TIME EQU 52H
S1 EQU 00H
S2 EQU 01H
S3 EQU 02H
S4 EQU 03H
S5 EQU 04H
ORG 0000H
AJMP CHUSHI
ORG 0003H
AJMP HUOER
ORG 000BH
AJMP TIME
ORG 0030H
;************************************************************************************************
;芯片初始
;**************************************************************************************
CHUSHI: SETB EA ;开CPU中断总允许位
SETB TR0 ;选用T0工作
SETB EX0 ;开外部中断
SETB IT0;选用边沿触发方式
SETB ET0 ;定时/计数T0工作中断允许位
MOV SP,#70H
MOV TMOD, #01H ;T0选用工作方式1
MOV TH0, #3CH ;装入计数初值
MOV TL0, #0B0H
MOV ZONG, #7H ;总金额
MOV DAY,#0CH ; 白天价格初始化1.2元
MOV NIGHT,#11H ; 晚上价格初始化1.7元
MOV DISTANCE, #3H ;初步3公里
MOV HOUR, #0CH ;默认时间12:00
MOV MIN,#0H
MOV SECOND,#0H
;*************************************************************************
;主程序开始
;***************************************************************************
MAIN:ACALL TIMECHANGE;调用时间调整模块
LCALL TIME
MOV R0,#NIGHT
MOV A,@R0;当前小时数置于A
MOV R3,A
SUBB A,#0CH
ANL A,#08H;判断符号
JZ LP2;若时间在12点后转LP2
LP0:MOV A,R3
SUBB A,#7H
ANL A,#8H
JZ LP1;时间在上午7点后转LP1
MOV R0,#NIGHT
MOV A,@R0;时间在7点前,转晚上计费
MOV DANJIA,A
LP1:MOV R0,#DAY
MOV A,@R0
MOV DANJIA,A;7点以后为白天计费
LP2:MOV A,R3;
SUBB A,#13H;
ANL A,#08H
JZ LP3
MOV R0,#DAY
MOV A,@R0;时间在19点前为白天计费
MOV DANJIA,A
LP3:MOV R0,#NIGHT ;
MOV A,@R0;19点后为晚上计费
MOV DANJIA,A;
LCALL HUOER;调用霍尔中断模块
AJMP NEXT;
PANJIAN:MOV R7,#0;
CISHU:CJNE A,#S2,TWO
MOV A,#1;
ADD A,R7;
MOV R7,A;将S2按下次数置于R7
ONE:CJNE R7,#1,ONE_1
LCALL DISTANCE_DIS;显示里程
AJMP CISHU
ONE_1:CJNE R7,#2,ONE_2
LCALL DANJIA_DIS;显示单价
AJMP CISHU
ONE_2:CJNE R7,#3,TWO
LCALL TIME_DIS;显示时间
AJMP CISHU
TWO:ACALL NEXT;是否还有其它键按下
MOV R3,A
CJNE A,#S1,TWO_1;若有键按下,判断是否为S1
AJMP MAIN;是S1按下,复位
TWO_1:LCALL ZONG_DIS;若没键按下,显示金额
RET
;***************************************************
;显示程序
;***************************************************
DIS:MOV R0,#79H
MOV R3,#01H
MOV A,R3
LD0:MOV DPTR,#7F01H;数据指针指向A口
MOVX @DPTR,A;送扫描值
INC DPTR ;数据指针指向B口
MOV A,@R0;取欲显示数据
ADD A,#0DH ;加上偏移量
MOVC A,@A+PC;取出字形码
MOVX @DPTR,A
ACALL DL1
INC R0
MOV A,R3
JB ACC.5,ELD1;是否扫描到第6个显示器
RL A ;没有,扫描码左移一位
MOV R3,A
AJMP LD0
ELD1:RET
DSE:DB 3FH,06H,5BH,4FH,66H,6DH
DB 7DH,07H,7FH,6FH,77H,7CH
DB 39H,5EH,79H,71H,40H,00H
DB 38H,73H,01H
DL1:MOV R7,#02H;延时1MS子程序
DL:MOV R6,#0FFH
DL6:DJNZ R6,DL6
DJNZ R7,DL
RET
;**********************************************************************
;时间调整
;***********************************************************************
TIMECHANGE:ACALL NEXT
TO_YIME:MOV R7,#0;查有无键按下
TO:CJNE A,#S3,TO
MOV A,#1
ADD A,R7
MOV R7,A;将S3按下次数置于R7
TO_1:CJNE R7,#1,TOO
ACALL NEXT;查有无其它键按下
MOV R3,A
TO_2:CJNE A,#S4,TOO_1
MOV A,#1H
MOV R0,#HOUR
ADD A,@R0;按下“S4”键,小时数加1
SHIJIA:CJNE A,#17H,SHIJIA_1
MOV A,#0H;满24小时,小时数清0
MOV HOUR,A
SHIJIA_1:MOV A,R3
AJMP TO_2
TOO_1:MOV A,R3
CJNE A,#S5,TOO
MOV A,#1H
MOV R0,#HOUR;HOUR:小时数存储单元
SUBB A,@R0;按下“S5”键,小时数减1
SHIJIAN:CJNE A,#0,SHIJIAN_1
MOV A,#17H;若小时数减到0,置23
MOV HOUR,A
SHIJIAN_1:MOV A,R3
AJMP TOO_1
TOO:CJNE R7,#2,FAN
ACALL NEXT;有无其它键按下(按下两次S3,进入分调整)
MOV R3,A
TOO_2:CJNE A,#S4,KY_1
MOV A,#1H
MOV R0,#MIN
ADD A,@R0;按下“S4”键,分钟数加1
FENJIA:CJNE A,#3BH,FENJIA_1
MOV A,#0H;若满60分,分钟数清0
MOV MIN,A
FENJIA_1:MOV A,R3
AJMP TOO_2
KY_1:MOV A,R3
CJNE A,#S5,FAN
MOV A,#1H
MOV R0,#MIN
SUBB A,@R0;分钟数减1
FENJIAN:CJNE A,#0H,FENJIAN_1
MOV A,#3BH;若分钟数减到0,分钟数置59
MOV MIN,A
FENJIAN_1:MOV A,R3
AJMP KY_1
FAN:AJMP TOTIME
RET
;*********************************************************************************
;键盘扫描
;********************************************************************************
NEXT:MOV A,#00000011B;8155初始化:(键盘扫描)
;PA,PB为基本输出,PC为输入
MOV DPTR,#7F00H;指向命令寄存器
MOVX @DPTR,A;送命令字
KEY1:ACALL KS1;查有无键按下
JNZ LK1;有,转键扫描
ACALL DIS;调显示子程序
AJMP KEY1
LK1:ACALL DIS;键扫描
ACALL DIS;两次调用显示子程序,延时12MS
ACALL KS1
JNZ LK2
ACALL DIS
AJMP KEY1
LK2:MOV R2,#0FEH;从首列开始
MOV R4,#00H;首列键号送R4
LK4:MOV DPTR,#7F01H;指向A口
MOV A,R2
MOVX A,@DPTR
INC DPTR
INC DPTR ;指向C口
MOVX @DPTR,A
JNB ACC.0,KD1
MOV A,#00H;有,送首键号到A
AJMP LKP;转求键号
LKP:ADD A,R4;求键号:键号=行首列号+列号=00H+列号
PUSH ACC;保护键号
LK3:ACALL DIS;等待键释放
ACALL KS1;查该键是否按下
JNZ LK3
POP ACC;键扫描结束:A为按下键的键号
RET
KD1:INC R4 ;指向下一列
MOV A,R2
JNB ACC.4,KND;判断5列是否扫描完
RL A ;未完,扫描字对应下一列
MOV R2,A
AJMP LK4;转下一列扫描
KND:AJMP KEY1;扫完,转入新一轮扫描
KS1:MOV DPTR,#7F01H;查有无键按下子程序。指向A口
MOV A,#00H
MOVX @DPTR,A;送扫描字00H
INC DPTR
INC DPTR ;指向C口
MOVX A,@DPTR
CPL A
ANL A,#0FH
RET ;A内容非0则有键按下
;***************************************************************************
;总金额显示程序
;***********************************************************************
ZONG_DIS:MOV R0,#ZONG
MOV A,@R0
MOV R1,#LEDZONGL
MOV B,#0AH
DIV AB
MOV A,B
MOV @R1,A;将金额十分位存于LEDZONGL单元
DEC R1
MOV B,#0AH
MOV A,R3;取金额个位
DIV AB
MOV R3,A;将金额个位暂存于R3
MOV A,B
ORL A,#80H;亮小数点
MOV @R1,A;金额个位存于金额显示缓冲单元中
DEC R1
MOV A,R3;取金额十位
MOV @R1,A;金额十位存于金额显示缓冲单元高位
DEC R1
MOV A,73H;送字符“P”
MOV @R1,A
MOV R0,#LEDZONGL
MOV 79H,@R0
ACALL DIS
RET
;********************************************************************************
;里程显示程序
;***************************************************************************
DISTANCE_DIS:MOV R0,#DISTANCE
MOV A,@R0
MOV B,#0AH
DIV AB
MOV R3,A
MOV A,B
MOV R1,#LEDDISTANCEL
MOV @R1,A ;将里程个位存于LEDDISTANCEL单元
DEC R1
MOV A,R3
MOV @R1,A;将里程十位存于LEDDISTANCEH单元
DEC R1
MOV A,#38H;送字符“L”
MOV @R1,A
MOV R0,#LEDDISTANCEL
MOV 79H,@R0
CALL DIS
RET
;****************************************************************************
; 单价显示程序
;*********************************************************************************
DANJIA_DIS:MOV R0,#DANJIA
MOV A,@R0
MOV R1,#LEDDANJIAL
MOV B,#0AH
DIV AB
MOV R3,A
MOV @R1,A;将单价十分位存于LEDDANJIAL
DEC R1
MOV A,R3
ORL A,#80H
MOV @R1,A;将单价个位存于LEDDANJIAH
DEC R1
MOV A,5EH;送字符“D”
MOV R0,#LEDDANJIAL
MOV 79H,@R0
ACALL DIS
RET
;*************************************************************************************************
; 时间显示程序
;**************************************************************************************************
TIME_DIS:MOV R0,#SECOND
MOV A,@R0
MOV R1,#LEDSECONDL
MOV B,#0AH
DIV AB
MOV R3,A
MOV A,B
MOV @R1,A;将秒个位存于LEDSECONDL
DEC R1
MOV A,R3
MOV @R1,A;将秒十位存于LEDSECONDH
DEC R1
MOV R0,#MIN
MOV A,@R0
MOV B,#0AH
DIV AB
MOV R3,A
MOV A,B
MOV @R1,A;将分个位存于LEDMINL
DEC R1
MOV A,R3
MOV @R1,A;将十位存于LEDMINH
DEC R1
MOV R0,#HOUR
MOV A,@R0
MOV B,#0AH
DIV AB
MOV R3,A
MOV A,B
MOV @R1,A;将小时个位存于LEDHOURL
DEC R1
MOV A,R3
MOV @R1,A;将小时十位存于LEDHOURH
MOV R0,#LEDSECONDL
MOV 79H,@R0
ACALL DIS
RET
;************************************************************************************
;时间中断(选用T0)程序
;************************************************************************************
TOTIME:PUSH PSW
PUSH ACC
MOV TH0,#3CH ;装入100MS计数初值
MOV TL0,#0B0H
MOV R0,#MS100;MS100:100MS存储单元
INC @R0
MOV A,R0
CJNE A,#10,RETURN ;判断是否满1S
MOV A,#0
MOV MS100,A
MOV R0,#SECOND;SECOND:秒存储单元
MOV A,@R0
ADD A,#1H
MOV @R0,A
CJNE A,#3CH,RETURN ;是否到1分
MOV @R0,#0H
MOV A,#1H
MOV R0,#MIN;MIN:分存储单元
ADD A,@R0
MOV @R0,A
CJNE A,#3CH,RETURN ;是否到1小时
MOV @R0,#0H
MOV A,#1H
MOV R0,#HOUR;HOUR:小时存储单元
ADD A,@R0
MOV @R0,A
CJNE A,#18H,RETURN ;是否满一天24小时
MOV @R0,#0H
RETURN:POP ACC
POP PSW
RETI
;***************************************************************
;;霍尔中断程序(中断0),设车轮转1000次为1公里
;**************************************************************
HUOER:PUSH PSW
PUSH ACC
DEL:MOV A,M1000;M1000:霍尔传感器的信号
MOV B,#100
DIV AB
CJNE A,#30,DEL;判断是否满起步3公里
MOV R0,#DANJIA;DANJIA:存放白天/晚上单价
MOV A,@R0
MOV B,#0AH
DIV AB
MOV 20H,A ;算出每0.1公里价格存于20H
MOV R7,#10;置循环初值10
DEL1:MOV A,#1
MOV R0,#M1000
ADD A,@R0
MOV M1000,A
CJNE A,#100,RETURN1 ;是否满0.1公里
MOV A,#0
MOV M1000,A
MOV A,20H
MOV R0,#ZONGL;ZONGL:总金额
ADD A,@R0
MOV ZONGL,A
CJNE A,#0AH,RETURN1;是否超过10元
MOV A,#0H
MOV ZONGL,A
MOV A,#1H
MOV R0,#ZONGH
ADD A,@R0
MOV ZONGH,A
CJNE A,#63H,RETURN1;是否满99元
MOV A,#0H
MOV ZONGH,A
ACALL ZONG_DIS; ZONG_DIS总额显示
DEC R7
DJNZ R7,DEL1
MOV A,#1H
MOV R0,#DISTANCE
ADD A,@R0;里程加1
MOV DISTANCE,A
RETURN1:POP ACC
POP PSW
RETI
END
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?