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

📄 speedo1.asm

📁 speedometer cum odometer with asm and hex files
💻 ASM
📖 第 1 页 / 共 2 页
字号:
;******************************************************************************************************
;         DIGITAL SPEEDOMETER CUM ODOMETER USING  16X2 LINE LCD + 8051 + EEPROM(I2C)
;******************************************************************************************************
; XTAL Freq = 12 MHz

$MOD51


LCD    EQU      P1    ;   P1.0 .....P1.7, PORT1 USED AS DATA BUS 
RS     EQU      P3.2
RW     EQU      P3.3
EN     EQU      P3.7

DISTO  EQU      P3.4   ; TIMER 0 INPUT FOR DISTANCE-ODOMETER
SPEDO  EQU      P3.5   ; TIMER 1 INPUT FOR SPEEDOMETER


SCL   EQU        P3.0         ;SCL=PIN6
SDA   EQU        P3.1         ;SDA=PIN5

EEPROMW   EQU    10100000B     ; SLAVE ADDRESS  OF EEPROM 1010 000  + 0 TO WRITE
EEPROMR   EQU    10100001B     ; SLAVE ADDRESS  OF EEPROM  1010 000 + 1 TO READ



DSEG 
ORG 020H                      ; BIT-ADDRESSABLE RAM
 
FLAGS:	  DS	  1           ; VARIABLES FOR I2C PROTOCOL
LASTREAD  BIT    FLAGS.0
SQW 	  BIT    FLAGS.4
ACK       BIT    FLAGS.5
BUS_FLT   BIT    FLAGS.6
_2W_BUSY  BIT    FLAGS.7
OK        BIT      1

BITCNT:	  DS		1
BYTECNT:  DS		1
POINT:  DS 1    ; DISTANCE VARIABLES
KM:     DS 1
TKM:   DS 1
HKM:   DS 1
KKM:   DS 1
TKKM:  DS 1
TOTAL: DS 1
STORE BIT  TOTAL.0

VAL1: DS 1   ; SPEED VAL1
VAL2: DS 1   ; SPEED VAL2
VAL3: DS 1   ; SPEED VAL3



; ***MACRO'S***

SCL_HIGH  MACRO
          SETB   SCL      ; SET SCL HIGH
          JNB    SCL,$    ; LOOP UNTIL STRONG 1 ON SCL
          ENDM
          
   
CONVERT MACRO               
   ORL A,#30H         ; CONVERT TO ASCII BY ADDING 30H
   ENDM


CSEG                              ; CODE BEGINS HERE
              ORG 0000H           ; ON RESET

              SJMP MAIN    

              ORG 000BH	          ;Timer Interrupt0

              LJMP UPDATE
 


MAIN:  MOV SP,#70H       ; MOVE STACK POINTER TO ADDRESS 70H OF RAM
       LCALL PWR_DELAY   ;LCD POWER ON DELAY
       LCALL INIT        ;INITIALIZE LCD
       CLR STORE         ;CLEAR STORE FLAG
       
       MOV POINT,#00H    ; RESET ALL COUNTERS TO ZERO
       MOV KM,#00H
       MOV TKM,#00H
       MOV HKM,#00H
       MOV KKM,#00H
       MOV TKKM,#00H
       
       MOV VAL1,#00H     ; RESET SPEED VALUES TO ZERO
       MOV VAL2,#00H
       MOV VAL3,#00H
       
       LCALL READEEPROM   ; GET PREVIOUS READING FROM EEPROM
      
       LCALL SEND2LCD     ; DISPLAY INITIAL/PREVIOUS VALUES
       
       
       MOV TMOD,#66H    ; BOTH THE TIMERS SET AS COUNTERS IN MODE 2 - 8 BIT AUTO RELOAD 
       
       MOV TH0,#203D    ; LOAD DISTANCE COUNTER TO COUNT 53 REVOLUTIONS(255-53+1)i,e 100 METERS
       MOV TL0,#203D      
       
       SETB DISTO      ; T0 INPUT       
       SETB SPEDO      ; T1 INPUT
       
       SETB ET0        ; ENABLE TR0 INTERRUPT
       SETB EA         ; GLOBAL ENABLE INTERRUPTS
       SETB TR0        ; START TIMER0
       
       
LOOP:  MOV TL1,#00H   ;  RESET SPEED COUNTER TO 00
       SETB TR1
       LCALL ONESEC_DELAY
       MOV B,TL1      ; COPY TL1 VALUE TO REGISTER B AFTER ONE SEC DELAY
       CLR TR1        ; STOP TR1
       MOV A,B
       JNZ GET_FIRST  ; CHECK IF SPEED IS ZERO
       SETB STORE     ; IF YES, SET STORE CURRENT READING FLAG
       
GET_FIRST: MOV DPTR,#FIRST        ; LOAD TABLE FOR FIRST DIGIT OF SPEED
           MOV A,B
           MOVC A,@A+DPTR
           MOV VAL1,A
           
GET_SECOND: MOV DPTR,#SECOND      ; LOAD TABLE FOR SECOND DIGIT OF SPEED
            MOV A,B
            MOVC A,@A+DPTR
            MOV VAL2,A

GET_THIRD: MOV DPTR,#THIRD        ; LOAD TABLE FOR THIRD DIGIT OF SPEED
           MOV A,B
           MOVC A,@A+DPTR
           MOV VAL3,A
              
           LCALL SEND2LCD          ; SEND VALUES TO LCD
           
           JBC STORE,STORE_DAT     ; CHECK IF STORE FLAG IS SET AND CLEAR THE FLAG
           
           SJMP LOOP               ; CONTINUE DOING THIS
              
STORE_DAT: LCALL SEND2EEPROM       ; IF SPEED IS = 00.0 THEN SAVE THE MILEAGE IN EEPROM 
       
           SJMP LOOP

 
;******************************************************************************************
;             TIMER 0 ISR  - TO MEASURE DISTANCE
;******************************************************************************************

UPDATE:  INC POINT
         
         MOV R0,POINT
         CJNE R0,#10D,EXIT
         MOV POINT,#00H
         INC KM
         
         MOV R0,KM
         CJNE R0,#10D,EXIT
         MOV KM,#00H
         INC TKM
         
         MOV R0,TKM
         CJNE R0,#10D,EXIT
         
         MOV TKM,#00H
         INC HKM
         
         MOV R0,HKM
         CJNE R0,#10D,EXIT
         
         MOV HKM,#00H
         INC KKM
         
         MOV R0,KKM
         CJNE R0,#10D,EXIT
         INC TKKM
         
         MOV R0,TKKM
         CJNE R0,#10D,EXIT
         
         MOV POINT,#00H       ; WHEN 99,999 Kms, RESET ALL COUNTERS TO ZERO
         MOV KM,#00H
         MOV TKM,#00H
         MOV HKM,#00H
         MOV KKM,#00H
         MOV TKKM,#00H
         
   
 EXIT: RETI     

;******************************************************************************************  
ONESEC_DELAY:

                     
     	MOV R0,#10D    ; One second delay routine
RZ3: 	MOV R1,#100D
RZ1:	MOV R2,#250D
RZ2:	NOP
	NOP
	DJNZ R2,RZ2
	DJNZ R1,RZ1  
	DJNZ R0,RZ3  
        RET  
;****************************************************************************************** 
     
SEND2LCD: 
       
       MOV A,#84H     ; LINE 1
       LCALL CMD
       
       MOV A,TKKM
       CONVERT
       LCALL DAT
          
       
       MOV A,KKM
       CONVERT
       LCALL DAT
       
       MOV A,HKM
       CONVERT
       LCALL DAT
       
       MOV A,TKM
       CONVERT
       LCALL DAT
       
       MOV A,KM
       CONVERT
       LCALL DAT
       
       MOV A,#'.'
       LCALL DAT 
       
       MOV A,POINT
       CONVERT
       LCALL DAT
       
       MOV A,#0CBH    ; LINE 2
       LCALL CMD
       
             
       MOV A,VAL1
       CONVERT
       LCALL DAT
      
       MOV A,VAL2
       CONVERT
       LCALL DAT
       
       MOV A,#'.'
       LCALL DAT 
       
       MOV A,VAL3
       CONVERT
       LCALL DAT
       
       
       RET
      
   
;****************************LCD SUBROUTINES****************************************
        
  READY:SETB EN ;H->L PULSE ON E
        CLR  RS ;RS=0 CMD
        SETB RW ;RW=1 FOR READ
        SETB P1.7 ;D7 AS INPUT
        JB P1.7,READY 
        CLR EN
        CLR RW
        RET
;****************************LCD SUBROUTINES****************************************
          
   DAT:   SETB EN ;H->L PULSE ON E 

⌨️ 快捷键说明

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