⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rtc.c

📁 msp430平台的DS1302实时时钟驱动
💻 C
字号:
////////////////////////////////////////////////////////////////
//              无线传感器网络节点程序                        //
//                实时时钟部分                                //
//                编写:蒋路茸                                //
//                日期:2008.6                                //
//                版本:0.1                                   //
////////////////////////////////////////////////////////////////
//                P56     SCLK                                //
//                P54     RST                                 //
//                P55     SDA                                 //
////////////////////////////////////////////////////////////////

#include <msp430x14x.h>
#include "rtc.h"

/*      时间格式                                           
unsigned char Setting_Time[7]=
{
  0x08,       //--------十位-------|-------个位--------|  年份(当前08年)
  0x00,       //                        |-----个位-----|  星期(当前周日)
  0x05,       //              |十位|-------个位--------|  月份(当前05月)
  0x28,       //         |--十位---|-------个位--------|  日期(当前28号)
  0x14,       //-12H|    |--十位---|-------个位--------|  小时(当前14点)
  0x30,       //    |-----十位-----|-------个位--------|  分钟(当前30分)
  0x20        //    |-----十位-----|-------个位--------|  秒钟(当前20秒)
};
*/


///////////////////////////////////////////////////
//    名称:Dtc_Delay
//    功能:延时
//    输入:uint
//    输出:null
//    返回:null
///////////////////////////////////////////////////
void Rtc_Delay(unsigned int i) 
{
  unsigned int j;
  for(j=0;j<i;j++)
    _NOP();  
}



///////////////////////////////////////////////////
//    名称:Dtc_Reset
//    功能:重置
//    输入:null
//    输出:null
//    返回:null
///////////////////////////////////////////////////
void Rtc_Reset(void) 
{
 RTC_DIR |= (RTC_RST + RTC_SCLK);
 RTC_SCLK_LO;
 RTC_RST_LO;
 Rtc_Delay(10);
 RTC_SCLK_HI;
}


///////////////////////////////////////////////////
//    名称:Rtc_Write_Byte
//    功能:向RTC写入一个字节,数据由低位至高位依次发送
//    输入:uchar
//    输出:null
//    返回:null
///////////////////////////////////////////////////
void Rtc_Write_Byte(unsigned char byte) 
{
 unsigned char i;
 
 RTC_RST_HI;                                      //整个数据发送期间置为高电平
 RTC_DIR |= RTC_SDA;                              //置SDA为输出方向
 
 for(i=8;i>0;i--) 
 {
  RTC_SDA_LO;             
  if(byte & BIT0)                                 //发送位为0,则RTC数据位置高
    RTC_SDA_HI; 
  RTC_SCLK_LO;
  Rtc_Delay(20);
  RTC_SCLK_HI;
  Rtc_Delay(20);
  byte >>= 1;
 } 
}


///////////////////////////////////////////////////
//    名称:Rtc_Read_Byte
//    功能:从RTC中读取一个字节,数据读取从最高位开始
//    输入:null
//    输出:uchar
//    返回:null
///////////////////////////////////////////////////
unsigned char Rtc_Read_Byte(void) 
{ 
 unsigned char i;
 unsigned char bytetemp;
 
 bytetemp = 0x00;                                 //初始化清零           
 
 RTC_RST_HI;                                      //复位引脚为高电平,逻辑控制有效
 RTC_DIR &= ~RTC_SDA;                             //置SDA为输入方向
 
 for(i=0;i<7;i++)
 {
  RTC_SCLK_HI;
  Rtc_Delay(20);
  RTC_SCLK_LO;
  Rtc_Delay(20);
  if((RTC_IN & RTC_SDA) == RTC_SDA)
   bytetemp |= BIT7;
  bytetemp >>= 1;
 }
 
 return bytetemp; 
}


///////////////////////////////////////////////////
//    名称:Rtc_Write_Data
//    功能:向RTC中写入地址后写入数据
//    输入:uchar uchar
//    输出:null
//    返回:null
///////////////////////////////////////////////////
void Rtc_Write_Data(unsigned char addr,unsigned char byte) 
{
 RTC_RST_LO;
 RTC_SCLK_LO;
 RTC_RST_HI;
 
 Rtc_Write_Byte(addr);                            //写入地址
 Rtc_Write_Byte(byte);                            //写入数据
 
 RTC_SCLK_HI;
 RTC_RST_LO;                                      //逻辑操作完毕,清RST
} 
 

///////////////////////////////////////////////////
//    名称:Rtc_Read_Data
//    功能:向RTC写入地址后,从RTC中读取数据
//    输入:uchar
//    输出:uchar
//    返回:null
///////////////////////////////////////////////////
unsigned char Rtc_Read_Data(unsigned char addr) 
{
 unsigned char byte;
 
 RTC_RST_LO;
 RTC_SCLK_LO;
 RTC_RST_HI;
 
 Rtc_Write_Byte(addr);                            //写入地址
 byte = Rtc_Read_Byte();                          //读出数据
 
 RTC_SCLK_LO;
 RTC_RST_LO;                                      //逻辑操作完毕,清RST
 
 return byte;
}


///////////////////////////////////////////////////
//    名称:Rtc_Set_Data
//    功能:按照SettingData的设置设置RTC的时间
//    输入:uchar *
//    输出:null
//    返回:null
///////////////////////////////////////////////////
void Rtc_Set_Data(unsigned char *datetimeBuffer) 
{
 unsigned char addr = 0x8C;
 unsigned char temp;
 unsigned char *tempBuffer;
 
 tempBuffer = datetimeBuffer; 
 Rtc_Write_Data(0x8E,0x00);                       //写入控制命令,禁用写保护
 Rtc_Write_Data(addr,*tempBuffer);		  //只记年月日时分秒,不记周几
 tempBuffer++;
 addr -= 4; 
 
 for(temp=2;temp<7;temp++) 
 {
  Rtc_Write_Data(addr,*tempBuffer);
  tempBuffer++;
  addr -= 2;
 }
 
 Rtc_Write_Data(0x8E,0x80);                       //写入控制命令,启用写保护
}


///////////////////////////////////////////////////
//    名称:Rtc_Set_Data
//    功能:读取RTC时间到ReadingData中
//    输入:uchar *
//    输出:null
//    返回:null
///////////////////////////////////////////////////
void Rtc_Get_Data(unsigned char *str) 
{
 unsigned char i;
 unsigned char addr = 0x8D;

 *str = Rtc_Read_Data(addr); 			  //只记年月日时分秒,不记周几
 str++;
 addr -= 4;

 for(i=2;i<7;i++) 
 {
   *str = Rtc_Read_Data(addr); 
   str++;
   addr -= 2;
 }
}










⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -