Arduino和C51开发DS1302时钟

Posted demodashi

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Arduino和C51开发DS1302时钟相关的知识,希望对你有一定的参考价值。

技术:51单片机、Arduino、DS1302时钟、串口通信
 

概述

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

详细

一、DS1302时钟

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

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

硬件连接: 技术图片

初始化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("
");
        delay1s(); //1s打印一次时间
    }  
}

 

时钟功能如下图:

技术图片

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

三、Arduino串口显示时钟

硬件连接: 技术图片

编译烧写前,你还需要:

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

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

技术图片

这样我们代码中才能使用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);
}

 

时钟功能如下图:

技术图片

四、总结

 

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

五、项目结构图

技术图片



注:本文著作权归作者,由demo大师发表,拒绝转载,转载需要作者授权

以上是关于Arduino和C51开发DS1302时钟的主要内容,如果未能解决你的问题,请参考以下文章

Arduino UNO+DS1302+74HC595联级+8位数码管时钟+Proteus仿真(修复篇)

Proteus仿真Arduino UNO+DS1302+74HC595联级+8位数码管时钟+串口设置时间

Arduino UNO + DS1302简单获取时间并串口打印

Arduino UNO+DS1302+74HC595联级+8位共阴数码管时钟+Proteus仿真

Arduino UNO + DS1302利用31字节静态RAM存储数据并串口打印

基于DS1302与AT89C51的实时日历时钟的LCD显示程序你还有么?还有图的