/*
* 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. C#上位机开发(三)—— 构建SerialAssistant雏形

    上一篇简单介绍了C#的一些基本知识,并成功的Hello,World,那么从这篇开始,我们来自己动手写一个串口助手: 1.构思功能 串口助手在单片机开发中经常被用来调试,最基本的功能就是接收功能和发送功 ...

  2. 乱记结论之OI常用四大数列

    一.斐波那契数列 $f(0)=1,f(1)=1,f(i)=f(i-1)+f(i-2) \ \ \ \ (i>=2)$ 经典的解释是兔子生小孩,第0年一对兔子,一对兔子需要一年长大,后面每年都生小 ...

  3. 创建Django项目(三)——站点管理

    2013-08-05 21:01:34|         1.激活管理界面         (1) 修改"mysite\mysite\settings.py"文件,将'django ...

  4. JAVA调用动态链接库(dll)

        菜鸡爬坑 基础知识  因为某个东西的keygen我只会在win下生成!! 所以只能出此下策!!之前一直是android下用jni调用so文件,现在试下java在win平台下调用dll 首先还是 ...

  5. Java使用Memcached和Redis简单示例

    package xmq.study.memcached; import java.io.IOException; import java.net.InetSocketAddress; import n ...

  6. java代码判断文件类型(判断文件后缀名)

    1.两点需要注意 1.string.spilt("\\.")分割字符串成子字符串数组,以“.”分割,必须写成string.spilt("\\.")的方式,不能写 ...

  7. delphi异步选择模型编程TCP

    Server端: unit U_FrmServer; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, ...

  8. 条款八: 写operator new和operator delete时要遵循常规

    自己重写operator new时(条款10解释了为什么有时要重写它),很重要的一点是函数提供的行为要和系统缺省的operator new一致.实际做起来也就是:要有正确的返回值:可用内存不够时要调用 ...

  9. 【CV论文阅读】Image Captioning 总结

    初次接触Captioning的问题,第一印象就是Andrej Karpathy好聪明.主要从他的两篇文章开始入门,<Deep Fragment Embeddings for Bidirectio ...

  10. golang convert integer to float number

    There is no float type. Looks like you want float64. You could also use float32 if you only need a s ...