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

📄 clock.c

📁 时钟芯片DS1302的msp430程序
💻 C
字号:
/************************************************
* 公司   :ss
* 文件名 : clock.c
* 功能   : 时间操作
* 作者   : noahzhou
* 创建日期: 07-12-04
* 修改日期: 07-12-04
* 版本   : VER1.3
* 规范:变量第一字母小写,函数(主函数除外)第一字母大写
* $$$: 表示要注意的地方,条件不同,要改动
**************************************************/
#include <MSP430x16x.h>
#include "clock.h"

//IO控制线
#define I2CPORT_SEL P1SEL   //IIC控制口
#define I2CPORT_OUT P1OUT   //IIC控制口
#define I2CPORT_IN  P1IN     
#define I2CPORT_DIR P1DIR
#define SCL BIT0           //时钟:P1.0
#define SDA BIT2           //数据:P1.2
#define RST BIT3           //复位:P1.3

//1302命令
/*
#define   CmdRdSec  0x81
#define   CmdRdMin  0x83
#define   CmdRdHour  0x85
#define   CmdRdDate  0x87
#define   CmdRdMonth  0x89
#define   CmdRdDay  0x8b
#define   CmdRdYear  0x8d
#define   CmdRdControl          0x8f
#define   CmdRdTrickleCharge 0x91
#define   CmdRdClockBurst  0xbf
#define   CmdWrSec  0x80
#define   CmdWrMin  0x82
#define   CmdWrHour  0x84
#define   CmdWrDate  0x86
#define   CmdWrMonth  0x88
#define   CmdWrDay  0x8a
#define   CmdWrYear  0x8c
#define   CmdWrControl         0x8e
#define   CmdWrTrickleCharge 0x90
#define   CmdWrClockBurst  0xbe
*/

/*-----------------------------------------
--功能:DS1302管脚初始化 
--入口:无
--出口:无
--状态:
--周期: cycles
-------------------------------------------
--*/  
void Clock_IO_Init(void)
{
   I2CPORT_SEL &= ~(RST + SDA + SCL);// RST:IO  SDA: IO  SCL:IO
   I2CPORT_DIR |= RST + SDA + SCL ;// RST:O   SDA: O   SCL:O
   I2CPORT_OUT |= RST + SDA + SCL ;// RST:1   SDA: 1   SCL:1
}

//------------------------------------------------------------
//功能: SDA置高电平
//入口: no
//出口: no
//状态:待测试
//修改:07-08-17
//------------------------------------------------------------
void I2C_SDA_H(void)
{
//I2CPORT_DIR |= SDA;
I2CPORT_OUT |= SDA;
_NOP();
_NOP();
//I2CPORT_DIR &= ~SDA;
}
//------------------------------------------------------------
//功能: SDA置低电平
//入口: no
//出口: no
//状态:待测试
//修改:07-08-17
//------------------------------------------------------------ 

void I2C_SDA_L(void)
{
//I2CPORT_DIR |= SDA;
I2CPORT_OUT &=~ SDA;
_NOP();
_NOP();
//I2CPORT_DIR &= ~SDA;
}
//------------------------------------------------------------
//功能: SCL置高电平
//入口: no
//出口: no
//状态:待测试
//修改:07-08-17
//------------------------------------------------------------  

void I2C_SCL_H(void)
{
I2CPORT_DIR |= SCL;
I2CPORT_OUT |= SCL;
_NOP();
_NOP();
//I2CPORT_DIR &= ~SCL;
}

//------------------------------------------------------------
//功能: SCL置低电平
//入口: no
//出口: no
//状态:待测试
//修改:07-08-17
//------------------------------------------------------------

void I2C_SCL_L(void)
{
    I2CPORT_DIR |= SCL;
    I2CPORT_OUT &=~ SCL;
    _NOP();
    _NOP();
   // I2CPORT_DIR &= ~SCL;
}

//------------------------------------------------------------
//功能: RST置高电平
//入口: no
//出口: no
//状态:待测试
//修改:07-08-17
//------------------------------------------------------------

void I2C_RST_H(void)
{
    //I2CPORT_DIR |= RST;
    I2CPORT_OUT |= RST;
    _NOP();
    _NOP();
}
//------------------------------------------------------------
//功能: RST置低电平
//入口: no
//出口: no
//状态:待测试
//修改:07-08-17
//------------------------------------------------------------ 

void I2C_RST_L(void)
{
   // I2CPORT_DIR |= RST;
    I2CPORT_OUT &=~ RST;
    _NOP();
    _NOP();
}
//------------------------------------------------------------
//功能: 发送一个字节数据
//入口: unsigned char nValue-字节数据
//出口: no
//状态:待测试
//修改:07-08-17
//------------------------------------------------------------

