msp430f149读写ds1302程序如下: 
#include <msp430f149.h> 
typedef unsigned char uchar; 
typedef unsigned int  uint; 
 
/**************宏定义***************/ 
#define DS_SCL  BIT0       //DS_SCL = P2.0 
#define DS_SDA  BIT1      //DS_SDA = P2.1 
#define DS_RST  BIT2        //DS_RST = P2.2 
#define DS_RST_IN P2DIR &= ~DS_RST 
#define DS_RST_OUT P2DIR |= DS_RST 
#define DS_RST0 P2OUT &= ~DS_RST 
#define DS_RST1 P2OUT |= DS_RST 
#define DS_SCL_IN P2DIR &= ~DS_SCL 
#define DS_SCL_OUT P2DIR |= DS_SCL 
#define DS_SCL0 P2OUT &= ~DS_SCL 
#define DS_SCL1 P2OUT |= DS_SCL 
#define DS_SDA_IN P2DIR &= ~DS_SDA 
#define DS_SDA_OUT P2DIR |= DS_SDA 
#define DS_SDA0 P2OUT &= ~DS_SDA 
#define DS_SDA1 P2OUT |= DS_SDA 
#define DS_SDA_BIT P2IN & DS_SDA 
void delay(unsigned int time); 
void Reset_DS1302(void); 
void Write1Byte(unsigned char wdata); 
unsigned char Read1Byte(void); 
void W_Data(unsigned char addr, unsigned char wdata); 
unsigned char R_Data(unsigned char addr); 
void Set_DS1302(unsigned char *ptr); 
void Get_DS1302(unsigned char *ptr); 
 
 
 
