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

📄 sd2200读写c51演示程序.txt

📁 实时时钟芯片2200系列C语言程序
💻 TXT
📖 第 1 页 / 共 4 页
字号:
	DJNZ	R7,DELAY1_7218
	RET

LONGDELAY:                     ;DELAY 300MS
        MOV     R6,#240
LD0:    MOV     R7,#250        ;5*250*240
LD1:    NOP
        NOP
        NOP
        DJNZ    R7,LD1
        DJNZ    R6,LD0
        RET

DELAY10MS:                     ;DELAY >10MS
        MOV     R6,#11
LD00:    MOV     R7,#250        ;5*250*11
LD10:    NOP
        NOP
        NOP
        DJNZ    R7,LD10
        DJNZ    R6,LD00
        RET


;============================写八位LED数据缓冲器程序=======================
;功能:写八位LED数据缓冲器                                                |
;入口:NONE           出口:NONE                                          |
;影响资源: A                                                             |
;==========================================================================
INIT_LEDBUF:
        MOV     R0,#DIG8
        MOV     R3,#8
INIT_LEDBUF_LOOP:
        MOV     A,R3
        DEC     A
	MOV	DPTR,#TABLE
	MOVC	A,@A+DPTR		;查表取LED显示数据
	MOV	@R0,A
	DEC	R0
        DJNZ    R3,INIT_LEDBUF_LOOP     ;赋值完八个LED数据?
        RET


TABLE:  DB      3FH,3FH,86H,3EH,5BH,5BH,6DH,31H  ;"TS22 V1.00"

;==================读实时时钟实时数据寄存器子程序==========================
;功能:从实时时钟读入当前时间数据                                         |
;入口:NONE                                                               |
;出口:接收数据放在年、月、日、星期、时、分、秒各寄存器                   |
;影响资源:A,R0,R3,TIMETX,TIMERX,YEAR,MONTH,DAY,WEEK,HOUR,MINUTE,SECOND  |
;==========================================================================
READ_TIME:
RDTIME_LOOP:
	LCALL	T_IICSTART
        JB      FLAG.1,T_ERR_IICSTOP      ;如SDA线被箝位为低电平则退出
	MOV	TIMETX,#65H               ;发送读时钟数据命令
	LCALL	T_SENDH_L
        JB      FLAG.0,T_ERR_IICSTOP      ;ACK信号不正常则退出.
	MOV	R0,#YEAR
	MOV	R3,#07H
T_RDTIME1:
	LCALL	T_RXL_H
	MOV	A,TIMERX
	MOV	@R0,A
	INC	R0
 	DJNZ	R3,RDTIME2              ;读完一个字节数据后确认数据传输
        JMP     RDTIME3                 ;若为最后一个字节数据则为NOACK
RDTIME2:
        CALL    T_ACK
        JMP     T_RDTIME1
RDTIME3:
        CALL    T_NOACK
        LCALL   T_IICSTOP
        ANL     HOUR,#03FH              ;小时的高两位在24小时制时没有用,如果是12小时制请删掉此行.
RDTIME_RET:
        RET

T_ERR_IICSTOP:
        LCALL   T_IICSTOP
        RET
;============================ACK===========================================
;功能:延时         入口:NONE             出口:NONE                     |
;影响资源:                                                               |
;==========================================================================
T_ACK:  CLR      TIMETEMP.1
        LCALL    T_BITOUT
        RET

;============================ACK===========================================
;功能:延时         入口:NONE             出口:NONE                     |
;影响资源:                                                               |
;==========================================================================
T_NOACK:  SETB     TIMETEMP.1
        LCALL    T_BITOUT
        RET
;===============================保存错误代码===============================
;功能:保存MCU与IIC接口通信时的错误状态                                   |
;入口:TIMETEMP.0=ACK位缙?                                               |
;出口:FLAG.0 =错误代码                                                   |
;==========================================================================
T_ACK_ERR:
        JNB     TIMETEMP.0,T_ACK_ERR_RET  ;检查ACK信号是否正常
        SETB    FLAG.0                  ;置ACK出错标志位
T_ACK_ERR_RET:
        RET
;===============================启用IIC总线================================
;功能:开启实时时钟的IIC总线
;入口:NONE       出口:NONE
;影响资源:NONE
;==========================================================================
T_IICSTART:
        CLR     FLAG.1
	SETB	T_SDA
	SETB	T_SCL
	LCALL	DELAY
        JB      T_SDA,T_IIC_SDAHI
        SETB    FLAG.1
T_IIC_SDAHI:
	CLR	T_SDA
        LCALL   DELAY
	CLR	T_SCL
        LCALL    DELAY
        RET