void I2C_SendByte(unsigned char nValue)
{
unsigned char i;
for(i=0;i<8;i++)
  {
  if((nValue&BIT0)==BIT0) // 从bit0开始发送
  I2C_SDA_H(); //如果是1 输出高电平,
  else
  I2C_SDA_L(); //如果是 0,输出低电平;
  _NOP();
  I2C_SCL_H();
  _NOP();
  I2C_SCL_L();//SCK=0;
  _NOP();
  nValue>>=1;
  }
}
//------------------------------------------------------------
//功能: 读取一个字节数据
//入口: no
//出口: unsigned int字节数据
//状态:待测试
//修改:07-08-17
//------------------------------------------------------------ 
unsigned char I2C_ReadByte(void)
{
unsigned char i;
unsigned char nTemp=0;

I2CPORT_DIR &=~ SDA;// SDA input
for(i=0;i<8;i++)
  {
    nTemp>>=1;
    //等待从器件送出数据
    //I2CPORT_DIR &=~ SDA;
    if(I2CPORT_IN & SDA)
    nTemp |=0x80;
  
    I2C_SCL_H();
    _NOP();
    I2C_SCL_L();//下降沿读出
    _NOP();
  }

//I2CPORT_DIR |= SDA;//SDA output

return nTemp;
}
//------------------------------------------------------------
//功能: 写DS1302
//入口: unsigned char Value-数值,unsigned char Address-地址
//出口: no
//状态:待测试
//修改:07-08-17
//------------------------------------------------------------ 
void Write_1302(unsigned char Address,unsigned char Value) 
{
    I2CPORT_DIR |= SDA;//SDA output    noahzhou
    I2CPORT_DIR |= SCL;//SCL output    noahzhou
    
    I2C_RST_L();
    I2C_SCL_L();
    I2C_RST_H();
    I2C_SendByte(Address);//发送地址字节
    I2C_SendByte(Value);//发送数据字节
    I2C_SCL_L();
    I2C_RST_L();
    
    I2C_SCL_H();//NOAHZHOU
    I2CPORT_DIR &=~ SDA;// SDA input   noahzhou
    I2CPORT_DIR &=~ SCL;// SCL input   noahzhou
}

//------------------------------------------------------------
//功能: 读DS1302
//入口: unsigned int Address-读取地址
//出口: unsigned int-返回数据
//状态:待测试
//修改:07-08-17
//------------------------------------------------------------
unsigned int Read_1302(unsigned int Address) 
{
    unsigned char Value;
    I2CPORT_DIR |= SDA;//SDA output    noahzhou
    I2CPORT_DIR |= SCL;//SCL output    noahzhou
    
    I2C_RST_L();
    I2C_SCL_L();
    I2C_RST_H();
    I2C_SendByte(Address);//发送地址字节
    Value = I2C_ReadByte();
    I2C_SCL_L();
    I2C_RST_L();
    
    I2C_SCL_H();//noahzhou
    I2CPORT_DIR &=~ SDA;// SDA input   noahzhou
    I2CPORT_DIR &=~ SCL;// SCL input   noahzhou
    return Value;
}
//------------------------------------------------------------
//功能: 设置DS1302
//入口: unsigned char addr-地址,unsigned char *init_time-时间数组,unsigned char n-长度
//出口: no
//状态:待测试
//修改:07-08-17
//------------------------------------------------------------ 
void Set_Time(unsigned char addr,unsigned char *init_time,unsigned char n) 
{
   unsigned char i;
    Write_1302(0x8e,0x00); //允许写
    for(i=n;i>0;i--)
    {
    Write_1302(addr,*init_time);
    init_time++;
    addr+=2;
    }
  // addr+=2;
 //  Write_1302(addr,*init_time);
   Write_1302(0x8e,0x80); //写保护
}

//------------------------------------------------------------
//功能: 读取DS1302
//入口: no
//出口: no
//状态:待测试
//周期:7599cyc   950us
//修改:07-08-17
//------------------------------------------------------------
void Get_Time(void)        //    
{
 // unsigned char i, addr,temp_time[7],temp1,temp2;
  unsigned char i, addr;
  addr=0x81;
  for(i=0;i<7;i++)
  {
  get_time[i]=Read_1302(addr);
  addr+=2;
  }
 
}

//------------------------------------------------------------
//功能: 1302时间信息写入
//入口: *config_time 配置时间信息首地址
//出口: no
//状态:待测试
//修改:07-08-17
//------------------------------------------------------------

void Config_Clock(unsigned char *config_time)
{
   I2C_SCL_L();   //SCK=0
   I2C_RST_L();   //RST=0,复位
   Write_1302(0x8e,0x00); 
   Write_1302(0x90,0x00);
   Set_Time(0x80,config_time,7);
} 



⌨️ 快捷键说明

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