1、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
2、 ;时钟线 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,
3、00H ;低电平方式 LCALL STIT ;跳转到启动时钟设置和报警中断子程序 START1: JNB B0 DEBUG0 ;查询是否有调整时间按钮按下 S0: LCALL DSUB0 ;读出并显示当前时间 AJMP START1 ;---------------------------------------------- ;读子程序 R: MOV SLVADR,#EEPROM MOV BYTECNT,55H MOV SUBA
4、DR, 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 ;------------------------------------------
5、 DSUB0: MOV 55H,#02H ;读两个时间信息 MOV 56H,#03H ;取读时间的首字节地址 LCALL R ;调用读子程序 MOV R7,34H ;将分钟的信息放入R7 MOV R6,35H ;将小时的信息放入R6 LCALL DISPLAY ;调用显示时间子程序 RET ;---------------------------------------------- DEBUG
6、0:LCALL DELAY1 ;调用延时子程序,消抖作用 JB B0,START1 ;判断是否为外界干扰 JNB B0,$ ;判断按键是否弹起 DEBUG1:JNB B1 MINI ;判断调节分钟的按钮是否按下,是则跳到分钟子程序 M1 : JNB B2 HOUR ;判断调节小时的按钮是否按下,是则跳到小时子程序 JNB B0 RETU ;判断时间是否调整好,是则跳到返回子程序 LCALL DSUB0 AJMP DE
7、BUG1 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
8、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,$ ;判断按键是否弹起
9、 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 ;---------------------------------------------- ;启
10、动时钟 ;设置报警中断 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,#
11、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,
12、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 ;取分钟信息
13、 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是否到
14、 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是否到
15、 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 DISPLA
16、Y0 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 ;--------------------------------
17、 ;子程序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是否到,是则跳转到子程序D
18、ISPLAY5 ;关断六个灯光和三个电机 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
19、 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,
20、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
21、 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 ;-----------
22、 ;子程序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,用以判
23、断时间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 ;启动1
24、K的电机 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
25、 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--------------
26、 ; - 发送数据程序 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
27、 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 ;--------------------------------- ;接收数据程序 ;-----------------------
28、 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
29、 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,
30、A ACALL STOP RCVRETURN: RET ;---------------------- ;SUBPROGRAM ;------------------------ ;NAME:START 起始条件 ;-------------------------- START: SETB SDA NOP nop nop SETB SCL NOP NOP
31、 NOP NOP NOP CLR SDA NOP NOP NOP NOP NOP CLR SCL RET ;------------------------------ ;NAME:STOP 停止条件 ;------------------------------- STOP: CLR SDA
32、NOP nop nop nop SETB SCL NOP NOP NOP NOP NOP SETB SDA NOP NOP NOP NOP RET ;--------------------------------
33、NAME:SENTBYTE 字节数据发送子程序 ;-------------------------------- SENTBYTE: MOV BITCNT,#08H SENTB: RLC A JC SENT1 CLR SDA SJMP SENT SENT1: SETB SDA NOP SENT: nop NOP SE
34、TB SCL NOP nop NOP NOP NOP NOP CLR SCL DJNZ BITCNT,SENTB NOP NOP nop SETB SDA NOP NOP nop SETB
35、 SCL NOP NOP nop CLR F0 JNB SDA,ACKEND SETB F0 ACKEND: nop NOP CLR SCL nop nop RET ;-------------------- ;NAME:RCVBYTE 字节数据接收子程序 ;--
36、 RCVBYTE: SETB SDA MOV BITCNT,#08H RCV: nop NOP nop CLR SCL NOP nop NOP NOP NOP SETB SCL NOP NOP nop
37、 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
38、 SETB SDA SENTACKB: nop NOP NOP SETB SCL NOP nop nop NOP NOP CLR SCL CLR ACK RET ;---------------------------------------------- ;显示小时和分钟子程序 DISPLAY:MOV R1,
39、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 NO
40、P 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,LOOP
41、0 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






