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

📄 voting.a51

📁 8051单片机 a51 投票器 带控制端 含原理图
💻 A51
📖 第 1 页 / 共 3 页
字号:
               CALL    OUTS            ;SEND IT

              MOV     A,MEMORY            ;GET LOW BYTE ADDRESS

              CALL    OUT             ;SEND IT

              CALL    CREAD           ;GET DATA BYTE

              MOV A,R1 
MOV @R0,A
INC R0
INC MEMORY 
DJNZ R3,LABEL









;MOV R3,#10h
;MOV R0,#32h
;MOV DPTR,#002h
;LABEL:ACALL EEPROM_READ
;MOV @R0,A
;INC R0
;INC DPTR
;DJNZ R3,LABEL
RET





;************** ROUTINE 8: INITIALIZING EEPROM LOCATIONS WHERE TOTAL COUNT HAS TO BE SAVED, BY ZERO******


MEMORYINIT:

MOV A,#WTCMD ;LOAD WRITE COMMAND

               CALL OUTS ;SEND IT

               MOV A,#84H ;GET BYTE ADDRESS

               CALL OUT ;SEND IT

               MOV A,#00h ;GET DATA

               CALL OUT ;SEND IT

               CALL STOP ;SEND STOP CONDITION

ACALL DELAY_STOP


MOV A,#WTCMD ;LOAD WRITE COMMAND

               CALL OUTS ;SEND IT

               MOV A,#85H ;GET BYTE ADDRESS

               CALL OUT ;SEND IT

               MOV A,#00h ;GET DATA

               CALL OUT ;SEND IT

               CALL STOP ;SEND STOP CONDITION
ACALL DELAY_STOP





RET







;************** ROUTINE 9: INITIALIZING EEPROM LOCATIONS WHERE INDIVIDUAL COUNT HAS TO BE SAVED, BY ZERO******



MEMINIT:

MOV R3,#10h

MOV R4,#02h


LABELM:




MOV A,#WTCMD ;LOAD WRITE COMMAND

               CALL OUTS ;SEND IT

               MOV A,R4 ;GET BYTE ADDRESS

               CALL OUT ;SEND IT


               MOV A,#00h ;GET DATA

               CALL OUT ;SEND IT

               CALL STOP ;SEND STOP CONDITION
ACALL DELAY_STOP


    

INC R4
DJNZ R3,LABELM

RET

















;***********************************************************************

;                EEPROM ROUTINES

;***********************************************************************







;***********************************************************************

; THIS ROUTINE SENDS OUT CONTENTS OF THE ACCUMULATOR

; to the EEPROM and includes START condition.  Refer to the data sheets

; for discussion of START and STOP conditions.

;***********************************************************************




OUTS:   MOV     R2,#8           ;LOOP COUNT -- EQUAL TO BIT COUNT

        SETB   SDA1            ;INSURE DATA IS HI               

        SETB    SCL1            ;INSURE CLOCK IS HI

        NOP                     ;NOTE 1

        NOP                     

        NOP

        CLR     SDA1            ;START CONDITION -- DATA = 0

        NOP                     ;NOTE 1

        NOP      

        NOP

        CLR     SCL1            ;CLOCK = 0

OTSLP:  RLC     A               ;SHIFT BIT

        JNC     BITLS

        SETB    SDA1            ;DATA = 1

        JMP     OTSL1           ;CONTINUE

BITLS:  CLR     SDA1            ;DATA = 0

OTSL1:  SETB    SCL1            ;CLOCK HI

        NOP                     ;NOTE 1

        NOP

        NOP

        

        CLR     SCL1            ;CLOCK LOW

        DJNZ    R2,OTSLP        ;DECREMENT COUNTER

        SETB    SDA1            ;TURN PIN INTO INPUT

        NOP                     ;NOTE 1

                             

        SETB    SCL1            ;CLOCK ACK

        NOP                     ;NOTE 1

        NOP

        NOP

      

        CLR     SCL1

        RET




;**********************************************************************

; THIS ROUTINE SENDS OUT CONTENTS OF ACCUMLATOR TO EEPROM

; without sending a START condition.

;**********************************************************************




OUT:    MOV     R2,#8           ;LOOP COUNT -- EQUAL TO BIT COUNT

OTLP:   RLC     A               ;SHIFT BIT

        JNC     BITL            

        SETB    SDA1            ;DATA = 1

        JMP     OTL1            ;CONTINUE

BITL:   CLR     SDA1            ;DATA = 0

OTL1:   SETB    SCL1            ;CLOCK HI

        NOP                     ;NOTE 1

        NOP

        NOP

     

        CLR     SCL1            ;CLOCK LOW

        DJNZ    R2,OTLP         ;DECREMENT COUNTER

        SETB    SDA1            ;TURN PIN INTO INPUT

        NOP                     ;NOTE 1

     

        SETB    SCL1            ;CLOCK ACK

        NOP                     ;NOTE 1

        NOP

        NOP

      

        CLR     SCL1

        RET







STOP:   CLR     SDA1            ;STOP CONDITION SET DATA LOW

        NOP                     ;NOTE 1

        NOP

        NOP

      

        SETB    SCL1            ;SET CLOCK HI

        NOP                     ;NOTE 1

        NOP

        NOP

      

        SETB    SDA1            ;SET DATA HIGH

        RET

;*******************************************************************

; THIS ROUTINE READS A BYTE OF DATA FROM EEPROM

; From EEPROM current address pointer.

; Returns the data byte in R1

;*******************************************************************

CREAD:  MOV     A,#RDCMD        ;LOAD READ COMMAND

        CALL    OUTS            ;SEND IT

        CALL    IN              ;READ DATA

        MOV     R1,A            ;STORE DATA

        CALL    STOP            ;SEND STOP CONDITION

        RET




;**********************************************************************

; THIS ROUTINE READS IN A BYTE FROM THE EEPROM

; and stores it in the accumulator

;**********************************************************************




IN:     MOV     R2,#8           ;LOOP COUNT

        SETB    SDA1            ;SET DATA BIT HIGH FOR INPUT

INLP:   CLR     SCL1            ;CLOCK LOW

        NOP                     ;NOTE 1

        NOP

        NOP

        NOP

     

        SETB    SCL1            ;CLOCK HIGH

        CLR     C               ;CLEAR CARRY

        JNB     SDA1,INL1       ;JUMP IF DATA = 0

        CPL     C               ;SET CARRY IF DATA = 1

INL1:   RLC     A               ;ROTATE DATA INTO ACCUMULATOR

        DJNZ    R2,INLP         ;DECREMENT COUNTER

        CLR     SCL1            ;CLOCK LOW

        RET




;*********************************************************************

; This routine test for WRITE DONE condition 

; by testing for an ACK.

; This routine can be run as soon as a STOP condition

; has been generated after the last data byte has been sent

; to the EEPROM. The routine loops until an ACK is received from 

; the EEPROM. No ACK will be received until the EEPROM is done with

; the write operation.

;*********************************************************************

ACKTST: MOV     A,#WTCMD        ;LOAD WRITE COMMAND TO SEND ADDRESS

        MOV     R2,#8           ;LOOP COUNT -- EQUAL TO BIT COUNT

        CLR     SDA1            ;START CONDITION -- DATA = 0

        NOP                     ;NOTE 1

        NOP

        NOP

           

        CLR     SCL1            ;CLOCK = 0

AKTLP:  RLC     A               ;SHIFT BIT

        JNC     AKTLS

        SETB    SDA1            ;DATA = 1

        JMP     AKTL1           ;CONTINUE

AKTLS:  CLR     SDA1            ;DATA = 0

AKTL1:  SETB    SCL1            ;CLOCK HI

        NOP                     ;NOTE 1

        NOP

        NOP

      

        CLR     SCL1            ;CLOCK LOW

        DJNZ    R2,AKTLP        ;DECREMENT COUNTER

        SETB    SDA1            ;TURN PIN INTO INPUT

        NOP                     ;NOTE 1

      

        SETB    SCL1            ;CLOCK ACK

        NOP                     ;NOTE 1

        NOP

        NOP

       

        JNB     SDA1,EXIT       ;EXIT IF ACK (WRITE DONE)

        JMP     ACKTST          ;START OVER

EXIT:   CLR     SCL1            ;CLOCK LOW

        CLR     SDA1            ;DATA LOW

        NOP                     ;NOTE 1

        NOP

        NOP

      

        SETB    SCL1            ;CLOCK HIGH

        NOP

        NOP

        SETB    SDA1            ;STOP CONDITION

        RET

;*********************************************************************


































;********************** EEPROM ROUTINES COMMON TO ALL ***********************

EEPROM_READ:         ;read from eeprom
ACALL I2C_START
ACALL EEPROM_WRITE_ADDR
ACALL ACK
MOV  A,DPH
ACALL I2C_WRITE
ACALL ACK
MOV  A,DPL
ACALL I2C_WRITE
ACALL ACK
ACALL I2C_START
ACALL EEPROM_READ_ADDR
ACALL ACK
ACALL I2C_READ
ACALL NO_ACK
ACALL I2C_STOP
RET








EEPROM_WRITE:        ;write in to eeprom
ACALL I2C_START
ACALL EEPROM_WRITE_ADDR
ACALL ACK
MOV  A,DPH
ACALL I2C_WRITE
ACALL ACK
MOV  A,DPL
ACALL I2C_WRITE
ACALL ACK
MOV  A,B
ACALL I2C_WRITE
ACALL ACK
ACALL I2C_STOP
ACALL DELAY_STOP
RET




I2C_READ:            ;reading 8 bits from i2c device
MOV R7,#8
GFD:
;SETB SDA
;SETB SCL 
;MOV C,SDA 
RLC A
;CLR SCL
DJNZ R7,GFD
RET

I2C_WRITE:           ;writing 8 bits in to i2c device
MOV R7,#8
WRITING:
RLC A
;MOV SDA,C
ACALL CLOCK
DJNZ R7,WRITING
RET

I2C_START:           ;start of i2c routine
;SETB SCL
;SETB SDA 
;CLR SDA
;CLR SCL
RET

I2C_STOP:            ;end of i2c routine
;SETB SCL
;CLR SDA
;SETB SDA 
;CLR SCL
RET

CLOCK:               ;synchronizing clock 
;SETB SCL
NOP
NOP
;CLR SCL
RET

ACK:                 ;acknowledge from transmitter or receiver
;CLR SDA
;SETB SCL
;CLR SCL
RET

NO_ACK:              ;no acknowledge from transmitter or receiver
;SETB SDA
;SETB SCL
;CLR SCL
RET

EEPROM_READ_ADDR:     ;A2,A1,A0 are zero
MOV A,#10100001B
ACALL I2C_WRITE
RET

EEPROM_WRITE_ADDR:    ;A2,A1,A0 are zero
MOV A,#10100000B
ACALL I2C_WRITE
RET


DELAY_STOP:           ;terminating write process
MOV TMOD,#00000001B
MOV TH0,#50H 
MOV TL0,#00H
SETB TR0
SAC:
JNB TF0,SAC
CLR TR0
CLR TF0
RET

;******************EEPROM ROUTINES COMMON TO ALL, END HERE********************

END			  

⌨️ 快捷键说明

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