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 + -
显示快捷键?