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

📄 rtc.c

📁 这是msp430f1611驱动DS1302的完整程序
💻 C
字号:
///////////////////////////////////////////////////////////////
//////                 无线传感器网络节点程序            //////        
//                     实时时钟部分                          //
//                     编写:孔一凡                          //
//                     日期:2008.6                          //
//                     版本:0.1                             // 
//  连接情况:                                               //
//         MSP430F149                   DS1302               //
//     ------------------         ------------------         //
//     |      P30       | ------> |     nRST       |         //
//     |      P31       | ------> |      SDA       |         //
//     |      P33       | ------> |     SCLK       |         //
//     ------------------         ------------------         //
//     nRST-----低电平有效                                   //
///////////////////////////////////////////////////////////////

#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秒)
};
*/


///////////////////////////////////////////////////
//    名称:Rtc_Delay
//    功能:延时
//    输入:uint
//    输出:null
//    返回:null
///////////////////////////////////////////////////

void Rtc_Delay(unsigned int i) 
{
  unsigned int j;
  for(j=0;j<i;j++)
  _NOP();  
}


///////////////////////////////////////////////////
//    名称:Rtc_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
//    输出:null
//    返回:uchar
///////////////////////////////////////////////////

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
//    输出:null
//    返回:uchar
///////////////////////////////////////////////////

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 + -