zoukankan      html  css  js  c++  java
  • Arduino和C51开发DS1302时钟

    技术: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("
    ");
            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



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

  • 相关阅读:
    linux随记
    springboot-2
    netty-lean1
    nginx
    自定义启动器
    arrayList add
    Mybatis 转义符
    idea 闪退 但是启动的服务还在解决办法
    java 通过map根据list某个字段进行合并
    java list的深拷贝
  • 原文地址:https://www.cnblogs.com/demodashi/p/10503357.html
Copyright © 2011-2022 走看看