Arduino和C51开发DS1302时钟

发布时间:2018-12-20
技术:51单片机、Arduino、DS1302时钟、串口通信

概述

本文实现51单片机和Arduino串口实时显示时钟功能,让读者对DS1302能够更好的理解,这次功能也和上节课学到的串口通信运用在一起

详细

一、DS1302时钟

  DS1302 是美国DALLAS公司推出的一种高性能、低功耗、带RAM的实时时钟电路,它可以对年、月、日、周、时、分、秒进行计时,具有闰年补偿功能,工作电压为2.0V~5.5V。采用三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号或RAM数据。DS1302内部有一个31×8的用于临时性存放数据的RAM寄存器

二、51单片机串口显示时钟

  硬件连接:  图片5.png

  初始化DS1302时钟后,DS1302内部会进行计时,这里我们通过datapros()把当前时间放入Data字符串中,代码如下:

void datapros() //时间读取处理转换函数  
{
    Ds1302ReadTime();
    Data[0] = '0'+(TIME[2]/16);    //时
    Data[1] = '0'+(TIME[2]&0x0f);     
    Data[2] = ':';
    Data[3] = '0'+(TIME[1]/16);    //分
    Data[4] = '0'+(TIME[1]&0x0f); 
    Data[5] = ':';
    Data[6] = '0'+(TIME[0]/16);    //秒
    Data[7] = '0'+(TIME[0]&0x0f);
}

  主函数只要每1s打印一次数据到串口就实现时钟功能了,代码如下:

void main()
{ 
    int i;
    Ds1302Init();  //Ds1302初始化
    UsartInit();     //串口初始化
    while(1)
    {
        datapros();
        sprintf(time_data,"%c%c%c%c%c%c%c%c",Data[0],Data[1],Data[2],Data[3],Data[4],Data[5],Data[6],Data[7]); //合成字符串函数
        printf(time_data);
        printf("\n");
        delay1s(); //1s打印一次时间
    }  
}

  时钟功能如下图:

1545201072158061151.png

  注:如果加了其他功能,代码量多了,不能每1s打印出时间了,那你可以试试用中断

三、Arduino串口显示时钟

  硬件连接:  图片6.png

  编译烧写前,你还需要:

  1. 右击Arduino软件->打开文件所在的位置

  2. 将本项目代码文件夹中的DS1302文件夹复制到libraries文件夹中

图片2.png

  这样我们代码中才能使用DS1302这个头文件,代码如下:

#include <stdio.h>
#include <string.h>
#include "DS1302.h"
 
uint8_t RST = 5;
uint8_t DAT = 6;
uint8_t CLK = 7;
 
/* 日期变量缓存 */
char buf[50];
char day[10];
 
/* 定义DS1302对象 */
DS1302 rtc(RST, DAT, CLK);
 
void print_time()
{
    Time t = rtc.time();
    /* 星期转换成字符串 */
    memset(day, 0, sizeof(day));
    switch (t.day)
    {
      case 1: strcpy(day, "Sunday"); break;
      case 2: strcpy(day, "Monday"); break;
      case 3: strcpy(day, "Tuesday"); break;
      case 4: strcpy(day, "Wednesday"); break;
      case 5: strcpy(day, "Thursday"); break;
      case 6: strcpy(day, "Friday"); break;
      case 7: strcpy(day, "Saturday"); break;
    }
    /* 日期格式化 */
    snprintf(buf, sizeof(buf), "%04d-%02d-%02d %02d:%02d:%02d %s", t.yr, t.mon, t.date, t.hr, t.min, t.sec, day);
    /* 打印输出 */
    Serial.println(buf);
}
 
void setup()
{
    Serial.begin(9600);
    rtc.writeProtect(false);//关闭写保护
    rtc.halt(false);
    /* 初始化时间 */
    Time t(2018, 12, 19, 12, 0, 0, 4);//最后一个为星期x,日:1、一:2、二:3.....
    rtc.time(t);
    rtc.writeProtect(true);//开启写保护
}
 
void loop()
{   
    /* 串口显示时间 */
    print_time();
    delay(1000);
}

  时钟功能如下图:

1545199880377064430.png

四、总结

本文实现51单片机和Arduino串口显示时钟功能,让读者对DS1302能够更好的理解,如果想深入了解DS1302具体实现和其他的功能,大家可以自行上网搜索资料,相信付出就会有收获。

五、项目结构图

图片4.png



本实例支付的费用只是购买源码的费用,如有疑问欢迎在文末留言交流,如需作者在线代码指导、定制等,在作者开启付费服务后,可以点击“购买服务”进行实时联系,请知悉,谢谢
手机上随时阅读、收藏该文章 ?请扫下方二维码