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

📄 lichengbiao.a51

📁 电动自行车里程系统。 安装于电动自行车上
💻 A51
字号:
RS BIT P2.0
RW BIT P2.1
E  BIT P2.2
SDA   BIT P3.1
SCL   BIT P3.0
DATE1 EQU 60H                     ;存储要显示的个位数
DATE2 EQU 61H                     ;存储要显示的十位数
DATE3 EQU 62H                     ;存储要显示的百位数
DATE4 EQU 63H                     ;存储要显示的千位数
DATEN EQU 78H                     ;存放写入LCD的数据的个数
DATE  EQU 79H                     ;存放写入LCD的数据
;***************************************************************
;主程序MAIN
;***************************************************************
       
        ORG 0000H
       AJMP MAIN
        ORG 0030H
MAIN:  SETB P2.5                   ;将P2.5置高电平
        JNB P2.5,qinling           ;由p2.5判断是否清零LCD 
        MOV 50H,#00H               ;读24c02直径
        MOV 51H,#01H
      LCALL AT2401RC
       CJNE R7,#0,DUSHU
       AJMP MAIN
DUSHU:  MOV 70H,R7
        MOV 50H,#00H               ;读24c02百米脉冲数
        MOV 51H,#02H
      LCALL AT2401RC
        MOV 71H,R7 
        MOV 50H,#00H               ;读24c02里程个位数
        MOV 51H,#20H
      LCALL AT2401RC
        MOV DATE1,R7
        MOV 50H,#00H               ;读24c02里程十位数
        MOV 51H,#21H
      LCALL AT2401RC
        MOV DATE2,R7
        MOV 50H,#00H                ;读24c02里程百位数
        MOV 51H,#22H
      LCALL AT2401RC
        MOV DATE3,R7
        MOV 50H,#00H                ;读24c02里程千位数
        MOV 51H,#23H
      LCALL AT2401RC
        MOV DATE4,R7
      ACALL LCDINT
BACKM:ACALL JISHU                  ;调用收到脉冲并进行处理子程
      ACALL LCDXS
        JNB P2.5,qinling
       AJMP BACKM
;*********************************************************
;24C02读初始,读取里程数
;*********************************************************         
AT2401RC:LCALL R2STAR
           MOV R7,#10100000B
         LCALL R2SEND
           MOV A,50H
           MOV R7,A
         LCALL R2SEND
           MOV A,51H
           MOV R7,A
         LCALL R2SEND
          SETB SDA
          SETB SCL
         LCALL R2STAR
           MOV R7,#10100001B
         LCALL R2SEND
         LCALL R2READ
         LCALL R2STOP
           RET
;***************************************************************
;LCD清零程序
;***************************************************************
qinling:ACALL LCDINT
         MOV DATE1,#0               ;里程数清零
         MOV DATE2,#0
         MOV DATE3,#0
         MOV DATE4,#0
         MOV 70H,#0                ;直径清零        
HERE:     JB P2.3,HERE             ;由P2.3判断轮胎直径的输入  
       ACALL DELAY50MS                          
         INC 70H                   ;40h中存放输入的直径
        SETB P2.4
         JNB P2.4,JISHUAN          ;由p2.4判断是否开始工作显示
        AJMP HERE
;***************************************************************
;计算车行驶100米所需要的脉冲数的子程序
;***************************************************************
JISHUAN: MOV A,#32                 ;32为100/3.14的工作系数
         MOV B,70H
         DIV AB
         MOV 71H,A                 ;每跑100M的脉冲数放入71H
         MOV 50H,#00H              ;每跑100M脉冲存入24C02 
         MOV 51H,#02H
         MOV R5,71H               
       LCALL AT2401W
         MOV 50H,#00H              ;将直径存入24c02中
         MOV 51H,#01H
         MOV R5,70H
       LCALL AT2401W        
       ACALL LCDINT
        AJMP BACKM
;***********************************************************
;读取24c02的数据
;***********************************************************
R2READ: PUSH ACC                 ;保存AC
         MOV R6,#08H 
