📄 ds1302时钟+ds18b20.lst
字号:
267 1 Time->DateString[10] = '\0'; //字符串末尾加 '\0' ,判断结束字符
268 1 }
269
270 void TimeToStr(SYSTEMTIME *Time) //将时,分,秒数据转换成液晶显示字符放到数组 TimeString[];
271 { if(hide_hour<2)
272 1 {
273 2 Time->TimeString[0] = Time->Hour/10 + '0';
274 2 Time->TimeString[1] = Time->Hour%10 + '0';
275 2 }
276 1 else
277 1 {
278 2 Time->TimeString[0] = ' ';
279 2 Time->TimeString[1] = ' ';
280 2 }
281 1 Time->TimeString[2] = ':';
282 1 if(hide_min<2)
283 1 {
284 2 Time->TimeString[3] = Time->Minute/10 + '0';
285 2 Time->TimeString[4] = Time->Minute%10 + '0';
286 2 }
287 1 else
288 1 {
289 2 Time->TimeString[3] = ' ';
290 2 Time->TimeString[4] = ' ';
291 2 }
292 1 Time->TimeString[5] = ':';
293 1 if(hide_sec<2)
294 1 {
295 2 Time->TimeString[6] = Time->Second/10 + '0';
296 2 Time->TimeString[7] = Time->Second%10 + '0';
297 2 }
298 1 else
299 1 {
300 2 Time->TimeString[6] = ' ';
C51 COMPILER V6.12 DS1302_____DS18B20 12/27/2009 10:30:49 PAGE 6
301 2 Time->TimeString[7] = ' ';
302 2 }
303 1 Time->DateString[8] = '\0';
304 1 }
305
306
307 void Initial_DS1302(void) //时钟芯片初始化
308 {
309 1 unsigned char Second=Read1302(DS1302_SECOND);
310 1 if(Second&0x80) //判断时钟芯片是否关闭,秒寄存器的第7位是时钟停止位,为0 时启动时钟
311 1 {
312 2 Write1302(0x8e,0x00); //写入允许
313 2 Write1302(0x8c,0x07); //以下写入初始化时间 日期:07/07/25.星期: 3. 时间: 23:59:55
314 2 Write1302(0x88,0x07);
315 2 Write1302(0x86,0x25);
316 2 Write1302(0x8a,0x03);
317 2 Write1302(0x84,0x23);
318 2 Write1302(0x82,0x59);
319 2 Write1302(0x80,0x55);
320 2 Write1302(0x8e,0x80); //禁止写入
321 2 }
322 1
323 1 }
324
325 /***********ds18b20子程序*************************/
326
327 /***********ds18b20延迟子函数(晶振12MHz )*******/
328
329 void delay_18B20(unsigned int i)
330 {
331 1 while(i--);
332 1 }
333
334 /**********ds18b20初始化函数**********************/
335
336 void Init_DS18B20(void)
337 {
338 1 unsigned char x=0;
339 1 DQ = 1; //DQ复位
340 1 delay_18B20(8); //稍做延时
341 1 DQ = 0; //单片机将DQ拉低
342 1 delay_18B20(80); //精确延时 大于 480us
343 1 DQ = 1; //拉高总线
344 1 delay_18B20(14);
345 1 x=DQ; //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
346 1 delay_18B20(20);
347 1 }
348
349 /***********ds18b20读一个字节**************/
350
351 unsigned char ReadOneChar(void)
352 {
353 1 uchar i=0;
354 1 uchar dat = 0;
355 1 for (i=8;i>0;i--)
356 1 {
357 2 DQ = 0; // 给脉冲信号
358 2 dat>>=1;
359 2 DQ = 1; // 给脉冲信号
360 2 if(DQ)
361 2 dat|=0x80;
362 2 delay_18B20(4);
C51 COMPILER V6.12 DS1302_____DS18B20 12/27/2009 10:30:49 PAGE 7
363 2 }
364 1 return(dat);
365 1 }
366
367 /*************ds18b20写一个字节****************/
368
369 void WriteOneChar(uchar dat)
370 {
371 1 unsigned char i=0;
372 1 for (i=8; i>0; i--)
373 1 {
374 2 DQ = 0;
375 2 DQ = dat&0x01;
376 2 delay_18B20(5);
377 2 DQ = 1;
378 2 dat>>=1;
379 2 }
380 1 }
381
382 /**************读取ds18b20当前温度************/
383
384 void ReadTemp(void)
385 {
386 1 unsigned char a=0;
387 1 unsigned char b=0;
388 1 unsigned char t=0;
389 1
390 1 Init_DS18B20();
391 1 WriteOneChar(0xCC); // 跳过读序号列号的操作
392 1 WriteOneChar(0x44); // 启动温度转换
393 1
394 1 delay_18B20(100); // this message is wery important
395 1
396 1 Init_DS18B20();
397 1 WriteOneChar(0xCC); //跳过读序号列号的操作
398 1 WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
399 1
400 1 delay_18B20(100);
401 1
402 1 a=ReadOneChar(); //读取温度值低位
403 1 b=ReadOneChar(); //读取温度值高位
404 1 temp_value=b<<4;
405 1 temp_value+=(a&0xf0)>>4;
406 1 }
407 void temp_to_str() //温度数据转换成液晶字符显示
408 {
409 1 TempBuffer[0]=temp_value/10+'0'; //十位
410 1 TempBuffer[1]=temp_value%10+'0'; //个位
411 1 TempBuffer[2]=0xdf; //温度符号
412 1 TempBuffer[3]='C';
413 1 TempBuffer[4]='\0';
414 1 }
415 void Delay1ms(unsigned int count)
416 {
417 1 unsigned int i,j;
418 1 for(i=0;i<count;i++)
419 1 for(j=0;j<120;j++);
420 1 }
421
422 /*延时子程序*/
423 void mdelay(uint delay)
424 { uint i;
C51 COMPILER V6.12 DS1302_____DS18B20 12/27/2009 10:30:49 PAGE 8
425 1 for(;delay>0;delay--)
426 1 for(i=0;i<62;i++); //1ms延时.
427 1
428 1
429 1 }
430
431
432 void outkey() //跳出调整模式,返回默认显示
433 { uchar Second;
434 1 if(out==0||wireless_1==1)
435 1 { mdelay(8);
436 2 count=0;
437 2 hide_sec=0,hide_min=0,hide_hour=0,hide_day=0,hide_week=0,hide_month=0,hide_year=0;
438 2 Second=Read1302(DS1302_SECOND);
439 2 Write1302(0x8e,0x00); //写入允许
440 2 Write1302(0x80,Second&0x7f);
441 2 Write1302(0x8E,0x80); //禁止写入
442 2 done=0;
443 2 //while(out==0);
444 2 //while(wireless_1==1);
445 2 }
446 1 }
447 //////////////////////////////////////////////////////////////////////////////////////////////////////////
-//
448 void Upkey()//升序按键
449 {
450 1 Up=1;
451 1 if(Up==0||wireless_2==1)
452 1 {
453 2 mdelay(8);
454 2 switch(count)
455 2 {case 1:
456 3 temp=Read1302(DS1302_SECOND); //读取秒数
457 3 temp=temp+1; //秒数加1
458 3 up_flag=1; //数据调整后更新标志
459 3 if((temp&0x7f)>0x59) //超过59秒,清零
460 3 temp=0;
461 3 break;
462 3 case 2:
463 3 temp=Read1302(DS1302_MINUTE); //读取分数
464 3 temp=temp+1; //分数加1
465 3 up_flag=1;
466 3 if(temp>0x59) //超过59分,清零
467 3 temp=0;
468 3 break;
469 3 case 3:
470 3 temp=Read1302(DS1302_HOUR); //读取小时数
471 3 temp=temp+1; //小时数加1
472 3 up_flag=1;
473 3 if(temp>0x23) //超过23小时,清零
474 3 temp=0;
475 3 break;
476 3 case 4:
477 3 temp=Read1302(DS1302_WEEK); //读取星期数
478 3 temp=temp+1; //星期数加1
479 3 up_flag=1;
480 3 if(temp>0x7)
481 3 temp=1;
482 3 break;
483 3 case 5:
484 3 temp=Read1302(DS1302_DAY); //读取日数
485 3 temp=temp+1; //日数加1
C51 COMPILER V6.12 DS1302_____DS18B20 12/27/2009 10:30:49 PAGE 9
486 3 up_flag=1;
487 3 if(temp>0x31)
488 3 temp=1;
489 3 break;
490 3 case 6:
491 3 temp=Read1302(DS1302_MONTH); //读取月数
492 3 temp=temp+1; //月数加1
493 3 up_flag=1;
494 3 if(temp>0x12)
495 3 temp=1;
496 3 break;
497 3 case 7:
498 3 temp=Read1302(DS1302_YEAR); //读取年数
499 3 temp=temp+1; //年数加1
500 3 up_flag=1;
501 3 if(temp>0x85)
502 3 temp=0;
503 3 break;
504 3 default:break;
505 3 }
506 2
507 2 while(Up==0);
508 2 while(wireless_2==1);
509 2 }
510 1 }
511
512 //////////////////////////////////////////////////////////////////////////////////////////////////////////
-//
513 void Downkey()//降序按键
514 {
515 1 Down=1;
516 1 if(Down==0||wireless_3==1)
517 1 {
518 2 mdelay(8);
519 2 switch(count)
520 2 {case 1:
521 3 temp=Read1302(DS1302_SECOND); //读取秒数
522 3 temp=temp-1; //秒数减1
523 3 down_flag=1; //数据调整后更新标志
524 3 if(temp==0x7f) //小于0秒,返回59秒
525 3 temp=0x59;
526 3 break;
527 3 case 2:
528 3 temp=Read1302(DS1302_MINUTE); //读取分数
529 3 temp=temp-1; //分数减1
530 3 down_flag=1;
531 3 if(temp==-1)
532 3 temp=0x59; //小于0秒,返回59秒
533 3 break;
534 3 case 3:
535 3 temp=Read1302(DS1302_HOUR); //读取小时数
536 3 temp=temp-1; //小时数减1
537 3 down_flag=1;
538 3 if(temp==-1)
539 3 temp=0x23;
540 3 break;
541 3 case 4:
542 3 temp=Read1302(DS1302_WEEK); //读取星期数
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -