MSP430和实时时钟HT1381的接口程序

发布者:大橙子5511最新更新时间:2016-08-16 来源: eefocus关键字:MSP430  实时时钟  HT1381 手机看文章 扫描二维码
随时随地手机看文章
HT1381是台湾HT公司的一款串行实时时钟IC,工作电压: 2.0V~5.5V,最大输入串行时钟500kHz ( VDD=2V),2MHz(VDD=5V) ;工作电流:2V时小于300nA,5V时小于1mA。串行I/O 传送,二种数据传送方式:单字节或多字节(Burst方式),所有寄存器以BCD码格式存储 
具有接口简单、功耗低、工作电压范围宽、计时精确、功能全、成本低等优点,
因此在实际应用中被广泛采用。 
该芯片提供秒、分、时、日、日期、月和年的信息。
对于小于31天的月的月末日期能自动进行调整,还包括闰年校正功能。低功耗设计且时钟的运行可以采用24小时格式或带AM/PM指示的12小时的格式。

以下是接口程序,430测试频率为4M.
#define NOP _NOP();_NOP()

#define     NowSec     cNowTime[0]                  
#define     NowMin     cNowTime[1]
#define     NowHour    cNowTime[2]
#define     NowDate    cNowTime[3]
#define     NowMonth   cNowTime[4]
#define     NowYear    cNowTime[5]

#define     SetSec     cSetTime[0]                  
#define     SetMin     cSetTime[1]
#define     SetHour    cSetTime[2]
#define     SetDate    cSetTime[3]
#define     SetMonth   cSetTime[4]
#define     SetYear    cSetTime[5]

uchar Temp_Count;
uchar cSetTime[6];      
uchar cNowTime[6];

void  Timer_Out_Byte(uchar OutByte);
uchar Timer_In_Byte(void);

void ReadRealtime(void)
{
        NOP;
        HT1381_OUTPORT &=~Timer_SCL;          //Timer_SCL=0;
        NOP;
        HT1381_OUTPORT |= Timer_Rest;          //Timer_Rest=1;

        Timer_Out_Byte(0xBF);                             //Read, Burst Mode

        for(TimeCount=0;TimeCount<6;TimeCount++)
                {
                  if  (TimeCount==5)
                   Timer_In_Byte();                //dummy read.
                  cNowTime[TimeCount]=Timer_In_Byte();
                 //change BCD to uchar
                 cNowTime[TimeCount]=(cNowTime[TimeCount]/0x10)*10+(cNowTime[TimeCount]%0x10);
                }
        NOP;
        HT1381_OUTPORT &=~Timer_Rest;   //Timer_Rest=0;
}

void WriteRealtime(void)
{
        NOP;
        HT1381_OUTPORT &=~Timer_Rest;        //Timer_Rest=0; //for sure to close rest.
        NOP;
        HT1381_OUTPORT &=~Timer_SCL;          //Timer_SCL=0;
        NOP;
        HT1381_OUTPORT |= Timer_Rest;          //Timer_Rest=1;
        Timer_Out_Byte(0x8E);                             //Write,Single Mode
        Timer_Out_Byte(0x00);                             //Write, Protect Byte=0, Disable protect
        NOP;
        HT1381_OUTPORT &=~Timer_Rest;   //Timer_Rest=0;

        
        NOP;
        HT1381_OUTPORT |= Timer_Rest;          //Timer_Rest=1;
        Timer_Out_Byte(0x80);                             //Write,Single Mode
        Timer_Out_Byte(0x00);                             //Write, OSC enalbe, old second distroied
        NOP;
        HT1381_OUTPORT &=~Timer_Rest;   //Timer_Rest=0;

        for(TimeCount=0;TimeCount<6;TimeCount++)
  {
            //change uchar to BCD
            cSetTime[TimeCount]=(cSetTime[TimeCount]/10)*0x10+(cSetTime[TimeCount]%10);
  }

        NOP;
        HT1381_OUTPORT |= Timer_Rest;                                                                                  //Timer_Rest=1;
        Timer_Out_Byte(0XBE);                             //Write,Burst Mode
        Timer_Out_Byte(SetSec & 0x7F);                    //OSC enable for sure.                        
        Timer_Out_Byte(SetMin);
        Timer_Out_Byte(SetHour & 0x7F);                   //24 Hour Mode 
        Timer_Out_Byte(SetDate);
        Timer_Out_Byte(SetMonth);
        Timer_Out_Byte(0x00);
        Timer_Out_Byte(SetYear);
        Timer_Out_Byte(0x00);
        NOP;
        HT1381_OUTPORT &=~Timer_Rest;   //Timer_Rest=0;

        NOP;
        HT1381_OUTPORT |= Timer_Rest;          //Timer_Rest=1;
        Timer_Out_Byte(0x8E);                             //Write,Single Mode
        Timer_Out_Byte(0x80);                             //Write, Protect Byte=0, enable protect
        NOP;
        HT1381_OUTPORT &=~Timer_Rest;   //Timer_Rest=0;

}


void Timer_Out_Byte(uchar OutByte)
{
        uchar Timer_Count;
        for (Timer_Count=0;Timer_Count<8;Timer_Count++)
                {
                   HT1381_DIRPORT |= Timer_SDA;                                //output
                   if ((OutByte & 0x01) == 0)
                           HT1381_OUTPORT &=~Timer_SDA;        
                             else
                                      HT1381_OUTPORT |= Timer_SDA;                
                   NOP;
                             HT1381_OUTPORT |= Timer_SCL;                
                                NOP;
                             HT1381_OUTPORT &=~Timer_SCL;          //Timer_SCL=0;
                             OutByte = OutByte >> 1;
        }
}


uchar Timer_In_Byte(void)
{
        uchar InByte,Timer_Count;

        InByte=0x00;
        HT1381_DIRPORT &=~Timer_SDA;                        //Timer_SDA=1;//input

        for (Timer_Count=0;Timer_Count<8;Timer_Count++)
                {
                  InByte >>= 1;
                          NOP;
                     HT1381_OUTPORT |= Timer_SCL;                
                    if(HT1381_INPORT&Timer_SDA)
                   InByte |= 0x80;
                    else
                   InByte &= 0x7F;
     
                         NOP;
                    HT1381_OUTPORT &=~Timer_SCL;          //Timer_SCL=0;
        }

        return(InByte); 
}
#define NOP _NOP();_NOP()

#define     NowSec     cNowTime[0]                  
#define     NowMin     cNowTime[1]
#define     NowHour    cNowTime[2]
#define     NowDate    cNowTime[3]
#define     NowMonth   cNowTime[4]
#define     NowYear    cNowTime[5]

#define     SetSec     cSetTime[0]                  
#define     SetMin     cSetTime[1]
#define     SetHour    cSetTime[2]
#define     SetDate    cSetTime[3]
#define     SetMonth   cSetTime[4]
#define     SetYear    cSetTime[5]

uchar Temp_Count;
uchar cSetTime[6];      
uchar cNowTime[6];

void  Timer_Out_Byte(uchar OutByte);
uchar Timer_In_Byte(void);

void ReadRealtime(void)
{
        NOP;
        HT1381_OUTPORT &=~Timer_SCL;          //Timer_SCL=0;
        NOP;
        HT1381_OUTPORT |= Timer_Rest;          //Timer_Rest=1;

        Timer_Out_Byte(0xBF);                             //Read, Burst Mode

        for(TimeCount=0;TimeCount<6;TimeCount++)
                {
                  if  (TimeCount==5)
                   Timer_In_Byte();                //dummy read.
                  cNowTime[TimeCount]=Timer_In_Byte();
                 //change BCD to uchar
                 cNowTime[TimeCount]=(cNowTime[TimeCount]/0x10)*10+(cNowTime[TimeCount]%0x10);
                }
        NOP;
        HT1381_OUTPORT &=~Timer_Rest;   //Timer_Rest=0;
}

void WriteRealtime(void)
{
        NOP;
        HT1381_OUTPORT &=~Timer_Rest;        //Timer_Rest=0; //for sure to close rest.
        NOP;
        HT1381_OUTPORT &=~Timer_SCL;          //Timer_SCL=0;
        NOP;
        HT1381_OUTPORT |= Timer_Rest;          //Timer_Rest=1;
        Timer_Out_Byte(0x8E);                             //Write,Single Mode
        Timer_Out_Byte(0x00);                             //Write, Protect Byte=0, Disable protect
        NOP;
        HT1381_OUTPORT &=~Timer_Rest;   //Timer_Rest=0;

        
        NOP;
        HT1381_OUTPORT |= Timer_Rest;          //Timer_Rest=1;
        Timer_Out_Byte(0x80);                             //Write,Single Mode
        Timer_Out_Byte(0x00);                             //Write, OSC enalbe, old second distroied
        NOP;
        HT1381_OUTPORT &=~Timer_Rest;   //Timer_Rest=0;

        for(TimeCount=0;TimeCount<6;TimeCount++)
  {
            //change uchar to BCD
            cSetTime[TimeCount]=(cSetTime[TimeCount]/10)*0x10+(cSetTime[TimeCount]%10);
  }

        NOP;
        HT1381_OUTPORT |= Timer_Rest;                                                                                  //Timer_Rest=1;
        Timer_Out_Byte(0XBE);                             //Write,Burst Mode
        Timer_Out_Byte(SetSec & 0x7F);                    //OSC enable for sure.                        
        Timer_Out_Byte(SetMin);
        Timer_Out_Byte(SetHour & 0x7F);                   //24 Hour Mode 
        Timer_Out_Byte(SetDate);
        Timer_Out_Byte(SetMonth);
        Timer_Out_Byte(0x00);
        Timer_Out_Byte(SetYear);
        Timer_Out_Byte(0x00);
        NOP;
        HT1381_OUTPORT &=~Timer_Rest;   //Timer_Rest=0;

        NOP;
        HT1381_OUTPORT |= Timer_Rest;          //Timer_Rest=1;
        Timer_Out_Byte(0x8E);                             //Write,Single Mode
        Timer_Out_Byte(0x80);                             //Write, Protect Byte=0, enable protect
        NOP;
        HT1381_OUTPORT &=~Timer_Rest;   //Timer_Rest=0;

}


void Timer_Out_Byte(uchar OutByte)
{
        uchar Timer_Count;
        for (Timer_Count=0;Timer_Count<8;Timer_Count++)
                {
                   HT1381_DIRPORT |= Timer_SDA;                                //output
                   if ((OutByte & 0x01) == 0)
                           HT1381_OUTPORT &=~Timer_SDA;        
                             else
                                      HT1381_OUTPORT |= Timer_SDA;                
                   NOP;
                             HT1381_OUTPORT |= Timer_SCL;                
                                NOP;
                             HT1381_OUTPORT &=~Timer_SCL;          //Timer_SCL=0;
                             OutByte = OutByte >> 1;
        }
}


uchar Timer_In_Byte(void)
{
        uchar InByte,Timer_Count;

        InByte=0x00;
        HT1381_DIRPORT &=~Timer_SDA;                        //Timer_SDA=1;//input

        for (Timer_Count=0;Timer_Count<8;Timer_Count++)
                {
                  InByte >>= 1;
                          NOP;
                     HT1381_OUTPORT |= Timer_SCL;                
                    if(HT1381_INPORT&Timer_SDA)
                   InByte |= 0x80;
                    else
                   InByte &= 0x7F;
     
                         NOP;
                    HT1381_OUTPORT &=~Timer_SCL;          //Timer_SCL=0;
        }

        return(InByte); 
}
关键字:MSP430  实时时钟  HT1381 引用地址:MSP430和实时时钟HT1381的接口程序

上一篇:MSP430 Flash编程程序
下一篇:MSP430与ATMEL 93C46通讯子程序

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

MSP430通过RC522实现门禁卡功能(RFID)
//实现门禁卡功能 //刷卡实现LCD灯亮 + 12864LCD屏幕显示相应内容 屏幕效果如下: //===========================================================================// /******************************************************************** //MSP430F149单片机 + RC522 +M1 //实现门禁卡功能 //刷卡实现LCD灯亮 + 12864LCD屏幕显示相应内容 //调试环境:IAR + MSP430F149 +RC522 ***************
[单片机]
<font color='red'>MSP430</font>通过RC522实现门禁卡功能(RFID)
基于MSP430FW427的无磁水表设计方案精编
  1 MSP430FW42x单片机介绍   MSP430FW42x系列单片机是TI公司针对电子式流量与旋转运动检测最新开发的专用MCU芯片,它将超低功耗MCU、旋转扫描接口(SCAN IF)和液晶显示LCD驱动模块完美地结合在一起。该器件的超低功耗结构和流量检测模块不仅延长了电池的寿命,同时还提高了仪表的精度与性能。MSP430FW42x的典型应用包括热量仪表、热水和冷水仪表、气体仪表和工业流量计、风力计以及其他旋转检测应用。   2 流量测量的原理   2.1 基本原理   一个由叶轮或螺旋齿轮构成的机械装置把流体流动转换为转动,这种转换能够实现对流体流量的测量。   把一个谐振回路中的电感置于叶轮的上方可
[单片机]
基于uC/OS与MSP430的手持数据采集系统
摘要:本文介绍了使用TI公司的超低功耗MSP430单片机与uC/OS相结合设计数据采集系统的方法,采用了uC/OS的多任务的软件设计方式代替了传统的前后台式的嵌入式软件设计方法,使得软件系统模块化,并且克服了前后台式软件设计的弊端,增前了系统的实时性。 1前言 近年来随着IC设备功耗和体积的不断减小,手持设备的应用领域变的越来越广泛。但是另一方面,传统的前后台式的软件设计方法却限制了硬件系统功能的充分发挥,影响了系统的实时性与稳定性。本文介绍了一种基于嵌入式操作系统uC/OS上设计系统软件的方法,即克服了原有前后台式软件设计的一些弊端,又充分发挥了硬件特性,增强了系统稳定性,很好的解决了手持数据采集设备多任务软件系统实时性不强
[单片机]
基于uC/OS与<font color='red'>MSP430</font>的手持数据采集系统
stm32 rtc 实时时钟
STM32的实时时钟是一个独立的定时器 通常会在后备区域供电端加一个纽扣电池,当主电源没有电的时,RTC不会停止工作 若VDD电源有效,RTC可以触发秒中断、溢出中断和闹钟中断 备份寄存器BKP 备份寄存器是42个16位的寄存器,他们处在备份域里,当VDD电源被切断,他们仍然由VBAT维持供电。当系统在待机模式下被唤醒或系统复位或电源复位时,他们也不会被复位 RTC配置步骤 1.使能电源时钟和后备区域时钟 2.取消后备区域的写保护,DBP 3.复位备份区域 4.外部低速振荡器使能,LSE 5.RTC时钟源选择,LSE 6.RTC时钟使能 7.进入配置模式 8.设置RTC预分频装载值 9.设置R
[单片机]
stm32 rtc <font color='red'>实时时钟</font>
msp430f449的RS232接口程序
#include MSP430x44x.h void init_UART(void); void uart_start(void); void uart_send(void); void uart_receive(void); unsigned char RXDATA_BUF ,TXDATA_BUF ={0xbd,0x77,0x3d,0xc5,0xc6,0xf5,0x68,0x0d,0x6b,0xff}; unsigned int RX_count=0,TX_count=0,TXBUF_num=10,RXBUT_num=10,FLAG; void main(void) { init_uart(); uart_sta
[单片机]
基于实时时钟芯片X1227的电源控制器设计
引言 X1228是美国XICOR公司最新推出的实时时钟(RTC)芯片。与其它RTC芯片相比,X1228除有基本的时钟和报警功能外,还有4K位E2PROM存储器和复位输出、电压监控、看门狗定时、频率输出等功能。 X1228可以准确地用秒、分、时、日、星期、月、年来显示时间和日期,具有世纪字节,解决了两千年问题,自动实现闰年调整;有2路报警,可设置为按秒、分、时、日、月和星期任意组合的定时报警;还有1个可编程的频率输出引脚(PHZ),用于输出一个固定频率的方波信号;内部的4K位E2PROM存储器,可用于存储用户的设置参数或其它数据,其内容在电源失效时不会丢失;采用I2C总线与单片机接口,一次可传送多个字节的数据,数据传送的速率为4
[电源管理]
MSP430控制1602液晶显示
简介:MSP430控制1602液晶显示 上面既是效果图了。。 /*////////////////////////////////////////////////////////////////////////// 文件名:液晶显示 时间:2011年8月24日 */////////////////////////////////////////////////////////////////////////// #include msp430x24x.h //加载头文件 #define E (0x0004u)//确定E的位 #define RW (0x0002u) #define RS (0x0001u) unsigne
[单片机]
<font color='red'>MSP430</font>控制1602液晶显示
MSP430精准配置高速串口波特率的方法
引言 在实际项目大批量生产调试设备时,笔者发现同样版本的程序在不同设备上运行时效果不一致,一部分设备串口通信正常,另外一部分串口通信不正常。通过示波器对多个设备的串口波特率及系统时钟频率测试,发现不同设备之间的系统时钟频率及波特率存在差异,与理论值不一致,用示波器测试出的系统时钟频率及波特率与理论值偏差较大。由于系统时钟频率的偏差导致波特率设置值超过了串口所允许的最大误差值,故而导致串口通信失败。其根本原因是系统的时钟频率会随环境温度、电压或其他因素变化。 1 原因分析 在异步通信中,波特率是很重要的指标,表示为每秒传送二进制数码的位数,反映了异步串行通信的速度。MSP430的波特率发生器使用一个分频计数器和一个调整器来构
[单片机]
<font color='red'>MSP430</font>精准配置高速串口波特率的方法
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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