/******************************************* 
函数名称:delay 
功    能:延时一段时间 
参    数:time--延时长度 
返回值  :无 
********************************************/ 
void delay(uint time) 
{ 
    uint i; 
    for(i = 0;i < time;i++)     _NOP(); 
} 
/******************************************* 
函数名称:Reset_DS1302 
功    能:对DS1302进行复位操作 
参    数:无 
返回值  :无 
********************************************/ 
void Reset_DS1302(void) 
{ 
    DS_RST_OUT;  //RST对应的IO设置为输出状态 
    DS_SCL_OUT;  //SCLK对应的IO设置为输出状态 
    DS_SCL0;     //SCLK=0 
    DS_RST0;     //RST=0 
    delay(10); 
    DS_SCL1;    //SCLK=1 
} 
/******************************************* 
函数名称:Write1Byte 
功    能:对DS1302写入1个字节的数据 
参    数:wdata--写入的数据 
返回值  :无 
********************************************/ 
void Write1Byte(uchar wdata)  
{  
    uchar i; 
 
    DS_SDA_OUT;     //SDA对应的IO设置为输出状态 
    DS_RST1;        //REST=1; 
 
    for(i = 8; i > 0; i--)  
    { 
        if(wdata&0x01)  DS_SDA1; 
        else            DS_SDA0; 
        DS_SCL0; 
        
        delay(10);  
        DS_SCL1; 
         
        delay(10); 
        wdata >>= 1;  
    }  
} 
/******************************************* 
函数名称:Read1Byte 
功    能:从DS1302读出1个字节的数据 
参    数:无 
返回值  :读出的一个字节数据 
********************************************/ 
uchar Read1Byte(void)  
{  
    uchar i; 
    uchar rdata = 0X00; 
 
    DS_SDA_IN;  //SDA对应的IO设置为输入状态 
    DS_RST1;    //REST=1; 
 
    for(i = 8; i > 0; i--) 
    { 
        DS_SCL1; 
        delay(10); 
        
        DS_SCL0; 
        
         delay(10); 
        rdata >>= 1; 
        if(DS_SDA_BIT)  rdata |= 0x80; 
    }  
     
    return(rdata);  
} 
/******************************************* 
函数名称:W_Data 
功    能:向某个寄存器写入一个字节数据 
参    数:addr--寄存器地址 
          wdata--写入的数据 
返回值  :无 
********************************************/ 
void W_Data(uchar addr, uchar wdata) 
{ 
    DS_RST0;  
    DS_SCL0;    
    _NOP(); 
    DS_RST1; 
    Write1Byte(addr);   //写入地址 
    Write1Byte(wdata);  //写入数据 
    DS_SCL1; 
    DS_RST0; 
}  
/******************************************* 
函数名称:R_Data 
功    能:从某个寄存器读出一个字节数据 
参    数:addr--寄存器地址 
返回值  :读出的数据 
********************************************/ 
uchar R_Data(uchar addr) 
{ 
    uchar rdata; 
     
    DS_RST0;  
    DS_SCL0;  
    _NOP(); 
    DS_RST1; 
    Write1Byte(addr);    //写入地址 
    rdata = Read1Byte();  //读出数据  
    DS_SCL1; 
    DS_RST0; 
     
    return(rdata); 
} 
/******************************************* 
函数名称:BurstWrite1302 
功    能:以burst方式向DS1302写入批量时间数据 
参    数:ptr--指向时间数据存放地址的指针 
返回值  :读出的数据 
说    明:时间数据的存放格式是: 
          秒,分,时,日,月,星期,年,控制 
            【7个数据(BCD格式)+1个控制】 
********************************************/ 
void BurstWrite1302(uchar *ptr) 
{ 
    uchar i; 
     
    W_Data(0x8e,0x00);      //允许写入      
    DS_RST0;  
    DS_SCL0;  
    _NOP(); 
    DS_RST1; 
    Write1Byte(0xbe);       // 0xbe:时钟多字节写入命令  
    for (i = 8; i > 0; i--)  
    { 
        Write1Byte(*ptr++);  
    } 
    DS_SCL1; 
    DS_RST0; 
    W_Data(0x8e,0x80);      // 禁止写入 
}  
/******************************************* 
函数名称:BurstRead1302 
功    能:以burst方式从DS1302读出批量时间数据 
参    数:ptr--指向存放时间数据地址的指针 
返回值  :无 
说    明:时间数据的存放格式是: 
          秒,分,时,日,月,星期,年,控制 
            【7个数据(BCD格式)+1个控制】 
********************************************/ 
void BurstRead1302(uchar *ptr) 
{ 
    uchar i; 
   
    DS_RST0;  
    DS_SCL0;  
    _NOP(); 
    DS_RST1; 
    Write1Byte(0xbf);             //0xbf:时钟多字节读命令 
    for (i = 8; i > 0; i--)  
    { 
       *ptr++ = Read1Byte();  
    } 
    DS_SCL1; 
    DS_RST0; 
} 
/******************************************* 
函数名称:BurstWriteRAM 
功    能:以burst方式向DS1302的RAM中写入批量数据 
参    数:ptr--指向存放数据地址的指针 
返回值  :无 
说明    :共写入31个字节的数据 
********************************************/ 
void BurstWriteRAM(uchar *ptr) 
{ 
    uchar i; 
     
    W_Data(0x8e,0x00);         //允许写入 
    DS_RST0;  
    DS_SCL0;  
    _NOP(); 
    DS_RST1; 
    Write1Byte(0xfe);          //0xfe:RAM多字节写命令  
    for (i = 31; i>0; i--)     //RAM共有31个字节 
    { 
        Write1Byte(*ptr++);  
    } 
    DS_SCL1; 
    DS_RST0;  
    W_Data(0x8e,0x80);          //禁止写入 
}  
/******************************************* 
函数名称:BurstReadRAM 
功    能:以burst方式从DS1302的RAM中读出批量数据 
参    数:ptr--指向数据存放地址的指针 
返回值  :无 
说明    :共读出31个字节的数据 
********************************************/ 
void BurstReadRAM(uchar *ptr) 
{ 
    uchar i; 
   
    DS_RST0;  
    DS_SCL0;  
    _NOP(); 
    DS_RST1; 
    Write1Byte(0xff);             //0xff:RAM的多字节读命令  
    for (i = 31; i > 0; i--)  
    { 
         
       *ptr++ = Read1Byte();    
        
    } 
    DS_SCL1; 
    DS_RST0; 
} 
/******************************************* 
函数名称:Set_DS1302 
功    能:设置DS1302内部的时间 
参    数:ptr--指向存放数据地址的指针 
返回值  :无 
说明    :写入数据的格式: 
            秒 分 时 日 月 星期 年  【共7个字节】 
********************************************/ 
void Set_DS1302(uchar *ptr)  
{ 
    uchar i; 
    uchar addr = 0x80;  
     
    W_Data(0x8e,0x00);    //允许写入 
     
    for(i = 7;i > 0;i--) 
    {  
        W_Data(addr,*ptr++);  
        addr += 2; 
    } 
    W_Data(0x8e,0x80);      //禁止 
} 
/********************************************************************  
* 
* 名称: Get_DS1302 
* 说明:  
* 功能: 读取DS1302当前时间 
* 调用: R_Data(uchar addr)  
* 输入: ucCurtime: 保存当前时间地址。当前时间格式为: 秒 分 时 日 月 星期 年  
* 7Byte (BCD码) 1B 1B 1B 1B 1B 1B 1B 
* 返回值: 无 
***********************************************************************/ 
/******************************************* 
函数名称:Get_DS1302 
功    能:读取DS1302内部的时间 
参    数:ptr--指向数据存放地址的指针 
返回值  :无 
说明    :读出数据的格式: 
            秒 分 时 日 月 星期 年  【共7个字节】 
********************************************/ 
void Get_DS1302(uchar *ptr)  
{ 
    uchar i; 
    uchar addr = 0x81; 
     
    for(i = 0;i < 7;i++) 
    { 
        ptr = R_Data(addr); 
        addr += 2; 
    } 
} 
 
 
 
void main(void) 
{ 
   //秒,分,时,日,月,星期,年 
  unsigned char wdata[7]={0x30,0x46,0x20,0x14,0x08,0x02,0x07}; 
  unsigned char rdata[7]; 
   P2DIR = 0XFF;  P2OUT = 0XFF; 
     
    WDTCTL = WDTPW + WDTHOLD;   //关闭看门狗 
     
     /*------选择系统主时钟为8MHz-------*/ 
    BCSCTL1 &= ~XT2OFF;   //打开XT2高频晶体振荡器 
    uchar i; 
 
   do 
   {  
       IFG1 &= ~OFIFG;                 //清除晶振失败标志 
       for (i = 0xFF; i > 0; i--);     //等待8MHz晶体起振 
   } 
   while ((IFG1 & OFIFG)!=0);             //如果晶振失效标志存在 
   BCSCTL2 |= SELM_2 + SELS;           //MCLK和SMCLK选择高频晶振 
 
 
    Reset_DS1302(); 
while(1) 
  {  
      
     
   /*****测试更改和读出时间*****/ 
    Set_DS1302(wdata);  
 
 
    Get_DS1302(rdata); 
     
    _NOP();         //在此处设置断点,观察rdata是否与wdata一致 
     
} 
   
}    |   
     
  
 |