📄 speedo1.asm
字号:
;******************************************************************************************************
; 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 + -