R2RLOP1:LCALL D15US
        SETB SCL                 ;输出一个串行时钟
       LCALL D15US
         MOV C,SDA               ;读数据线上的数据到 C
         RLC A                   ;移到 ACC 
       LCALL D15US
         CLR SCL
        DJNZ R6,R2RLOP1          ;读 8 BIT 数据
       LCALL D15US
         CLR SDA
         MOV R7,A                ;将接收到的数据保存到R7 
         POP ACC                 ;还原ACC 
         RET
;******************************************************
;写到24C02本程序开始及结束SDA & SCL 均=0 ,发送数据在R7 
;******************************************************
R2SEND: PUSH ACC                  
         MOV A,R7                
         MOV R6,#08H
R2SLOP1: RLC A
         MOV SDA,C
       LCALL D15US
        SETB SCL
       LCALL D15US
         CLR SCL
        DJNZ R6,R2SLOP1
        SETB SDA
       LCALL D15US
         CLR SDA
       LCALL D15US
R2SLOP2: MOV C,SDA
          JC R2SLOP2
         CLR SCL
         CLR SDA
         POP ACC
       LCALL D1MS
         RET   
;****************************************************
;将要写的数据交给R5,由R5送到存储器相应的地址
;****************************************************
AT2401W:SETB SDA
        SETB SCL
       LCALL R2STAR
         MOV R7,#10100000B
       LCALL R2SEND
         MOV A,50H
         MOV R7,A
       LCALL R2SEND
         MOV A,51H
         MOV R7,A
       LCALL R2SEND
         MOV A,R5
         MOV R7,A
       LCALL R2SEND
       LCALL R2STOP
       LCALL D1MS
         RET
;************************************************************** 
;设置开始 ,初始SDA &SCL=1,结束 SDA & SC
;**************************************************************
R2STAR: SETB SDA
        SETB SCL
       LCALL D15US                ;对2401操作开始 
         CLR SDA                  ;在SCL=1时,SDA由1变为0表示开始 
       LCALL D15US 
         CLR SCL
       LCALL D15US
         RET    
;******************************************************
;设置结束
;******************************************************
R2STOP:LCALL D15US
        SETB SCL
         CLR SDA
       LCALL D15US
        SETB SDA       
         RET


;**************************************************************
;开始对脉冲计数并存储里程数的子程序
;**************************************************************
JISHU:  SETB P2.6
         JNB P2.6,JISHU            ;P2.6每收到一个脉冲51H加1
         INC 73H
         MOV R4,73H
        CJNE R4,#10,JISHU          ;51H加到10后,50就加1
         MOV 73H,#0
         INC 72H
         MOV A,72H
        CJNE A,71H,JISHU           ;50H脉冲数与跑100M脉冲比较
         MOV 72H,#0
         INC DATE1                   ;存里程数
         MOV A,DATE1
        CJNE A,#10,JIESHU
         MOV DATE1,#0
         INC DATE2
         MOV A,DATE2
        CJNE A,#10,JIESHU
         MOV DATE2,#0
         INC DATE3
         MOV A,DATE3
        CJNE A,#10,JIESHU
         MOV DATE3,#0
         INC DATE4
         MOV A,DATE4
        CJNE A,#0,JIESHU
         MOV DATE4,#0
         MOV DATE3,#0
         MOV DATE2,#0
         MOV DATE1,#0  
JIESHU:  MOV 50H,#00H              ;里程数存入24c02
         MOV 51H,#20H
         MOV R5,DATE1
       LCALL AT2401W  
         MOV 50H,#00H
         MOV 51H,#21H
         MOV R5,DATE2
       LCALL AT2401W 
         MOV 50H,#00H
         MOV 51H,#22H
         MOV R5,DATE3
       LCALL AT2401W 
         MOV 50H,#00H
         MOV 51H,#23H
         MOV R5,DATE4
       LCALL AT2401W        
         RET
