📄 ds1302.lst
字号:
226 unsigned char Day;
227 unsigned char Month;
228 unsigned char Year;
229 unsigned char DateString[11];
230 unsigned char TimeString[9];
231 }SYSTEMTIME; //定义的时间类型
232 SYSTEMTIME CurrentTime;
233
234
235 #define AM(X) X
236 #define PM(X) (X+12) // 转成24小时制
237 #define DS1302_SECOND 0x80 //时钟芯片的寄存器位置,存放时间
238 #define DS1302_MINUTE 0x82
239 #define DS1302_HOUR 0x84
240 #define DS1302_WEEK 0x8A
241 #define DS1302_DAY 0x86
C51 COMPILER V7.50 DS1302 04/30/2008 22:40:42 PAGE 5
242 #define DS1302_MONTH 0x88
243 #define DS1302_YEAR 0x8C
244
245 void DS1302InputByte(unsigned char d) //实时时钟写入一字节(内部函数)
246 {
247 1 unsigned char i;
248 1 ACC = d;
249 1 for(i=8; i>0; i--)
250 1 {
251 2 DS1302_IO = ACC0; //相当于汇编中的 RRC
252 2 DS1302_CLK = 1;
253 2 DS1302_CLK = 0;
254 2 ACC = ACC >> 1;
255 2 }
256 1 }
257
258 unsigned char DS1302OutputByte(void) //实时时钟读取一字节(内部函数)
259 {
260 1 unsigned char i;
261 1 for(i=8; i>0; i--)
262 1 {
263 2 ACC = ACC >>1; //相当于汇编中的 RRC
264 2 ACC7 = DS1302_IO;
265 2 DS1302_CLK = 1;
266 2 DS1302_CLK = 0;
267 2 }
268 1 return(ACC);
269 1 }
270
271 void Write1302(unsigned char ucAddr, unsigned char ucDa) //ucAddr: DS1302地址, ucData: 要写的数据
272 {
273 1 DS1302_RST = 0;
274 1 DS1302_CLK = 0;
275 1 DS1302_RST = 1;
276 1 DS1302InputByte(ucAddr); // 地址,命令
277 1 DS1302InputByte(ucDa); // 写1Byte数据
278 1 DS1302_CLK = 1;
279 1 DS1302_RST = 0;
280 1 }
281
282 unsigned char Read1302(unsigned char ucAddr) //读取DS1302某地址的数据
283 {
284 1 unsigned char ucData;
285 1 DS1302_RST = 0;
286 1 DS1302_CLK = 0;
287 1 DS1302_RST = 1;
288 1 DS1302InputByte(ucAddr|0x01); // 地址,命令
289 1 ucData = DS1302OutputByte(); // 读1Byte数据
290 1 DS1302_CLK = 1;
291 1 DS1302_RST = 0;
292 1 return(ucData);
293 1 }
294
295
296
297 void DS1302_GetTime(SYSTEMTIME *Time) //获取时钟芯片的时钟数据到自定义的结构型数组
298 {
299 1 unsigned char ReadValue;
300 1 ReadValue = Read1302(DS1302_SECOND);
301 1 Time->Second = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
302 1 ReadValue = Read1302(DS1302_MINUTE);
303 1 Time->Minute = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
C51 COMPILER V7.50 DS1302 04/30/2008 22:40:42 PAGE 6
304 1 ReadValue = Read1302(DS1302_HOUR);
305 1 Time->Hour = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
306 1 ReadValue = Read1302(DS1302_DAY);
307 1 Time->Day = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
308 1 ReadValue = Read1302(DS1302_WEEK);
309 1 Time->Week = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
310 1 ReadValue = Read1302(DS1302_MONTH);
311 1 Time->Month = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
312 1 ReadValue = Read1302(DS1302_YEAR);
313 1 Time->Year = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
314 1 }
315
316 void DateToStr(SYSTEMTIME *Time) //将时间年,月,日,星期数据转换成液晶显示字符串,放到数组里DateString[]
317 { if(hide_year<2) //这里的if,else语句都是判断位闪烁,<2显示数据,>2就不显示,输出字符串为 2
-007/07/22
318 1 {
319 2 Time->DateString[0] = '2';
320 2 Time->DateString[1] = '0';
321 2 Time->DateString[2] = Time->Year/10 + '0';
322 2 Time->DateString[3] = Time->Year%10 + '0';
323 2 }
324 1 else
325 1 {
326 2 Time->DateString[0] = ' ';
327 2 Time->DateString[1] = ' ';
328 2 Time->DateString[2] = ' ';
329 2 Time->DateString[3] = ' ';
330 2 }
331 1 Time->DateString[4] = '/';
332 1 if(hide_month<2)
333 1 {
334 2 Time->DateString[5] = Time->Month/10 + '0';
335 2 Time->DateString[6] = Time->Month%10 + '0';
336 2 }
337 1 else
338 1 {
339 2 Time->DateString[5] = ' ';
340 2 Time->DateString[6] = ' ';
341 2 }
342 1 Time->DateString[7] = '/';
343 1 if(hide_day<2)
344 1 {
345 2 Time->DateString[8] = Time->Day/10 + '0';
346 2 Time->DateString[9] = Time->Day%10 + '0';
347 2 }
348 1 else
349 1 {
350 2 Time->DateString[8] = ' ';
351 2 Time->DateString[9] = ' ';
352 2 }
353 1 if(hide_week<2)
354 1 {
355 2 week_value[0] = Time->Week%10 + '0'; //星期的数据另外放到 week_value[]数组里,跟年,月,日的分开存放,因为
-等一下要在最后显示
356 2 }
357 1 else
358 1 {
359 2 week_value[0] = ' ';
360 2 }
361 1 week_value[1] = '\0';
362 1
363 1 Time->DateString[10] = '\0'; //字符串末尾加 '\0' ,判断结束字符
C51 COMPILER V7.50 DS1302 04/30/2008 22:40:42 PAGE 7
364 1 }
365
366 void TimeToStr(SYSTEMTIME *Time) //将时,分,秒数据转换成液晶显示字符放到数组 TimeString[];
367 { if(hide_hour<2)
368 1 {
369 2 Time->TimeString[0] = Time->Hour/10 + '0';
370 2 Time->TimeString[1] = Time->Hour%10 + '0';
371 2 }
372 1 else
373 1 {
374 2 Time->TimeString[0] = ' ';
375 2 Time->TimeString[1] = ' ';
376 2 }
377 1 Time->TimeString[2] = ':';
378 1 if(hide_min<2)
379 1 {
380 2 Time->TimeString[3] = Time->Minute/10 + '0';
381 2 Time->TimeString[4] = Time->Minute%10 + '0';
382 2 }
383 1 else
384 1 {
385 2 Time->TimeString[3] = ' ';
386 2 Time->TimeString[4] = ' ';
387 2 }
388 1 Time->TimeString[5] = ':';
389 1 if(hide_sec<2)
390 1 {
391 2 Time->TimeString[6] = Time->Second/10 + '0';
392 2 Time->TimeString[7] = Time->Second%10 + '0';
393 2 }
394 1 else
395 1 {
396 2 Time->TimeString[6] = ' ';
397 2 Time->TimeString[7] = ' ';
398 2 }
399 1 Time->DateString[8] = '\0';
400 1 }
401
402
403 void Initial_DS1302(void) //时钟芯片初始化
404 {
405 1 unsigned char Second=Read1302(DS1302_SECOND);
406 1 if(Second&0x80) //判断时钟芯片是否关闭
407 1 {
408 2 Write1302(0x8e,0x00); //写入允许
409 2 Write1302(0x8c,0x07); //以下写入初始化时间 日期:07/07/25.星期: 3. 时间: 23:59:55
410 2 Write1302(0x88,0x07);
411 2 Write1302(0x86,0x25);
412 2 Write1302(0x8a,0x07);
413 2 Write1302(0x84,0x23);
414 2 Write1302(0x82,0x59);
415 2 Write1302(0x80,0x55);
416 2 Write1302(0x8e,0x80); //禁止写入
417 2 }
418 1
419 1 }
420
421 /***********ds18b20子程序*************************/
422
423 /***********ds18b20延迟子函数(晶振12MHz )*******/
424
425 void delay_18B20(unsigned int i)
C51 COMPILER V7.50 DS1302 04/30/2008 22:40:42 PAGE 8
426 {
427 1 while(i--);
428 1 }
429
430 /**********ds18b20初始化函数**********************/
431
432 void Init_DS18B20(void)
433 {
434 1 unsigned char x=0;
435 1 DQ = 1; //DQ复位
436 1 delay_18B20(8); //稍做延时
437 1 DQ = 0; //单片机将DQ拉低
438 1 delay_18B20(80); //精确延时 大于 480us
439 1 DQ = 1; //拉高总线
440 1 delay_18B20(14);
441 1 x=DQ; //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
442 1 delay_18B20(20);
443 1 }
444
445 /***********ds18b20读一个字节**************/
446
447 unsigned char ReadOneChar(void)
448 {
449 1 uchar i=0;
450 1 uchar dat = 0;
451 1 for (i=8;i>0;i--)
452 1 {
453 2 DQ = 0; // 给脉冲信号
454 2 dat>>=1;
455 2 DQ = 1; // 给脉冲信号
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -