/*
* DS1302.h
*
* Created on: 2013-11-27
* Author: Allen
*/ #ifndef DS1302_H_
#define DS1302_H_ #include <MSP430G2553.h>
#include "MyType.h" //时间结构体
typedef struct
{
uchar year; //00-99,前面自己加入20,比如读出13为2013
uchar month;
uchar date;
uchar hour;
uchar min;
uchar sec;
uchar week;
}_calendar_obj; extern _calendar_obj calendar; //日历结构体 #define delay_time 0
//DS1302地址定义
#define ds1302_sec_add 0x80 //秒数据地址
#define ds1302_min_add 0x82 //分数据地址
#define ds1302_hr_add 0x84 //时数据地址
#define ds1302_date_add 0x86 //日数据地址
#define ds1302_month_add 0x88 //月数据地址
#define ds1302_day_add 0x8a //星期数据地址
#define ds1302_year_add 0x8c //年数据地址
#define ds1302_control_add 0x8e //控制数据地址
#define ds1302_charger_add 0x90
#define ds1302_clkburst_add 0xbe //SCLK:P2.3
#define SCLK_DIR (P2DIR)
#define SCLK_OUT (P2OUT)
#define SCLK_REN (P2REN)
#define SCLK_PIN (BIT3) #define SCLK_UP (Set_Bit(SCLK_REN,SCLK_PIN))
#define SCLK_DirOut (Set_Bit(SCLK_DIR,SCLK_PIN))
#define SCLK_H (Set_Bit(SCLK_OUT,SCLK_PIN))
#define SCLK_L (Clr_Bit(SCLK_OUT,SCLK_PIN)) //DS_SDA:P2.4
#define IO_DIR (P2DIR)
#define IO_OUT (P2OUT)
#define IO_IN (P2IN)
#define IO_REN (P2REN)
#define IO_PIN (BIT4) #define IO_UP (Set_Bit(IO_REN,IO_PIN))
#define IO_DirOut (Set_Bit(IO_DIR,IO_PIN))
#define IO_H (Set_Bit(IO_OUT,IO_PIN))
#define IO_L (Clr_Bit(IO_OUT,IO_PIN)) #define IO_DirIn (Clr_Bit(IO_DIR,IO_PIN))
#define IO_Data (Get_Bit(IO_IN,IO_PIN)) //RST:P2.5
#define RST_DIR (P2DIR)
#define RST_OUT (P2OUT)
#define RST_IN (P2IN)
#define RST_REN (P2REN)
#define RST_PIN (BIT5) #define RST_UP (Set_Bit(RST_REN,RST_PIN))
#define RST_DirOut (Set_Bit(RST_DIR,RST_PIN))
#define RST_H (Set_Bit(RST_OUT,RST_PIN))
#define RST_L (Clr_Bit(RST_OUT,RST_PIN)) void DS1302_Init(void);
static void delay_us( unsigned int k );
void ds1302_write_byte(uchar addr, uchar data);
uchar ds1302_read_byte(uchar addr);
void ds1302_write_time(uchar year,uchar month,uchar day,uchar hour,uchar min,uchar sec,uchar week);
void ds1302_read_time(void);
void ds1302_sendtime_uart(void); #endif

DS1302.h

 /*
* DS1302.c
*
* Created on: 2013-11-29
* Author: Allen
*/ #include "DS1302.h"
#include <MSP430G2553.h>
#include "uart.h" _calendar_obj calendar; void DS1302_Init(void)
{
SCLK_DirOut;
RST_DirOut;
IO_DirOut;
SCLK_L;
RST_L;
delay_us();
SCLK_H;
} static void delay_us( unsigned int k )
{
while(k--)
_nop(); } //向DS1302写入一字节数据
void ds1302_write_byte(uchar addr, uchar data)
{
uchar i;
IO_DirOut;
RST_H; //启动DS1302总线
//写入目标地址:addr
addr = addr & 0xFE; //最低位置零,寄存器0位为0时写,为1时读
for (i = ; i < ; i ++) {
if (addr & 0x01) {
IO_H;
}
else {
IO_L;
}
SCLK_H; //产生时钟
delay_us(delay_time);
SCLK_L;
delay_us(delay_time);
addr = addr >> ;
}
//写入数据:d
for (i = ; i < ; i ++) {
if (data & 0x01) {
IO_H;
}
else {
IO_L;
}
SCLK_H; //产生时钟
delay_us(delay_time);
SCLK_L;
delay_us(delay_time);
data = data >> ;
}
RST_L; //停止DS1302总线
} //从DS1302读出一字节数据
uchar ds1302_read_byte(uchar addr)
{ uchar i,temp;
RST_H; //启动DS1302总线
//写入目标地址:addr
addr = addr | 0x01; //最低位置高,寄存器0位为0时写,为1时读
IO_DirOut;
for (i = ; i < ; i ++)
{
if (addr & 0x01)
{
IO_H;
}
else
{
IO_L;
}
SCLK_H; //产生时钟
delay_us(delay_time);
SCLK_L;
delay_us(delay_time);
addr = addr >> ;
}
//输出数据:temp
IO_DirIn;
for (i = ; i < ; i ++)
{
temp = temp >> ;
if (IO_Data)
// if( P2IN & BIT4)
{
temp |= 0x80;
}
else
{
temp &= 0x7F;
}
SCLK_H; //产生时钟
delay_us(delay_time);
SCLK_L;
delay_us(delay_time);
}
RST_L; //停止DS1302总线
return temp;
} //向DS302写入时钟数据
void ds1302_write_time(uchar year,uchar month,uchar day,uchar hour,uchar min,uchar sec,uchar week)
{
uchar temp=;
ds1302_write_byte(ds1302_control_add,0x00); //关闭写保护
ds1302_write_byte(ds1302_sec_add,0x80); //暂停时钟
//ds1302_write_byte(ds1302_charger_add,0xa9); //涓流充电 temp=(year/<<)|(year%&0x0F);
ds1302_write_byte(ds1302_year_add,); //年 temp=(month/<<)|(month%&0x0F);
ds1302_write_byte(ds1302_month_add,temp); //月 temp=(day/<<)|(day%&0x0F);
ds1302_write_byte(ds1302_date_add,temp); //日 temp=((hour/<<)|(hour%&0x0F))&0x3F;
ds1302_write_byte(ds1302_hr_add,temp); //时 temp=(min/<<)|(min%&0x0F);
ds1302_write_byte(ds1302_min_add,temp); //分 temp=(sec/<<)|(sec%&0x0F);
temp=temp&0x7f;
ds1302_write_byte(ds1302_sec_add,temp); //秒 temp=week;
ds1302_write_byte(ds1302_day_add,temp); //周 ds1302_write_byte(ds1302_control_add,0x80); //打开写保护
} //从DS302读出时钟数据
void ds1302_read_time(void)
{
uchar temp=; temp=ds1302_read_byte(ds1302_year_add);//年
calendar.year=(temp>>)*+temp&0x0F; //年 temp=ds1302_read_byte(ds1302_month_add);//月
calendar.month=(temp>>)*+temp&0x0F; //月 temp=ds1302_read_byte(ds1302_date_add);//日
calendar.date=((temp&0x70)>>)* + (temp&0x0F); //日 temp=ds1302_read_byte(ds1302_hr_add);//时
calendar.hour=((temp&0x70)>>)* + (temp&0x0F); temp=ds1302_read_byte(ds1302_min_add); //分
calendar.min=((temp&0x70)>>)* + (temp&0x0F); //分 temp=(ds1302_read_byte(ds1302_sec_add))&0x7f;//秒,屏蔽秒的第7位,避免超出59,此位控制时钟是否开启
calendar.sec=((temp&0x70)>>)* + (temp&0x0F);//秒,屏蔽秒的第7位,避免超出59 temp=ds1302_read_byte(ds1302_day_add); //周
calendar.week=(temp>>)*+temp&0x0F; //周
} void ds1302_sendtime_uart(void)
{ uart_send_ch(calendar.year/+'');
uart_send_ch(calendar.year%+'');
uart_send_ch('-');
uart_send_ch(calendar.month/+'');
uart_send_ch(calendar.month%+'');
uart_send_ch('-');
uart_send_ch(calendar.date/+'');
uart_send_ch(calendar.date%+'');
uart_send_ch(' '); uart_send_ch(calendar.hour/+'');
uart_send_ch(calendar.hour%+'');
uart_send_ch(':');
uart_send_ch(calendar.min/+'');
uart_send_ch(calendar.min%+'');
uart_send_ch(':');
uart_send_ch(calendar.sec/+'');
uart_send_ch(calendar.sec%+''); uart_send_ch(' ');
uart_send_ch(calendar.week/+'');
uart_send_ch(calendar.week%+''); uart_send_ch('\n');
}

DS1302.c

运行很简单:

main:

DS1302_Init();
    ds1302_write_time(13,12,1,20,33,23,7);
    ds1302_read_time();
    ds1302_sendtime_uart();

注意:年份不需要20,只写后面两位,范围00-99,所以年份范围是2000-2099

如果需要读出时间:

ds1302_read_time();
    ds1302_sendtime_uart();

还是很好操作的,两个电源pin角,电池以及外接直流。

至于寄存器,时钟,细看SPEC吧

这里采取24小时制式。

MSP430:实时时钟-DS1302的更多相关文章

  1. 【蓝桥杯单片机12】实时时钟DS1302的基本操作

    [蓝桥杯单片机12]实时时钟DS1302的基本操作 广东职业技术学院 欧浩源 实时时钟DS1302几乎是蓝桥杯“单片机设计与开发”每年必考的内容,虽然在竞赛现场有提供一个底层读写寄存器的库文件,但是作 ...

  2. 轻松吃透实时时钟芯片DS1302软硬件设计,看完秒懂

    今天我们来讨论一款老掉牙的实时时钟芯片DS1302.什么是实时时钟(RealTime Clock, RTC)呢?为什么我们需要它呢?假设你使用单片机实现万年历应用,一般的做法是这样的:设置中断后判断1 ...

  3. STC8H开发(十四): I2C驱动RX8025T高精度实时时钟芯片

    目录 STC8H开发(一): 在Keil5中配置和使用FwLib_STC8封装库(图文详解) STC8H开发(二): 在Linux VSCode中配置和使用FwLib_STC8封装库(图文详解) ST ...

  4. ASM:《X86汇编语言-从实模式到保护模式》第9章:实模式下中断机制和实时时钟

    中断是处理器一个非常重要的工作机制.第9章是讲中断在实模式下如何工作,第17章是讲中断在保护模式下如何工作. ★PART1:外部硬件中断 外部硬件中断是通过两个信号线引入处理器内部的,这两条线分别叫N ...

  5. RTC实时时钟

    作者:宋老师,华清远见嵌入式学院讲师. 1.1 RTC介绍 在 一个嵌入式系统中,通常采用RTC 来提供可靠的系统时间,包括时分秒和年月日等,而且要求在系统处于关机状态下它也能够正常工作(通常采用后备 ...

  6. stm32——RTC实时时钟

    stm32——RTC实时时钟 一.关于时间 2038年问题 在计算机应用上,2038年问题可能会导致某些软件在2038年无法正常工作.所有使用UNIX时间表示时间的程序都将将受其影响,因为它们以自19 ...

  7. I2C实时时钟rx-8025板卡实际应用

    rx-8025是片外I2C实时时钟,其应用于9260板卡方法如下.总体思想是配置内核添加驱动(I2C驱动,内核已提供的很完备),板级文件添加设备,添加设备文件以应用程序操作. 1. 配置内核 1)I2 ...

  8. STM32F0xx_RTC实时时钟配置详细过程

    Ⅰ.概述 今天总结RTC(Real Time Clock)实时时钟相关的知识,顺带将BKP简单总结一下. STM32的RTC模块和时钟配置系统(RCC_BDCR寄存器)处于后备区域,即在系统复位或从待 ...

  9. linux 实时时钟(RTC)驱动【转】

    转自:http://blog.csdn.net/yaozhenguo2006/article/details/6820218 这个是linux内核文档关于rtc实时时钟部分的说明,此文档主要描述了rt ...

随机推荐

  1. 关于必须添加对程序集“System.Runtime, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a”的引用异常问题

    问题描述: 下午调试代码的时候突然发现页面突然异常了,原本以为是代码哪里写错了,后来通过定位发现MVC,UI界面的Linq异常,即关于必须添加对程序集“System.Runtime, Version= ...

  2. 拥抱变革(More Fearless Change)

    今天从大敏捷群中了解到Tid2017的一个讲演,一位敏捷教练,组织变革的专著的作者Linda的讲演. <More Fearless Change-Strategy for Making Your ...

  3. 关于自定义checkbox-radio标签的样式的方法(label 和 background-position理解)

    label label标签有一个很好的作用就是扩大表单控件元素的点击区域. 一般有两种方法可以达到效果:(1)使用label标签包裹表单控件(2)设置label标签的for属性和表单的id属性一致 这 ...

  4. 九度oj 题目1077:最大序列和

    题目1077:最大序列和 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:6435 解决:1931 题目描述: 给出一个整数序列S,其中有N个数,定义其中一个非空连续子序列T中所有数的和为T ...

  5. 2018/3/14 Hadoop学习笔记(一)

    首先,什么是Hadoop?为什么它是现在大数据处理最热门的框架呢?(正确来说,现在Hadoop是一个生态圈) Hadoop是apache下一套开源的服务框架,它主要的作用就是利用服务器集群,来对海量数 ...

  6. 整体二分初识--POJ2104:K-th Number

    n<=100000个数有m<=5000个询问,每次问区间第k大. 方法一:主席树!…… 方法二:整体二分. 整体二分一次性计算半个值域对一个区间的询问的贡献,然后根据“这半边的贡献在某个询 ...

  7. World is Exploding 树状数组+离散化

    Given a sequence A with length n,count how many quadruple (a,b,c,d) satisfies: a≠b≠c≠d,1≤a<b≤n,1≤ ...

  8. SHARP AR-2048D/2348D

    http://www.sharp.cn/printer/AR-2048D%7C2348D/support/download.html

  9. Oracle表空间 ORA-01653:

    --1.查看表空间USERS使用情况SELECT T.TABLESPACE_NAME,D.FILE_NAME, D.AUTOEXTENSIBLE,D.BYTES,D.MAXBYTES,D.STATUS ...

  10. 【Nginx】负载均衡-IP哈希策略剖析

    转自:江南烟雨 IP哈希初始化 IP哈希的初始化函数ngx_http_upstream_init_ip_hash(ngx_http_upstream_ip_hash_module.c): static ...