📄 clock_ds1307.lst
字号:
95 =1
96 =1
97 =1 /*******************************************************************
98 =1 向有子地址器件读取多字节数据函数
99 =1 函数原型: bit I2C_SendStr(uchar sla,uchar suba,ucahr *s,uchar no);
100 =1 功能: 从启动总线到发送地址、子地址、读数据、结束总线的全过程,从器件
101 =1 地址sla,子地址suba,读出的内容放入s指向的存储区读no个字节。
102 =1 如果返回1,表示操作成功,否则操作有误。
103 =1 ********************************************************************/
104 =1 extern bit I2C_RcvStr(uchar sla,uchar suba,uchar *s,uchar no);
105 =1
106 =1
107 =1 #ifndef READYDEF_uchar
108 =1 #undef uchar
109 =1 #endif
110 =1
111 =1 /*软件包大小 字节*/
16
17
18
19 #define uchar unsigned char
20 #define uint unsigned int
21
22 // I2C write address of DS1307
23 #define DS1307_ADDRESS 0xD0
C51 COMPILER V7.07 CLOCK_DS1307 07/08/2004 05:56:12 PAGE 6
24
25
26 enum weekdays { SUNDAY = 1, MONDAY, TUESDAY, WEDNESDAY, THURSDAY,
27 FRIDAY, SATURDAY }; // define the weekdays
28
29 enum months { JANUARY = 1, FEBRUARY, MARCH, APRIL, MAY, JUNE,
30 JULY, AUGUST, SEPTEMBER, OCTOBER, NOVEMBER, DECEMBER };
31 // define the months
32
33 typedef struct
34 {
35 uchar seconds;
36 uchar minute;
37 uchar hour;
38 uchar weekday;
39 uchar day;
40 uchar month;
41 uchar year;
42 uchar control;
43 } DS1307_time;
44
45
46 //定义系统日期时间,初始化-2004.1.1. 00:00:00
47 //DS1307格式
48 xdata struct DS1307_time current_clock = {0x00, 0x00, 0x00, SUNDAY , 0x01 , JANUARY , 04};
49
50
51
52 //CL(SYSTEMCLOCK) 系统时钟时间--程序格式
53 xdata uchar uc8_SystemDateTime[8];
54
55 //字节序号 0 1 2 3
56 //时间格式 百小时(0-9) 小时(00-99) 分钟(0-59) 秒(0-59)
57 //字节序号 4 5 6 7
58 //时间格式 年(00-99) 月(01-12) 日(01-31) 控制字节
59
60
61 // 10进制码-->BCD码
62 // function chartobcd
63 // converts a decimal value to the BCD equivalent
64 // decimal values must be stored in the Real Time Clock in BCD format
65 // passed is the decimal value to convert
66 // returned is the BCD equivalent
67 unsigned char chartobcd(unsigned char n)
68 {
69 1 return ((n / 10) << 4) | (n % 10);
70 1 }
71
72
73 // BCD码-->10进制码
74 // function bcdtochar
75 // converts a number in BCD format to the decimal equivalent
76 // decimal values must be stored in the Real Time Clock in BCD format
77 // passed is the BCD format value
78 // returned is the decimal equivalent
79 uchar bcdtochar(unsigned char bcdnum)
80 {
81 1 return (bcdnum & 0x0f) + (bcdnum >> 4) * 10;
82 1 }
83
84
85 /*******************************************************************
C51 COMPILER V7.07 CLOCK_DS1307 07/08/2004 05:56:12 PAGE 7
86 系统日期时间设置函数(内部格式转换)
87 函数原型: void fnSet_SystemClock()
88 功能: 系统日期时间设置DS1307(内部格式转换),并立即运行!
89
90 涉及变量: uc8_SystemDateTime[8];
91 current_clock
92 ********************************************************************/
93 void fnSet_SystemClock()
94 {
95 1 //内部格式转换
96 1 //程序格式-->DS1307格式
97 1 //10进制码-->BCD码
98 1
99 1 current_clock.year = chartobcd(uc8_SystemDateTime[4]);
100 1
101 1 current_clock.month = chartobcd(uc8_SystemDateTime[5]);
102 1
103 1 current_clock.day = chartobcd(uc8_SystemDateTime[6]);
104 1
105 1 current_clock.hour = chartobcd(uc8_SystemDateTime[1]);
106 1
107 1 current_clock.minute = chartobcd(uc8_SystemDateTime[2]);
108 1
109 1 current_clock.seconds = chartobcd(uc8_SystemDateTime[3]);
110 1
111 1 current_clock.weekday = 1;
112 1
113 1 //强制DS1307运行于24小时模式
114 1
115 1 current_clock.hour = current_clock.hour & 0x3f;
116 1
117 1 // enable the oscillator (CH bit = 0)
118 1
119 1 current_clock.seconds = current_clock.seconds & 0x7f;
120 1
121 1 current_clock.control = 0x00;
122 1
123 1 //I2C写入
124 1 I2C_SendStr(DS1307_ADDRESS,0x00,(uchar *)¤t_clock ,8);
125 1
126 1 }
127
128
129
130 /*******************************************************************
131 系统日期时间读取函数(内部格式转换)
132 函数原型: void fnRead_SystemClock()
133 功能: 系统日期时间读取DS1307(内部格式转换)
134
135 涉及变量: uc8_SystemDateTime[8];
136 current_clock
137 ********************************************************************/
138 void fnRead_SystemClock()
139 {
140 1 //I2C读取
141 1 I2C_RcvStr(DS1307_ADDRESS,0x00,(uchar *)¤t_clock,8);
142 1
143 1 //内部格式转换
144 1 //DS1307格式-->程序格式
145 1 //BCD码-->10进制码
146 1
147 1 uc8_SystemDateTime[4] = bcdtochar(current_clock.year);
C51 COMPILER V7.07 CLOCK_DS1307 07/08/2004 05:56:12 PAGE 8
148 1
149 1 uc8_SystemDateTime[5] = bcdtochar(current_clock.month);
150 1
151 1 uc8_SystemDateTime[6] = bcdtochar(current_clock.day);
152 1
153 1 uc8_SystemDateTime[1] = bcdtochar(current_clock.hour);
154 1
155 1 uc8_SystemDateTime[2] = bcdtochar(current_clock.minute);
156 1
157 1 uc8_SystemDateTime[3] = bcdtochar(current_clock.seconds);
158 1
159 1
160 1 }
161
162
163 /*******************************************************************
164 DS1307的RAM数据操作函数:在某地址写入n字节数据
165 函数原型: bit fnWrite_DS1307RAM(uchar ucAddress,uchar ucSize, uchar *uc_Data);
166 功能: DS1307的RAM数据操作函数:在DS1307的RAM某地址写入n字节数据
167 所有数据的地址范围检查。
168 数据地址的范围00H-3FH,注意00H-07H是DS1307的工作寄存器。
169 涉及变量:
170 ucAddress 写入的RAM地址
171 ucSize 写入的数据长度
172 *uc_Data 写入数据的指针
173 返回: 0 出错
174 1 正常
175 ********************************************************************/
176 bit fnWrite_DS1307RAM(uchar ucAddress,uchar ucSize, uchar *uc_Data)
177 {
178 1 //检查所有数据的最终写入地址是否越界00H-3FH
179 1 if( ucAddress + ucSize > 0x3F)
180 1 return(0);
181 1
182 1 //利用I2C总线把数据写入DS1307的RAM
183 1 //I2C写入
184 1 I2C_SendStr(DS1307_ADDRESS,ucAddress,uc_Data,ucSize);
185 1
186 1 //返回 正常
187 1 return(1);
188 1 }
189
190
191
192 /*******************************************************************
193 DS1307的RAM数据操作函数:在某地址读入n字节数据
194 函数原型: bit fnRead_DS1307RAM(uchar ucAddress,uchar ucSize, uchar *uc_Data);
195 功能: DS1307的RAM数据操作函数:在DS1307的RAM某地址读入n字节数据
196 所有数据的地址范围检查。
197 数据地址的范围00H-3FH,注意00H-07H是DS1307的工作寄存器。
198 涉及变量:
199 ucAddress 读入的RAM地址
200 ucSize 读入的数据长度
201 *uc_Data 读入数据的指针
202 返回: 0 出错
203 1 正常
204 ********************************************************************/
205 bit fnRead_DS1307RAM(uchar ucAddress,uchar ucSize, uchar *uc_Data)
206 {
207 1 //检查所有数据的最终读入地址是否越界00H-3FH
208 1 if( ucAddress + ucSize > 0x3F)
209 1 return(0);
C51 COMPILER V7.07 CLOCK_DS1307 07/08/2004 05:56:12 PAGE 9
210 1
211 1 //利用I2C总线把数据读入DS1307的RAM
212 1 //I2C读取
213 1 I2C_RcvStr(DS1307_ADDRESS,ucAddress,uc_Data,ucSize);
214 1
215 1 //返回 正常
216 1 return(1);
217 1 }
C51 COMPILER V7.07 CLOCK_DS1307 07/08/2004 05:56:12 PAGE 10
ASSEMBLY LISTING OF GENERATED OBJECT CODE
; FUNCTION _chartobcd (BEGIN)
; SOURCE LINE # 67
;---- Variable 'n' assigned to Register 'R7' ----
; SOURCE LINE # 68
; SOURCE LINE # 69
0000 EF MOV A,R7
0001 75F00A MOV B,#0AH
0004 84 DIV AB
0005 C4 SWAP A
0006 54F0 ANL A,#0F0H
0008 FE MOV R6,A
0009 EF MOV A,R7
000A 75F00A MOV B,#0AH
000D 84 DIV AB
000E E5F0 MOV A,B
0010 4E ORL A,R6
0011 FF MOV R7,A
; SOURCE LINE # 70
0012 ?C0001:
0012 22 RET
; FUNCTION _chartobcd (END)
; FUNCTION _bcdtochar (BEGIN)
; SOURCE LINE # 79
;---- Variable 'bcdnum' assigned to Register 'R7' ----
; SOURCE LINE # 80
; SOURCE LINE # 81
0000 EF MOV A,R7
0001 C4 SWAP A
0002 540F ANL A,#0FH
0004 75F00A MOV B,#0AH
0007 A4 MUL AB
0008 FE MOV R6,A
0009 EF MOV A,R7
000A 540F ANL A,#0FH
000C 2E ADD A,R6
000D FF MOV R7,A
; SOURCE LINE # 82
000E ?C0002:
000E 22 RET
; FUNCTION _bcdtochar (END)
; FUNCTION fnSet_SystemClock (BEGIN)
; SOURCE LINE # 93
; SOURCE LINE # 94
; SOURCE LINE # 99
0000 900000 R MOV DPTR,#uc8_SystemDateTime+04H
0003 E0 MOVX A,@DPTR
0004 FF MOV R7,A
0005 120000 R LCALL _chartobcd
0008 900000 R MOV DPTR,#current_clock+06H
000B EF MOV A,R7
000C F0 MOVX @DPTR,A
; SOURCE LINE # 101
000D 900000 R MOV DPTR,#uc8_SystemDateTime+05H
0010 E0 MOVX A,@DPTR
0011 FF MOV R7,A
0012 120000 R LCALL _chartobcd
0015 900000 R MOV DPTR,#current_clock+05H
C51 COMPILER V7.07 CLOCK_DS1307 07/08/2004 05:56:12 PAGE 11
0018 EF MOV A,R7
0019 F0 MOVX @DPTR,A
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -