资源描述
EEPROM EQU 0A2H ;0A0H 为8563地址
BITCNT DATA 30H ;数据位计数器
BYTECNT DATA 31H ;发送或接收的字节个数
SLVADR DATA 32H ;=0A0H 为8563地址
SUBADR DATA 33H ;被控器单元地址
RCVDAT DATA 34H ;接收数据缓冲器首址8563首址
XMTDAT DATA 44H ;发送数据缓冲器首址
SDA BIT P2.6 ;数据线
SCL BIT P2.7 ;时钟线
B0 BIT P0.5
B1 BIT P0.6
B2 BIT P0.7
CLK BIT P3.4
DIN BIT P3.5
ACK BIT 73H
ORG 00H
AJMP MAIN
ORG 013H
LJMP T0SUB
ORG 30H
MAIN: MOV IE,#84H ;开外部中断1
MOV IP,#04H ;外部中断1优先
MOV TCON,#00H ;低电平方式
LCALL STIT ;跳转到启动时钟设置和报警中断子程序
START1: JNB B0 DEBUG0 ;查询是否有调整时间按钮按下
S0: LCALL DSUB0 ;读出并显示当前时间
AJMP START1
;----------------------------------------------
;读子程序
R: MOV SLVADR,#EEPROM
MOV BYTECNT,55H
MOV SUBADR, 56H
MA0: LCALL RCVDATA
JB F0,MA0
RET
;----------------------------------------------
;写子程序
W: MOV SLVADR,#EEPROM
MOV BYTECNT,57H
MOV SUBADR, 58H
MA1: LCALL SENTBYTE
JB F0,MA1
RET
;----------------------------------------------
DSUB0: MOV 55H,#02H ;读两个时间信息
MOV 56H,#03H ;取读时间的首字节地址
LCALL R ;调用读子程序
MOV R7,34H ;将分钟的信息放入R7
MOV R6,35H ;将小时的信息放入R6
LCALL DISPLAY ;调用显示时间子程序
RET
;----------------------------------------------
DEBUG0:LCALL DELAY1 ;调用延时子程序,消抖作用
JB B0,START1 ;判断是否为外界干扰
JNB B0,$ ;判断按键是否弹起
DEBUG1:JNB B1 MINI ;判断调节分钟的按钮是否按下,是则跳到分钟子程序
M1 : JNB B2 HOUR ;判断调节小时的按钮是否按下,是则跳到小时子程序
JNB B0 RETU ;判断时间是否调整好,是则跳到返回子程序
LCALL DSUB0
AJMP DEBUG1
RETU: LCALL DELAY1
JB B0,M1
JNB B0,$
AJMP S0
MINI: LCALL DELAY1 ;调用延时子程序,消抖作用
JB B1,M1 ;判断是否为外界干扰
JNB B1,$ ;判断按键是否弹起
CJNE R7,#59 ,MINI0 ;判断分钟是否到59,若没有则跳转到MINI0
MOV R7,#00 ;59后,让分钟归零
MIN: MOV 44H,R7 ;将调整后的分钟放入R7
MOV 57H,#02H ;调用写子程序
MOV 58H,#03H
LCALL W
RET
MINI0:INC R7
AJMP MIN
HOUR: LCALL DELAY1 ;调用延时子程序,消抖作用
JB B2,M1 ;判断是否为外界干扰
JNB B2,$ ;判断按键是否弹起
CJNE R6,#23,HOUR0 ;判断小时是否到23,若没有则跳转到HOUR0
MOV R6,#00 ;23后,让小时归零
HOU: MOV 44H,R6 ;调用写子程序
MOV 57H,#02H
MOV 58H,#04H
LCALL W
RET
HOUR0: INC R6
AJMP HOU
;----------------------------------------------
;启动时钟
;设置报警中断
STIT: MOV 55H,#02H
MOV 56H,#00H
LCALL R
MOV A,34H
ANL A,#00H ;启动时钟
MOV 44H,A
MOV A,35H
ORL A,#02H ;设置报警中断
MOV 45H,A
MOV 57H,#02H
MOV 58H,#00H
LCALL W
MOV 44H,#10H ;让8563在每小时的10分钟时产生报警并在/INT端产生一个中断给8051
MOV 57H,#00H
MOV 58H,#09H
LCALL W
RET
;----------------------------------------------
;清除AF,并判断是否到时间
T0SUB: MOV 55H,#01H
MOV 56H,#01H
LCALL R
;中断配置
MOV A,34H
ANL A,#17H ;设置成AF=0,但保持其他位不变
MOV 44H,A
MOV 57H,#01H ;写一个信息
MOV 58H,#01H ;取控制字节地址
LCALL W ;调用写子程序
MMOV 55H,#02H ;读两个时间信息
MOV 56H,#03H ;取分钟字节地址
LCALL R ;调用读子程序
MOV A,34H ;取分钟信息
ANL A,#7FH ;屏蔽无效位
MOV 34H,A
MOV A,35H ;取小时信息
ANL A,#3FH ;屏蔽无效位
MOV 35H,A
LCALL T1 ;调用子程序1,用以判断时间08:00是否到
LCALL T2 ;调用子程序2,用以判断时间08:10是否到
LCALL T3 ;调用子程序3,用以判断时间12:00是否到
LCALL T4 ;调用子程序4,用以判断时间12:10是否到
LCALL T5 ;调用子程序5,用以判断时间14:00是否到
LCALL T6 ;调用子程序6,用以判断时间14:10是否到
LCALL T7 ;调用子程序7,用以判断时间16:00是否到
LCALL T8 ;调用子程序8,用以判断时间16:10是否到
LCALL T9 ;调用子程序9,用以判断时间18:30是否到
LCALL T10 ;调用子程序10,用以判断时间18:40是否到
RETI
;----------------------------------------------
;子程序1,用以判断时间08:00是否到,是则跳转到子程序DISPLAY0
;启动六个灯光和启动1K的电机
T1: MOV A,34H
XRL A,#00H
JNZ RE1
MOV A,35H
XRL A,#08H
JNZ RE1
LCALL DISPLAY0
RE1: RET
;----------------------------------------------
; 子程序2,用以判断时间08:10是否到 ,是则跳转到子程序DISPLAY1
;关断灯和1K的电机
T2: MOV A,34H
XRL A,#10H
JNZ RE2
MOV A,35H
XRL A,#08H
JNZ RE2
LCALL DISPLAY1
RE2: RET
;----------------------------------------------
;子程序3,用以判断时间12:00是否到,是则跳转到子程序DISPLAY4
;启动六个灯光和同时启动三个电机
T3: MOV A,34H
XRL A,#00H
JNZ RE3
MOV A,35H
XRL A,#12H
JNZ RE3
LCALL DISPLAY4
RE3: RET
;----------------------------------------------
;子程序4,用以判断时间12:10是否到,是则跳转到子程序DISPLAY5
;关断六个灯光和三个电机
T4: MOV A,34H
XRL A,#10H
JNZ RE4
MOV A,35H
XRL A,#12H
JNZ RE4
LCALL DISPLAY5
RE4: RET
;----------------------------------------------
;子程序5,用以判断时间14:00是否到,是则跳转到子程序DISPLAY2
;启动六个灯光和启动一个2K电机
T5: MOV A,34H
XRL A,#00H
JNZ RE5
MOV A,35H
XRL A,#14H
JNZ RE5
LCALL DISPLAY2
RE5: RET
;----------------------------------------------
;子程序6,用以判断时间14:10是否到,是则跳转到子程序DISPLAY3
;关断六个灯光和启动一个2K电机
T6: MOV A,34H
XRL A,#10H
JNZ RE6
MOV A,35H
XRL A,#14H
JNZ RE6
LCALL DISPLAY3
RE6: RET
;----------------------------------------------
;子程序7,用以判断时间16:00是否到,是则跳转到子程序DISPLAY2
;启动六个灯光和启动一个2K电机
T7: MOV A,34H
XRL A,#00H
JNZ RE7
MOV A,35H
XRL A,#16H
JNZ RE7
LCALL DISPLAY2
RE7: RET
;----------------------------------------------
;子程序8,用以判断时间14:10是否到,是则跳转到子程序DISPLAY3
;关断六个灯光和启动一个2K电机
T8: MOV A,34H
XRL A,#10H
JNZ RE8
MOV A,35H
XRL A,#16H
JNZ RE8
LCALL DISPLAY3
RE8: RET
;----------------------------------------------
;子程序9,用以判断时间08:00是否到,是则跳转到子程序DISPLAY0
;启动六个灯光和启动1K的电机
T9: MOV A,34H
XRL A,#30H
JNZ RE9
MOV A,35H
XRL A,#18H
JNZ RE9
LCALL DISPLAY0
RE9: RET
;----------------------------------------------
; 子程序10,用以判断时间08:10是否到 ,是则跳转到子程序DISPLAY1
;关断灯和1K的电机
T10: MOV A,34H
XRL A,#40H
JNZ RE10
MOV A,35H
XRL A,#18H
JNZ RE10
LCALL DISPLAY1
RE10: RET
;----------------------------------------------
DISPLAY0: CLR P1.0 ;启动六个灯光
CLR P1.3 ;启动1K的电机
RET
DISPLAY1: SETB P1.0 ;关断灯
SETB P1.3 ; 段断1K的电机
RET
DISPLAY2: CLR P1.0 ;启动六个灯光
CLR P1.1 ;启动一个2K的电机
DISPLAY3: SETB P1.0 ; 关断灯
SETB P1.1 ; 段断2K的电机
RET
DISPLAY4: CLR P1.0 ;同时启动三个的电机
CLR P1.1 ;启动六个灯光
CLR P1.2
CLR P1.3
RET
DISPLAY5: SETB P1.0 ; 关断灯
SETB P1.1 ; 同时关断三个的电机
SETB P1.2
SETB P1.3
RET
;----------------------------------------------
;----------I2C BUS------------------------
; - 发送数据程序
SENDDATA: LCALL START
MOV A,SLVADR
LCALL SENTBYTE
JB F0,SENDRETURN
MOV A,SUBADR
LCALL SENTBYTE
JB F0,SENDRETURN
MOV R0,#XMTDAT
SENTNEXT: MOV A,@R0
LCALL SENTBYTE
JB F0,SENDRETURN
INC R0
DJNZ BYTECNT,SENTNEXT
ACALL STOP
DELAY10: MOV R7,#30H
D1: MOV R6,#34H
D2: DJNZ R6,D2
DJNZ R7,D1
SENDRETURN: RET
;---------------------------------
;接收数据程序
;---------------------------------
RCVDATA: ACALL START
MOV A,SLVADR
ACALL SENTBYTE
JB F0,RCVRETURN
MOV A,SUBADR
ACALL SENTBYTE
JB F0,RCVRETURN
ACALL START
MOV A,SLVADR
SETB ACC.0
ACALL SENTBYTE
JB F0,RCVRETURN
CLR ACK
MOV R0,#RCVDAT
DJNZ BYTECNT,RCVNEXT
SJMP RCVLAST
RCVNEXT: ACALL RCVBYTE
MOV @R0,A
INC R0
DJNZ BYTECNT,RCVNEXT
RCVLAST: SETB ACK
ACALL RCVBYTE
MOV @R0,A
ACALL STOP
RCVRETURN: RET
;----------------------
;SUBPROGRAM
;------------------------
;NAME:START 起始条件
;--------------------------
START: SETB SDA
NOP
nop
nop
SETB SCL
NOP
NOP
NOP
NOP
NOP
CLR SDA
NOP
NOP
NOP
NOP
NOP
CLR SCL
RET
;------------------------------
;NAME:STOP 停止条件
;-------------------------------
STOP: CLR SDA
NOP
nop
nop
nop
SETB SCL
NOP
NOP
NOP
NOP
NOP
SETB SDA
NOP
NOP
NOP
NOP
RET
;--------------------------------
;NAME:SENTBYTE 字节数据发送子程序
;--------------------------------
SENTBYTE:
MOV BITCNT,#08H
SENTB:
RLC A
JC SENT1
CLR SDA
SJMP SENT
SENT1:
SETB SDA
NOP
SENT: nop
NOP
SETB SCL
NOP
nop
NOP
NOP
NOP
NOP
CLR SCL
DJNZ BITCNT,SENTB
NOP
NOP
nop
SETB SDA
NOP
NOP
nop
SETB SCL
NOP
NOP
nop
CLR F0
JNB SDA,ACKEND
SETB F0
ACKEND: nop
NOP
CLR SCL
nop
nop
RET
;--------------------
;NAME:RCVBYTE 字节数据接收子程序
;--------------------
RCVBYTE:
SETB SDA
MOV BITCNT,#08H
RCV: nop
NOP
nop
CLR SCL
NOP
nop
NOP
NOP
NOP
SETB SCL
NOP
NOP
nop
CLR C
JNB SDA,RCV0
SETB C
RCV0:
RLC A
NOP
NOP
nop
DJNZ BITCNT,RCV
CLR SCL
NOP
NOP
NOP
CLR SDA
JNB ACK,SENTACKB
SETB SDA
SENTACKB: nop
NOP
NOP
SETB SCL
NOP
nop
nop
NOP
NOP
CLR SCL
CLR ACK
RET
;----------------------------------------------
;显示小时和分钟子程序
DISPLAY:MOV R1,#2
MOV R0,34H
LOOP0: MOV A,@R0
MOV B,#10
DIV AB
MOV 40H,A
MOV 41H,B
MOV A,41H
MOV DPTR,#TABLE
MOVC A,@A+DPTR
MOV R2,#08H
LOOP1: RLC A
MOV DIN,C
CLR CLK
NOP
SETB CLK
DJNZ R2,LOOP1
MOV A,40H
MOV DPTR,#TABLE
MOVC A,@A+DPTR
MOV R2,#08H
LOOP2: RLC A
MOV DIN,C
CLR CLK
NOP
SETB CLK
DJNZ R2,LOOP2
INC R0
DJNZ R1,LOOP0
RET
DELAY1: MOV R3,#10 ;延时10秒子程序
LOOP5: MOV R4,#100
LOOP2: NOP
NOP
NOP
DJNZ R4,LOOP2
DJNZ R3,LOOP5
RET
;----------------------------------------------
TABLE: DB 0C0H,0F9H,0A4H,0B0H,099H,092H,082H,0F8H,080H
DB 090H,088H,083H,0C6H,0A1H,086H,08EH,0FFH
END
展开阅读全文