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

📄 x1205.asm

📁 X1205 是一个带有时钟 振荡器用一个外部的 这样除去了外部的离散元件和一个调整电容 实时时钟用分别的时 存器日历可正确通过2099 年 强大的双报警功能 每个星期二或三月21日上午5:
💻 ASM
字号:
               
                           

;***********************************************************************/ 
;* Copyright Wuhan P&S Info-Service Co., Ltd. */ 
;***********************************************************************/ 
;* */ 
;* This program is the sample of X1205. */ 
;* */ 
;* Time : 2003.11.1 */ 
;* MCU : AT89C52 */ 
;* Fosc : 11.0592M */ 
;* */ 
;***********************************************************************/ 
;*********************************************** 
;内部数据RAM初始化定义? * 
;*********************************************** 
;1)内部位寻址区RAM数据定义00H 
;I2C 标志
ACK BIT 00H 
;2)内部直接寻址区RAM数据定义30H 
24 
力源公司不为该示例程序承担各种商业和本示例仅供设计参考
法律责任
对应字节为20H 2FH 7FH
7FH 
www.icbase.com
               
                           
; 其中30H 
CCR_DDR EQU 
TIME0 EQU 
TIME1 EQU 
;3)MCU 89C52'S I/O PORT DEFINED 
SCL 
SDA 
EQU 
EQU 
;--------------------------------------------- 
;(1) I2C PROGRAM | 
;--------------------------------------------- 
;a) COMMON PART 
;启动I2C总线子程序
START: 
SETB 
NOP 
SETB 
NOP 
NOP 
NOP 
NOP 
NOP 
CLR 
NOP 
NOP 
NOP 
NOP 
NOP 
CLR 
NOP 
RET 
;结束I2C总线子程序
STOP: 
CLR 
NOP 
SETB 
NOP 
NOP 
3F 对应堆栈指针30H<=SP<=3FH 
40H ;时间存储首地址"40H" 
70H ;通用寄存器
71H ;通用寄存器
P1.6 
P1.7 
SDA 
SCL 
SDA 
SCL 
SDA 
SCL 
25 www.icbase.com
               
                           
SDA 
NOP 
NOP 
NOP 
SETB 
NOP 
NOP 
NOP 
NOP 
RET 
;发送应答信号
SDA 
SCL 
SCL 
MACK: 
CLR 
NOP 
NOP 
SETB 
NOP 
NOP 
NOP 
NOP 
NOP 
CLR 
NOP 
NOP 
RET 
;发送非应答信号
SDA 
SCL 
SCL 
MNACK: 
SETB 
NOP 
NOP 
SETB 
NOP 
NOP 
NOP 
NOP 
NOP 
CLR 
NOP 
NOP 
RET 
;检验应答子程序
26 www.icbase.com
               
                           
;返回值,ACK=1时表示有应答
SDA 
SCL 
ACK 
CACK: 
SETB 
NOP 
NOP 
SETB 
CLR 
NOP 
NOP 
MOV 
JC 
SETB 
C,SDA 
CEND 
ACK 
CEND: 
SCL 
NOP 
CLR 
NOP 
RET 
;发送字节子程序
;字节数据放入ACC 
;每发送一字节要调用一次CACK子程序,取应答位
R0, #08H 
WRBYTE: 
MOV 
WLP: 
A
WR1 
WR0 
RLC 
JC 
SJMP 
WLP1: 
R0, WLP DJNZ 
NOP 
RET 
SDA; 
SCL 
WR1:
SETB 
NOP 
SETB 
NOP 
NOP 
NOP 
NOP 
NOP 
CLR 
SJMP 
SCL 
WLP1 
;取数据位
;判断数据位
发送1 
27 www.icbase.com
               
                           
WR0:
CLR 
NOP 
SETB 
NOP 
NOP 
NOP 
NOP 
NOP 
CLR 
SJMP 
;读取字节子程序
;读出的值在ACC 
;每取一个字节要发送一个应答
RDBYTE: 
MOV 
RLP:
SETB 
NOP 
SETB 
NOP 
NOP 
MOV 
MOV 
CLR 
RLCA 
MOV 
NOP 
NOP 
NOP 
DJNZ 
RET 
;b)X1205的读写部分子程序
28 
;发送SDA 0 
SCL 
SCL 
WLP1 
非应答信号
R0, #08H 
SDA 
接收数据;时钟线为高SCL 
;读数据位C, SDA 
A, R2 
SCL 时间大于4.7us ;将SCL拉低
;进行数据位处理
R2, A 
再来一次;未够8位R0, RLP 
www.icbase.com
               
                           
;X1205的写实时时钟程序(依次设置秒/分/时/日/月/年/周/千年) 
;秒/分/时/日/月/年/周/千年==>以CCR_DDR为首地址的连续8字节中
;占用R1 CY A R3 
WRITE_CCR: 
RETWRNCCR 
LCALL START 
MOV A, #0DEH 
LCALL WRBYTE 
LCALL CACK 
JNB ACK, 
MOV A, #00H 
LCALL WRBYTE 
LCALL CACK 
MOV A, #3FH 
LCALL WRBYTE 
LCALL CACK 
MOV A, #02H 
LCALL WRBYTE 
LCALL CACK 
LCALL STOP 
RETWRNCCR 
LCALL START 
MOV A, #0DEH 
LCALL WRBYTE 
LCALL CACK 
JNB ACK, 
MOV A, #00H 
LCALL WRBYTE 
LCALL CACK 
MOV A, #3FH 
LCALL WRBYTE 
LCALL CACK 
MOV A, #06H 
LCALL WRBYTE 
LCALL CACK 
LCALL STOP 
ACK, 
MOV R3, #08H 
LCALL START 
MOV A, #0DEH 
LCALL WRBYTE 
LCALL CACK 
JNB RETWRNCCR 
;启动总线
;X1205器件地址
;发送器件从地址
;无应答则退出
;指定子地址高字节
;指定子地址低字节
;发02H到状态寄存器
;启动总线
;X1205器件地址
;发送器件从地址
;无应答则退出
;指定子地址高字节
;指定子地址低字节
;发06H到状态寄存器
;写入时间初始值秒/分/时/日/月/年/周/千年
;启动总线
;X1205器件地址
;发送器件从地址
;无应答则退出
www.icbase.com 
状态寄存器地址
WEL位置1 
状态寄存器地址
1 RWEL和WEL位置
29
               
                           
;指定子地址高字节
;指定子地址低字节(实时时钟地址
A, #00H 
A, #30H 
R1, #CCR_DDR 
;开始写数据
MOV 
LCALL WRBYTE 
LCALL CACK 
MOV 
LCALL WRBYTE 
LCALL CACK 
MOV 
WRCCRDA: 
MOV A, @R1 
LCALL WRBYTE 
LCALL CACK 
INC R1 
DJNZ ;判断写完没有R3, WRCCRDA 
RETWRNCCR: 
;非易失性写周期10MS 
LCALL STOP 
LCALL DELAY10MS 
LCALL DELAY10MS 
RET
A R1 
;启动读实时时钟程序
;向X1205器件读秒/分/时/日/月/年/周/千年数据
;;秒/分/时/日/月/年/周/千年==>以CCR_DDR为首地址的连续8字节中
;占用R3 CY 
READ_CCR: 
;
;启动总线
;X1205器件地址
;发送器件从地址
RETRDNCCR ;无应答则退出
;指定子地址高字节
;指定子地址低字节(实时时钟地址
MOV R3, #08H 
LCALL START 
MOV A, #0DEH 
LCALL WRBYTE 
LCALL CACK 
JNB ACK, 
MOV A, #00H 
LCALL WRBYTE 
LCALL CACK 
MOV A, #30H 
LCALL WRBYTE 
LCALL CACK 
;重新启动总线
;发读指令
ACK, 
LCALL START 
MOV A, #0DFH 
LCALL WRBYTE 
LCALL CACK 
JNB READ_CCR 
30 www.icbase.com
               
                           
;设置时间存储地址"40H" #CCR_DDR R1, 
;读操作开始
A
SACK 
MOV 
RDN1: 
LCALL RDBYTE 
MOV @R1, 
DJNZ R3, 
LCALL MNACK ;最后一字节法非应答信号
RETRDNCCR: 
LCALL STOP 
LCALL DELAY10MS 
RET 
SACK: 
RDN1 
LCALL MACK 
INC R1 
SJMP 
;--------------------------------------------- 
;(2) DELAY PROGRAM | 
;--------------------------------------------- 
DELAY10MS: 
LCALL DELAY5MS 
LCALL DELAY5MS 
RET 
DELAY5MS: 
LCALL DELAY1MS 
LCALL DELAY1MS 
LCALL DELAY1MS 
LCALL DELAY1MS 
LCALL DELAY1MS 
RET 
DELAY1MS: 
MOV TIME1, #02H 
DELAY1MS1: 
MOV TIME0, #0D9H 
DELAY1MS2: 
DJNZ TIME0, DELAY1MS2 
DJNZ TIME1, DELAY1MS1 
RET 

⌨️ 快捷键说明

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