;*************************************************************
;在LCD显示的子程序
;*************************************************************
LCDXS:   MOV DPTR,#TAB2            ;在LCD上写入MILE:字符
         MOV R2,#80H
       ACALL WRLCD
         MOV DATEN,#6
       ACALL WRN

                      
         MOV R2,#8CH                 ;在LCD上写入里程数      
       ACALL WRLCD
         MOV DPTR,#TAB1
         MOV A,DATE4
        MOVC A,@A+DPTR
         MOV DATE,A
       ACALL WRDATE
         
         MOV R2,#8DH
       ACALL WRLCD
         MOV A,DATE3
        MOVC A,@A+DPTR
         MOV DATE,A
       ACALL WRDATE
       
         MOV R2,#8EH
       ACALL WRLCD
         MOV A,DATE2
        MOVC A,@A+DPTR
         MOV DATE,A
       ACALL WRDATE

         MOV R2,#8FH
       ACALL WRLCD
         MOV A,DATE1
        MOVC A,@A+DPTR
         MOV DATE,A
       ACALL WRDATE
       
         MOV DPTR,#TAB3              ;在LCD上写入DIAMETER:字符
         MOV R2,#0C0H
       ACALL WRLCD
         MOV DATEN,#9
       ACALL WRN

         MOV R2,#0CCH                ;在LCD上写入直径
       ACALL WRLCD
         MOV DPTR,#TAB1
         MOV A,70H
        MOVC A,@A+DPTR
         MOV DATE,A
       ACALL WRDATE
        
       ACALL DELAY50MS
         RET
                      
;*********************************************************
;LCD显示程序初始化
;*********************************************************
LCDINT:  MOV R2,#01H
       ACALL WRLCD
         MOV R2,#3CH
       ACALL WRLCD
         MOV R2,#06H
       ACALL WRLCD
         MOV R2,#0CH
       ACALL WRLCD
         RET
;********************************************************
;写命令的子程序,R2中存放要写入的命令
;********************************************************
WRLCD: ACALL BUSY
        PUSH ACC
         MOV A,R2
         CLR RS
         CLR RW
         MOV P0,A
         CLR E
       ACALL DELAY
        SETB E
         POP ACC
         RET
;********************************************************
;写一位字符数据子程序,DATE中存放要写入的数据
;********************************************************
WRDATE:ACALL BUSY
        SETB RS
         CLR RW
         MOV P0,DATE
         CLR E
       ACALL DELAY
        SETB E
         RET
;********************************************************
;写入LCD表示字符
;********************************************************
WRN:     CLR A
        MOVC A,@A+DPTR
         INC DPTR
         MOV DATE,A
       ACALL WRDATE
        DJNZ DATEN,WRN
         RET
;********************************************************
;查询忙碌子程序
;********************************************************
BUSY:    CLR RS
        SETB RW
         MOV A,P0
         CLR E
       ACALL DELAY
        SETB E
          JB ACC.7,BUSY
         RET
;*********************************************************
;将R0中存放的里程数据分解分个、十、百位
;*********************************************************
COV:     MOV A,R0
         MOV B,#10
         DIV AB
         MOV DATE3,B
         MOV B,#10
         DIV AB
         MOV DATE2,B
         MOV DATE1,A
         RET
;*********************************************************
;延时子程序
;*********************************************************
DELAY:   MOV R6,#10H
D1:      MOV R5,#0FFH
        DJNZ R5,$
        DJNZ R6,D1
         RET
;**********************************************************
;延时子程序
;**********************************************************
D1MS:   MOV R2,#5               ;延时1ms子程序
D1MS1:  MOV R3,#100
D1MS2: DJNZ R3,D1MS2
       DJNZ R2,D1MS1
        RET

D15US:  MOV R3,#7               ;延时1us子程序
D12US1:DJNZ R3,D12US1
        RET

DELAY50MS:MOV R7,#200                  ;延时50ms子程序
DELAY50MS1:MOV R6,#125
DELAY50MS2:DJNZ R6,DELAY50MS2
           DJNZ R7,DELAY50MS1
           RET

TAB1:    DB '0123456789'
TAB2:    DB 'MILES:'
TAB3:    DB 'DIAMETER:'
         END
          

        

⌨️ 快捷键说明

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