;===============================关闭IIC总线================================
;功能:关闭实时时钟IIC总线
;入口:NONE       出口:NONE
;影响资源:NONE
;==========================================================================
T_IICSTOP:CLR	T_SDA
	SETB	T_SCL
	LCALL	DELAY
	SETB	T_SDA
	LCALL	DELAY
	RET

;============================发送一个字节,由高位到低位发送================
;功能:从MCU发送一个字节给实时时钟,由高位到低位发送                        |
;入口:发送数据放在TIMETX          出口:NONE                              |
;影响资源:A,R2,TIMETX                                                   |
;==========================================================================
T_SENDH_L:MOV	A,TIMETX
	MOV	R2,#08H
        CLR     FLAG.0
T_SENDH_L1:
        MOV	C,ACC.7
        MOV	TIMETEMP.1,C
	LCALL	T_BITOUT
	RL	A
	DJNZ	R2,T_SENDH_L1
        LCALL   T_BITIN
        LCALL   T_ACK_ERR
        RET
;==========================发送一个字节,由低位到高位发送==================
;功能:从MCU发送一个字节给实时时钟,由低位到高位发送                        |
;入口:发送数据放在TIMETX          出口:NONE                              |
;影响资源:A,R2,TIMETX                                                   |
;==========================================================================
T_SENDL_H:MOV	A,TIMETX
	MOV	R2,#08H
        CLR     FLAG.0
T_SENDL_H1:
        MOV	C,ACC.0
        MOV	TIMETEMP.1,C
        LCALL	T_BITOUT
	RR	A
	DJNZ	R2,T_SENDL_H1
        LCALL   T_BITIN
        LCALL   T_ACK_ERR
	RET
;=================================接收一个字节=============================
;功能:MCU从IIC总线接收一个字节,MSB在前,LSB在后                           |
;入口:NONE          出口:接收数据放在RXBUF中                            |
;影响资源:A,R2,TIMEBIT,RXBUF                                          |
;==========================================================================
T_RXH_L:MOV	R2,#08H
T_RXH_L1: LCALL	T_BITIN
        MOV	C,TIMETEMP.0
        MOV	ACC.7,C
	RLC	A
	DJNZ	R2,T_RXH_L1
        MOV     TIMERX,A
        RET
;=================================接收一个字节=============================
;功能:MCU从IIC总线接收一个字节,LSB在前,MSB在后                           |
;入口:NONE          出口:接收数据放在RXBUF中                            |
;影响资源:A,R2,TIMEBIT,RXBUF                                          |
;==========================================================================
T_RXL_H:MOV	R2,#08H
T_RXL_H1: LCALL	T_BITIN
        MOV	C,TIMETEMP.0
	RRC	A
	DJNZ	R2,T_RXL_H1
        MOV     TIMERX,A
        RET
;================================送出一位数================================
;功能:从MCU发送一位数给实时时钟                                          |
;入口:发送位数放在EEPREM.1       出口:NONE                              |
;影响资源:A,TIMETEMP                                                    |
;==========================================================================
T_BITOUT:
        MOV	C,TIMETEMP.1
	MOV	T_SDA,C
	LCALL	DELAY
	SETB	T_SCL
	LCALL	DELAY
	CLR	T_SCL
        LCALL   DELAY
	RET
;=================================读入一位数===============================
;功能:MCU从实时时钟接收一位数                                            |
;入口:NONE       出口:接收位数放在TIMETEMP.0                            |
;影响资源:A,TIMETEMP                                                    |
;==========================================================================
T_BITIN:
        SETB	T_SDA
        SETB    T_SCL
	LCALL	DELAY
	MOV	C,T_SDA
        MOV	TIMETEMP.0,C
	CLR	T_SCL
        CLR     T_SDA
        LCALL   DELAY
	RET

;============================写状态寄存器程序==============================
;功能:读/写实时时钟状态寄存器,对其进行设置                              |
;入口:NONE           出口:NONE                                          |
;影响资源: A,TIMETX                                                     |
;==========================================================================
TIMESTATUS_INT12ON:
        LCALL   T_IICSTART
        JNB     FLAG.1,TIME_SETMODE_1
        LJMP    T_ERR_IICSTOP           ;SDA线被箝位为低电平则退出
TIME_SETMODE_1:
	MOV	TIMETX,#60H             ;发送写时钟状态寄存器_1命令
	LCALL	T_SENDH_L
        JNB     FLAG.0,TIME_SETMODE_2
        LJMP    T_ERR_IICSTOP           ;ACK信号不正常则退出?
