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 ...
随机推荐
- C语言的移位操作符及位运算
C语言的移位操作符 位移位运算符是将数据看成二进制数,对其进行向左或向右移动若干位的运算.位移位运算符分为左移和右移两种,均为双目运算符.第一运算对象是移位对象,第二个运算对象是所移的二进制位数. 位 ...
- 九度oj 题目1182:统计单词
题目1182:统计单词 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:4780 解决:1764 题目描述: 编一个程序,读入用户输入的,以“.”结尾的一行文字,统计一共有多少个单词,并分别 ...
- React & search & keyboard ghost
React & search & keyboard ghost DOM events https://www.w3schools.com/jsref/dom_obj_event.asp ...
- IE & table & border & border-collapse & bug
shit IE table border bug & border-collapse bug > `border-collapse: collapse;` table { width: ...
- SQLAlchemy(2):多表操作 & 连接方式及原生SQL
一对多:ForeignKey multitb_models.py import datetime from sqlalchemy import create_engine # 引入 创建引擎 from ...
- [网络流24题] 方格取数问题(cogs 734)
«问题描述:在一个有m*n 个方格的棋盘中,每个方格中有一个正整数.现要从方格中取数,使任意2 个数所在方格没有公共边,且取出的数的总和最大.试设计一个满足要求的取数算法.«编程任务:对于给定的方格棋 ...
- How many ways?? 矩阵快速幂 邻接矩阵意义
春天到了, HDU校园里开满了花, 姹紫嫣红, 非常美丽. 葱头是个爱花的人, 看着校花校草竞相开放, 漫步校园, 心情也变得舒畅. 为了多看看这迷人的校园, 葱头决定, 每次上课都走不同的路线去教室 ...
- Layui栅格系统与后台框架布局
一.栅格布局规则: 1. 采用 layui-row 来定义行,如:<div class="layui-row"></div> 2. 采用类似 layui-c ...
- MongoDB集群搭建教程收集(待实践)
先收集,后续再实践. MongoDB的集群应该和MySQL的定位保持一致,因为要认为它就是一个数据库. 集群方式有也是有很多,比如分库,分片,主从,主主等等. 下面是收集的一些教程: http://b ...
- Django学习系列之ORM-QuerySetAPI
基本操作 # 增 models.Tb1.objects.create(c1='xx', c2='oo') #增加一条数据,可以接受字典类型数据 **kwargs obj = models.Tb1(c1 ...