MSP430:实时时钟-DS1302

发布者:温暖拥抱最新更新时间:2017-11-03 来源: eefocus关键字:MSP430  实时时钟  DS1302 手机看文章 扫描二维码
随时随地手机看文章

 1 /*

 2  * DS1302.h

 3  *

 4  *  Created on: 2013-11-27

 5  *      Author: Allen

 6  */

 7 

 8 #ifndef DS1302_H_

 9 #define DS1302_H_

10 

11 #include    

12 #include    "MyType.h"

13 

14 //时间结构体

15 typedef struct

16 {

17     uchar year;    //00-99,前面自己加入20,比如读出13为2013

18     uchar month;

19     uchar date;

20     uchar hour;

21     uchar min;

22     uchar sec;

23     uchar week;

24 }_calendar_obj;

25 

26 extern _calendar_obj calendar;    //日历结构体

27 

28 #define delay_time              0

29 //DS1302地址定义

30 #define ds1302_sec_add            0x80        //秒数据地址

31 #define ds1302_min_add            0x82        //分数据地址

32 #define ds1302_hr_add            0x84        //时数据地址

33 #define ds1302_date_add            0x86        //日数据地址

34 #define ds1302_month_add        0x88        //月数据地址

35 #define ds1302_day_add            0x8a        //星期数据地址

36 #define ds1302_year_add            0x8c        //年数据地址

37 #define ds1302_control_add        0x8e        //控制数据地址

38 #define ds1302_charger_add        0x90

39 #define ds1302_clkburst_add        0xbe

40 

41 //SCLK:P2.3

42 #define        SCLK_DIR        (P2DIR)

43 #define        SCLK_OUT        (P2OUT)

44 #define        SCLK_REN        (P2REN)

45 #define        SCLK_PIN        (BIT3)

46 

47 #define        SCLK_UP            (Set_Bit(SCLK_REN,SCLK_PIN))

48 #define        SCLK_DirOut        (Set_Bit(SCLK_DIR,SCLK_PIN))

49 #define        SCLK_H            (Set_Bit(SCLK_OUT,SCLK_PIN))

50 #define        SCLK_L            (Clr_Bit(SCLK_OUT,SCLK_PIN))

51 

52 

53 //DS_SDA:P2.4

54 #define        IO_DIR            (P2DIR)

55 #define        IO_OUT            (P2OUT)

56 #define        IO_IN            (P2IN)

57 #define        IO_REN            (P2REN)

58 #define        IO_PIN            (BIT4)

59 

60 #define        IO_UP            (Set_Bit(IO_REN,IO_PIN))

61 #define        IO_DirOut        (Set_Bit(IO_DIR,IO_PIN))

62 #define        IO_H            (Set_Bit(IO_OUT,IO_PIN))

63 #define        IO_L            (Clr_Bit(IO_OUT,IO_PIN))

64 

65 

66 #define        IO_DirIn        (Clr_Bit(IO_DIR,IO_PIN))

67 #define        IO_Data            (Get_Bit(IO_IN,IO_PIN))

68 

69 //RST:P2.5

70 #define        RST_DIR            (P2DIR)

71 #define        RST_OUT            (P2OUT)

72 #define        RST_IN            (P2IN)

73 #define        RST_REN            (P2REN)

74 #define        RST_PIN            (BIT5)

75 

76 #define        RST_UP            (Set_Bit(RST_REN,RST_PIN))

77 #define        RST_DirOut        (Set_Bit(RST_DIR,RST_PIN))

78 #define        RST_H            (Set_Bit(RST_OUT,RST_PIN))

79 #define        RST_L            (Clr_Bit(RST_OUT,RST_PIN))

80 

81 

82 void DS1302_Init(void);

83 static void delay_us( unsigned int k );

84 void ds1302_write_byte(uchar addr, uchar data);

85 uchar ds1302_read_byte(uchar addr);

86 void ds1302_write_time(uchar year,uchar month,uchar day,uchar hour,uchar min,uchar sec,uchar week);

87 void ds1302_read_time(void);

88 void ds1302_sendtime_uart(void);

89 

90 #endif



  1 /*

  2  * DS1302.c

  3  *

  4  *  Created on: 2013-11-29

  5  *      Author: Allen

  6  */

  7 

  8 #include    "DS1302.h"

  9 #include    

 10 #include    "uart.h"

 11 

 12 _calendar_obj calendar;

 13 

 14 void DS1302_Init(void)

 15 {

 16     SCLK_DirOut;

 17     RST_DirOut;

 18     IO_DirOut;

 19     SCLK_L;

 20     RST_L;

 21     delay_us(10);

 22     SCLK_H;

 23 }

 24 

 25 

 26 static void delay_us( unsigned int k )

 27 {

 28     while(k--)

 29     _nop();

 30 

 31 }

 32 

 33 //向DS1302写入一字节数据

 34 void ds1302_write_byte(uchar addr, uchar data)

 35 {

 36     uchar i;

 37     IO_DirOut;

 38     RST_H;                    //启动DS1302总线

 39     //写入目标地址:addr

 40     addr = addr & 0xFE;   //最低位置零,寄存器0位为0时写,为1时读

 41     for (i = 0; i < 8; i ++) {

 42         if (addr & 0x01) {

 43             IO_H;

 44             }

 45         else {

 46             IO_L;

 47             }

 48         SCLK_H;      //产生时钟

 49         delay_us(delay_time);

 50         SCLK_L;

 51         delay_us(delay_time);

 52         addr = addr >> 1;

 53         }

 54     //写入数据:d

 55     for (i = 0; i < 8; i ++) {

 56         if (data & 0x01) {

 57             IO_H;

 58             }

 59         else {

 60             IO_L;

 61             }

 62         SCLK_H;      //产生时钟

 63         delay_us(delay_time);

 64         SCLK_L;

 65         delay_us(delay_time);

 66         data = data >> 1;

 67         }

 68     RST_L;        //停止DS1302总线

 69 }

 70 

 71 //从DS1302读出一字节数据

 72 uchar ds1302_read_byte(uchar addr)

 73 {

 74 

 75     uchar i,temp;

 76     RST_H;                    //启动DS1302总线

 77     //写入目标地址:addr

 78     addr = addr | 0x01;    //最低位置高,寄存器0位为0时写,为1时读

 79     IO_DirOut;

 80     for (i = 0; i < 8; i ++)

 81     {

 82         if (addr & 0x01)

 83         {

 84             IO_H;

 85         }

 86         else

 87         {

 88             IO_L;

 89         }

 90         SCLK_H;      //产生时钟

 91         delay_us(delay_time);

 92         SCLK_L;

 93         delay_us(delay_time);

 94         addr = addr >> 1;

 95     }

 96     //输出数据:temp

 97     IO_DirIn;

 98     for (i = 0; i < 8; i ++)

 99     {

100         temp = temp >> 1;

101         if (IO_Data)

102 //        if( P2IN & BIT4)

103         {

104             temp |= 0x80;

105         }

106         else

107         {

108             temp &= 0x7F;

109         }

110         SCLK_H;      //产生时钟

111         delay_us(delay_time);

112         SCLK_L;

113         delay_us(delay_time);

114         }

115     RST_L;                    //停止DS1302总线

116     return temp;

117 }

118 

119 //向DS302写入时钟数据

120 void ds1302_write_time(uchar year,uchar month,uchar day,uchar hour,uchar min,uchar sec,uchar week)

121 {

122     uchar temp=0;

123     ds1302_write_byte(ds1302_control_add,0x00);            //关闭写保护

124     ds1302_write_byte(ds1302_sec_add,0x80);                //暂停时钟

125     //ds1302_write_byte(ds1302_charger_add,0xa9);        //涓流充电

126 

127     temp=(year/10<<4)|(year%10&0x0F);

128     ds1302_write_byte(ds1302_year_add,119);        //年

129 

130     temp=(month/10<<4)|(month%10&0x0F);

131     ds1302_write_byte(ds1302_month_add,temp);    //月

132 

133     temp=(day/10<<4)|(day%10&0x0F);

134     ds1302_write_byte(ds1302_date_add,temp);        //日

135 

136     temp=((hour/10<<4)|(hour%10&0x0F))&0x3F;

137     ds1302_write_byte(ds1302_hr_add,temp);        //时

138 

139     temp=(min/10<<4)|(min%10&0x0F);

140     ds1302_write_byte(ds1302_min_add,temp);        //分

141 

142     temp=(sec/10<<4)|(sec%10&0x0F);

143     temp=temp&0x7f;

144     ds1302_write_byte(ds1302_sec_add,temp);        //秒

145 

146     temp=week;

147     ds1302_write_byte(ds1302_day_add,temp);        //周

148 

149     ds1302_write_byte(ds1302_control_add,0x80);            //打开写保护

150 }

151 

152 //从DS302读出时钟数据

153 void ds1302_read_time(void)

154 {

155     uchar temp=0;

156 

157     temp=ds1302_read_byte(ds1302_year_add);//年

158     calendar.year=(temp>>4)*10+temp&0x0F; //年

159 

160     temp=ds1302_read_byte(ds1302_month_add);//月

161     calendar.month=(temp>>4)*10+temp&0x0F;    //月

162 

163     temp=ds1302_read_byte(ds1302_date_add);//日

164     calendar.date=((temp&0x70)>>4)*10 + (temp&0x0F);  //日

165 

166     temp=ds1302_read_byte(ds1302_hr_add);//时

167     calendar.hour=((temp&0x70)>>4)*10 + (temp&0x0F);

168 

169     temp=ds1302_read_byte(ds1302_min_add);    //分

170     calendar.min=((temp&0x70)>>4)*10 + (temp&0x0F);    //分

171 

172     temp=(ds1302_read_byte(ds1302_sec_add))&0x7f;//秒,屏蔽秒的第7位,避免超出59,此位控制时钟是否开启

173     calendar.sec=((temp&0x70)>>4)*10 + (temp&0x0F);//秒,屏蔽秒的第7位,避免超出59

174 

175     temp=ds1302_read_byte(ds1302_day_add); //周

176     calendar.week=(temp>>4)*10+temp&0x0F; //周

177 }

178 

179 void ds1302_sendtime_uart(void)

180 {

181 

182     uart_send_ch(calendar.year/10+'0');

183     uart_send_ch(calendar.year%10+'0');

184     uart_send_ch('-');

185     uart_send_ch(calendar.month/10+'0');

186     uart_send_ch(calendar.month%10+'0');

187     uart_send_ch('-');

188     uart_send_ch(calendar.date/10+'0');

189     uart_send_ch(calendar.date%10+'0');

190     uart_send_ch(' ');

191 

192     uart_send_ch(calendar.hour/10+'0');

193     uart_send_ch(calendar.hour%10+'0');

194     uart_send_ch(':');

195     uart_send_ch(calendar.min/10+'0');

196     uart_send_ch(calendar.min%10+'0');

197     uart_send_ch(':');

198     uart_send_ch(calendar.sec/10+'0');

199     uart_send_ch(calendar.sec%10+'0');

200 

201     uart_send_ch(' ');

202     uart_send_ch(calendar.week/10+'0');

203     uart_send_ch(calendar.week%10+'0');

204 

205     uart_send_ch('\n');

206 }



运行很简单:


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 引用地址:MSP430:实时时钟-DS1302

上一篇:STM8——IAR使用STLINK V2烧写程序
下一篇:AD9850驱动程序--MSP430版本

推荐阅读最新更新时间:2024-03-16 15:42

