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

📄 cufirst.a51

📁 8051单片机 a51 投票器 带控制端 含原理图
💻 A51
字号:
;EEPROM PORT DEFINITIONS ETC.
SDA1 EQU P1.6
SCL1 EQU P1.7


WTCMD EQU   10100000B       ;WRITE DATA COMMAND 
RDCMD EQU   10100001B       ;READ DATA COMMAND 

HBADD EQU 7Eh
MEMORY EQU 7Fh




ORG 0000h
LJMP MAIN

MAIN:

;************************ROUTINE TO SET STATUS AS ZERO***********************



MOV A,#WTCMD ;LOAD WRITE COMMAND

               CALL OUTS ;SEND IT

               MOV A,#00H ;GET BYTE ADDRESS

               CALL OUT ;SEND IT

               MOV A,#00H ;GET DATA

               CALL OUT ;SEND IT

               CALL STOP ;SEND STOP CONDITION
ACALL DELAY_STOP
JMP $

   






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



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

END

⌨️ 快捷键说明

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