TIME_SETMODE_2:
	MOV	TIMETX,#32H             ;24小时进制,/INT1及/INT2脚的输出
	LCALL	T_SENDL_H		;
        LCALL   T_IICSTOP                 ;

        LCALL   T_IICSTART
	MOV	TIMETX,#62H             ;发送写时钟状态寄存器_2命令
	LCALL	T_SENDH_L
	MOV	TIMETX,#18H             ;/INT1为32768hz,/INT2脚输出固定频率
	LCALL	T_SENDL_H	        ;
        LCALL   T_IICSTOP               ;

        LCALL   T_IICSTART
	MOV	TIMETX,#6AH             ;发送写INT1_2命令
	LCALL	T_SENDH_L
	MOV	TIMETX,#10H             ;/INT2输出 16HZ
	LCALL	T_SENDL_H	        ;
        LCALL   T_IICSTOP               ;
        RET

;-----------------------------------
TIMESTATUS_INT12OFF:
        LCALL   T_IICSTART
	MOV	TIMETX,#62H             ;发送写时钟状态寄存器_2命令
	LCALL	T_SENDH_L
	MOV	TIMETX,#00H             ;关闭/INT1和/INT2脚的输出
	LCALL	T_SENDL_H	        ;
        LCALL   T_IICSTOP

        RET

;============================写状态寄存器程序==============================
;功能:读/写实时时钟状态寄存器,对其进行设置                              |
;入口:NONE           出口:NONE                                          |
;影响资源: A,TIMETX                                                     |
;==========================================================================
TIME_RESET:
        LCALL   T_IICSTART
        JNB     FLAG.1,TIME_RESET_1
        LJMP    T_ERR_IICSTOP           ;SDA线被箝位为低电平则退出
TIME_RESET_1:
        MOV     TIMETX,#60H		;读写状态寄存器_1命令
        LCALL   T_SENDH_L
        MOV     TIMETX,#03H		;RESET命令,24H制
        LCALL   T_SENDH_L
        LCALL   T_IICSTOP
        RET
;----------------------------------------------------
BCD_LEDHOURSECOND:

	MOV	A,HOUR
	SWAP	A
	ANL	A,#0FH
	MOV	DIG6,A
	MOV	A,HOUR
        ANL     A,#0FH
        MOV     DIG5,A

	MOV	A,MINUTE
	SWAP	A
	ANL	A,#0FH
	MOV	DIG4,A
	MOV	A,MINUTE
        ANL     A,#0FH
        MOV     DIG3,A

	MOV	A,SECOND
	SWAP	A
	ANL	A,#0FH
	MOV	DIG2,A                ;
	MOV	A,SECOND
        ANL     A,#0FH
        MOV     DIG1,A
        RET

BCD_LEDYEARWEEK:

	MOV	A,YEAR
	SWAP	A
	ANL	A,#0FH
	MOV	DIG8,A
	MOV	A,YEAR
        ANL     A,#0FH
        MOV     DIG7,A


	MOV	A,MONTH
	SWAP	A
	ANL	A,#0FH
	MOV	DIG6,A
	MOV	A,MONTH
        ANL     A,#0FH
        MOV     DIG5,A

	MOV	A,DAY
	SWAP	A
	ANL	A,#0FH
	MOV	DIG4,A
	MOV	A,DAY
        ANL     A,#0FH
        MOV     DIG3,A

	MOV	A,WEEK
	SWAP	A
	ANL	A,#0FH
	MOV	DIG2,A            ;
	MOV	A,WEEK
        ANL     A,#0FH
        MOV     DIG1,A
        RET



;==============================WRITE SRAM/EEPROM ==========================
;功能:把数据储存到SD2200的SRAM的全部地址中去
;入口:数据首地址在A中,储存首地址在SRAMADD中,数据个数在SRAMNUM中
;出口:无
;影响资源:A,TIMETX,SRAMADD,R0,R1,SRAMNUM
;==========================================================================
WRITESRAM:
        LCALL    T_IICSTART
        JNB      FLAG.1,SRAM_WRITE_1
        LJMP     SRAM_ERROR                    ;SDA线被箝位为低电平则退出
SRAM_WRITE_1:
        MOV      TIMETX,#0A0H		       ;A2A1A0="000"
        LCALL    T_SENDH_L		       ;SLAVE ADDRESS
        JNB      FLAG.0,SRAM_WRITE_2
        LJMP     SRAM_ERROR                    ;ACK信号不正常则退出?
SRAM_WRITE_2:
        MOV      A,SRAMADD_LO                  ;RAM首地址在SRAMADD_LO中

⌨️ 快捷键说明

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