MSP430:实时时钟-DS1302
/*
* 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的更多相关文章
- 【蓝桥杯单片机12】实时时钟DS1302的基本操作
[蓝桥杯单片机12]实时时钟DS1302的基本操作 广东职业技术学院 欧浩源 实时时钟DS1302几乎是蓝桥杯“单片机设计与开发”每年必考的内容,虽然在竞赛现场有提供一个底层读写寄存器的库文件,但是作 ...
- 轻松吃透实时时钟芯片DS1302软硬件设计,看完秒懂
今天我们来讨论一款老掉牙的实时时钟芯片DS1302.什么是实时时钟(RealTime Clock, RTC)呢?为什么我们需要它呢?假设你使用单片机实现万年历应用,一般的做法是这样的:设置中断后判断1 ...
- STC8H开发(十四): I2C驱动RX8025T高精度实时时钟芯片
目录 STC8H开发(一): 在Keil5中配置和使用FwLib_STC8封装库(图文详解) STC8H开发(二): 在Linux VSCode中配置和使用FwLib_STC8封装库(图文详解) ST ...
- ASM:《X86汇编语言-从实模式到保护模式》第9章:实模式下中断机制和实时时钟
中断是处理器一个非常重要的工作机制.第9章是讲中断在实模式下如何工作,第17章是讲中断在保护模式下如何工作. ★PART1:外部硬件中断 外部硬件中断是通过两个信号线引入处理器内部的,这两条线分别叫N ...
- RTC实时时钟
作者:宋老师,华清远见嵌入式学院讲师. 1.1 RTC介绍 在 一个嵌入式系统中,通常采用RTC 来提供可靠的系统时间,包括时分秒和年月日等,而且要求在系统处于关机状态下它也能够正常工作(通常采用后备 ...
- stm32——RTC实时时钟
stm32——RTC实时时钟 一.关于时间 2038年问题 在计算机应用上,2038年问题可能会导致某些软件在2038年无法正常工作.所有使用UNIX时间表示时间的程序都将将受其影响,因为它们以自19 ...
- I2C实时时钟rx-8025板卡实际应用
rx-8025是片外I2C实时时钟,其应用于9260板卡方法如下.总体思想是配置内核添加驱动(I2C驱动,内核已提供的很完备),板级文件添加设备,添加设备文件以应用程序操作. 1. 配置内核 1)I2 ...
- STM32F0xx_RTC实时时钟配置详细过程
Ⅰ.概述 今天总结RTC(Real Time Clock)实时时钟相关的知识,顺带将BKP简单总结一下. STM32的RTC模块和时钟配置系统(RCC_BDCR寄存器)处于后备区域,即在系统复位或从待 ...
- linux 实时时钟(RTC)驱动【转】
转自:http://blog.csdn.net/yaozhenguo2006/article/details/6820218 这个是linux内核文档关于rtc实时时钟部分的说明,此文档主要描述了rt ...
随机推荐
- 79-Envelopes,包络指标.(2015.7.1)
Envelopes 包络指标 观井映天 2015.7.1
- [bzoj3668][Noi2014][起床困难综合症] (按位贪心)
Description 21 世纪,许多人得了一种奇怪的病:起床困难综合症,其临床表现为:起床难,起床后精神不佳.作为一名青春阳光好少年,atm 一直坚持与起床困难综合症作斗争.通过研究相关文献,他找 ...
- jQuery调用WCF 说明
在项目中用过一些WCF的技术这篇文章是对以前用过的一点东西的一个梳理 一,webconfig的配置除了一般的配置外,与WCF相关的配置如下 <system.serviceModel> ...
- python之字典 2014-4-5
#字典:当索引不好用时1.字典 类似于php的关联数组 列表类似于索引数组 2.创建字典 phonebook={'alice':'2100','tom':'1900'} 键值之间用: 项之间用, 空字 ...
- java的动态代理机制详解-----https://www.cnblogs.com/xiaoluo501395377/p/3383130.html
java的动态代理机制详解-----https://www.cnblogs.com/xiaoluo501395377/p/3383130.html
- JavaEE JDBC 事务
JDBC 事务 @author ixenos 事务 1.概念:我们将一组语句构建成一个事务(trans action),当所有语句顺利执行之后,事务可以被提交(commit):否则,如果其中某个语句遇 ...
- 全文搜索(A-2)-推荐算法
一般来说推荐算法分为两类. 基于内容过滤的推荐: 基于协同过滤的推荐: 基于内容过滤的推荐,基于特征码描述项目. 协同过滤算法的设计基于一个假设,“和目标用户相似度高的用户,其感兴趣的物品目标用户也会 ...
- 【计算几何+极角排序+爆ll】E. Convex
https://www.bnuoj.com/v3/contest_show.php?cid=9147#problem/E [题意] 给定n个点的坐标,可以选择其中的四个点构造凸四边形,问最多能构造多少 ...
- Xterm256终端颜色的名称
hi x016_Grey0 ctermfg=16 guifg=#000000 "rgb=0,0,0 hi x017_NavyBlue ctermfg=17 guifg=#00005f &qu ...
- codevs——1017 乘积最大
1017 乘积最大 2000年NOIP全国联赛普及组NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 题目描述 Desc ...