MSP430 DCO数据丢失问题
单片机到手正常下载程序不能运行 读取flash内容 information memory内容有误,其中有个关键的时钟模块DCO的数据,他为单片机提供时钟基准,每个单片机的DCO都是单独校正的, 这是地址 这是一个正常模块的数据 在0x10FD,0x10FD是有CALBC1_8MHZ,CALDCO_8MHZ的数据的 而在我430的测试程序中有这么一段,如果CALBC1_8MHZ,CALDCO_8MHZ 的数据是FF,也就是空的话,程序会进入死循环,这是DEBUG发现的 后面做了测试,把正常板的数据直接全覆盖没有校正数据的板,多数板可以在9600波特率下通讯,(可能速度还不快可以容错),有少数板无法串口通
[单片机]
<font color='red'>MSP430</font> DCO数据丢失问题
MSP430主系统时钟以及430的低功耗设置
如何将系统时钟设置到外部高频晶体振荡器,430的MCLK默认的是DCO的,如何安全的从DCO切换到外部晶体振荡器,这是一个很重要的步骤,因为经过此步骤,可以极大地提高430的处理能力,DCO在内部,可以为cpu提供强劲稳定的时钟 #include msp430x14x.h void main( void ) { // Stop watchdog timer to prevent time out reset WDTCTL = WDTPW + WDTHOLD; volatile unsigned int i; P5DIR |=BIT4;//设置P5.4为输出 P5SEL |=BIT4;//设置片内主系统时钟的输
[单片机]
<font color='red'>MSP430</font>主系统时钟以及430的低功耗设置
MSP430FR6989系列教程之流水灯
一、MSP430FR6989的介绍 开发板的主要资源如下 高达 16MHz 的 16 位 RISC 架构 优化的超低功耗模式 高达128KB的FRAM 五个16位定时器,7个捕捉/比较 日历和闹钟功能的 RTC 16位和32位CRC校验(CRC16、CRC32) 16个外部通道的12位ADC 集成LCD 驱动器 增强型串行通信(UART、IIC、SPI) 灵活的时钟系统(DCO、VLO、LFXT、HFXT) AES安全加密、ESI等 二、使用步骤 1.开发环境配置 常用的开发环境有3种 1.CCS(Code Composer Studio) 2.IAR(IAR for MSP430) 3.Keil对MSP430
[单片机]
<font color='red'>MSP430</font>FR6989系列教程之流水灯
MSP430G2553测试程序(串口程序,定时器模式)
// // // MSP430G2xx3 // ----------------- // /|| XIN|- // | | | // --|RST XOUT|- // | | // | CCI0B/TXD/P1.1|-------- // | | 9600 8N1 // | CCI0A/RXD/P1.2| -------- // Built with IAR Embedded Workbench Version: 5.40 //串口调试助手,下载地址:http://www.sudt.com/download/AccessPort137.zip //***************************************
[单片机]
MSP430 AD模块笔记
1、关于EOS位,该位是设置位,并不是状态位,即若那个转换结果寄存器的控制寄存器的该位置1 ,则说明该转换寄存器对应的转换通道为转换序列的最后一个通道。 2、单通道单次转换模式,和单通道重复模式,EOS无效,EOS只用于序列通道转换。指示最后一个转换通道的。 3、单通道重复转换,转换的结果都存在了一个寄存器中,至于怎么重复的,就是不断的在那个通道进行转换,除非你软件停止它。 4、关于序列通道的序列定义的认识: 有两个顺序要搞清楚: a、一个是AD转换的顺序,我个人觉得是严格按照AD转换结果寄存器的的顺序进行转换的,即ADC12MEM0~ADC12MEM15。 如果你指定了其实转换寄存器的首地址地址,如ADC
[单片机]
TinyOS在MSP430F2618上移植(二)之USCI
第一篇文章《TinyOS在MSP430F2618上移植(一)》早在5月份就已写好,间隔了2个月才有时间写这篇文章,期间一直忙于SPI、UART接口的测试以及FLASH、LCD的移植。本文主要叙述MSP430F2618单片机USCI的移植。 对比MSP430F1611与MAP430F2618,可以看出两者最大的不同点在于后者提供了更丰富的外围接口,分为A,B两组,其中A组的功能有UART、IrDA ,B组提供SPI、I2C功能,另外A组也可以配合B组中提供的SCK作为SPI接口。在A,B组中又分为两个独立组,A0/1,B0/1。 2618中特殊功能寄存器也做了改动,去除了模块使能寄存器1、2(module enable re
[单片机]
基于MSP430单片机的四旋翼 PID Control种群遗传算法
PID Control种群遗传算法: #include io430x14x.h #include stdlib.h #include sys.h #include Control.h #define col_MAX 50 //群体空间大小 #define var_p 65 //变异概率:65 对应的变异概率约等于0.001,655 为0.01 rand():0-65535 #define epoch_MAX 200 //进化代数 void inherit(void) //遗传进化PID { unsigned int colony ={ 62267,15
[单片机]
MSP430单片机在电源控制中的应用
MSP430系列单片机是美国TI公司生产的新一代16位单片机,是一种超低功耗的混合信号处理器(MixedSignal Processor),它具有低电压、超低功耗、强大的处理能力、系统工作稳定、丰富的片内外设、方便开发等优点,具有很高的性价比,在工程控制等领域有着极其广泛的应用范围。开关Boost稳压电源利用开关器件控制、无源磁性元件及电容元件的能量存储特性,从输入电压源获取分离的能量,暂时把能量以磁场的形式存储在电感器中,或以电场的形式存储在电容器中,然后将能量转换到负载。对DC—DC主回路采用Boost升压斩波电路。 2 系统结构和总设计方案 本开关稳压电源是以MSP430F449为主控制器件,它是TI公司生产的1
[单片机]
<font color='red'>MSP430</font>单片机在电源控制中的应用
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved