/*
* 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. LeetCode(48)Rotate Image

    题目 You are given an n x n 2D matrix representing an image. Rotate the image by 90 degrees (clockwise ...

  2. 远程调试nodejs

    一   windows作为远程服务器 1.在远程服务器(192.168.1.1)上安装node-inspector:npm install -g node-inspector // -g 导入安装路径 ...

  3. 使用HTML,CSS快速导出数据到Excel

    在应用中经常会遇到要从系统或数据库中导出数据平面文件,一般是导出到txt,csv或excel.txt和csv一般用在系统间的数据交换, 而excel一般有较好的显示效果,可以按照一定的模板导出,导出就 ...

  4. FZU Problem 2171 防守阵地 II (线段树区间更新模板题)

    http://acm.fzu.edu.cn/problem.php?pid=2171 成段增减,区间求和.add累加更新的次数. #include <iostream> #include ...

  5. 将github上的项目源码导入eclipse详细教程

    将github上的项目源码导入eclipse详细教程 学习了: http://blog.csdn.net/itbiggod/article/details/78462720

  6. 附录A 思科互联网络操作系统(IOS)

    思科互联网络操作系统(IOS) 要点 实现IP编址方案和IP服务,以满足中型企业分支机构网络的网络需求 口在路由器上配置和验证 DHCP和DNS 以及排除其故障(包括 CLI/SDM ). 口配置和验 ...

  7. C++ RTTI介绍

    一.定义:RTTI:Run Time Type Identification ,执行时类型识别:指程序可以使用基类的指针或引用来检索其所指对象的实际派生类型. 二.使用方式:C++中有两个操作符提供R ...

  8. [Javascript] Flattening nested arrays: a little exercise in functional refactoring

    In this lesson we write an imperative function to flatten nested arrays, and then use the popular ma ...

  9. CodeForces484A Bits(贪心)

    CodeForces484A Bits(贪心) CodeForces484A 题目大意:给出范围[A.B].期望你给出某个数X满足X属于[A,B],而且X转成二进制的1的个数最多.假设有多个给出最小的 ...

  10. 优雅的在React项目中使用Redux

    概念 首先我们会用到哪些框架和工具呢? React UI框架 Redux 状态管理工具,与React没有任何关系,其他UI框架也可以使用Redux react-redux React插件,作用:方便在 ...