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

📄 ds12.c

📁 MSP430读写DS12CR887
💻 C
字号:
/*********************************************/
//        时钟 ds12cr887 调试程序
//
//
//    by MARK_SHU    2007.04.12
/*********************************************/

#include"msp430x14x.h"
#include"DS12.h"

#define DATA_SEL     P1SEL
#define DATA_DIR     P1DIR
#define DATA_OUT     P1OUT
#define DATA_IN      P1IN

#define CONTROL_SEL  P3SEL
#define CONTROL_DIR  P3DIR
#define DS1         P3OUT |= BIT0            // DS 置 1
#define DS0         P3OUT &= ~BIT0           // DS 置 0
#define RW1         P3OUT |= BIT1            // RW 置 1
#define RW0         P3OUT &= BIT1            // RW 置 0
#define AS1         P3OUT |= BIT2            // AS 置 1
#define AS0         P3OUT &= ~BIT2           // AS 置 0
#define CS1         P3OUT |= BIT3            // CS 置 1
#define CS0         P3OUT &= ~BIT3           // CS 置 0

/**********************************/
//  时钟芯片启动函数
//  启动时钟芯片工作
//  该函数仅仅在时钟首次使用的时候用到一次
void start_ds12()
{
  write8bit_ds12(0x0a,0x20);                            // 开启时钟   写寄存器A ,开启振荡器并允许RTC计时
}


/*********************************/
//   关闭时钟芯片
//
void close_ds12()
{
  write8bit_ds12(0x0a,0x30) ;
}

/*********************************/
//  时钟芯片初始化函数
//  初始化 msp430 与 ds12cr887 连接的端口(功能选择,方向选择)
//  设定时钟存储格式和时间格式
void init_msp430_ds12()
{
  DATA_SEL = 0X00 ;                                       // P1 口 为端口功能
  CONTROL_SEL &= ~(BIT0 + BIT1 + BIT2 +BIT3);             // P3 口的 1 2 3 4 位为 IO 口功能
  CONTROL_DIR |= BIT0 + BIT1 + BIT2 + BIT3 ;              // 控制端口 DS RW AS CS方向为输出
}

/**********************************/
//
void init_ds12()
{
  start_ds12() ;

}

/**********************************/
//   ds12 格式初始化函数
//   用于改变 ds12 存储数据的格式
void set_geshi_ds12()
{
  //write8bit_ds12(0x0b,0x80);
  //void disable_register_a() ;
  write8bit_ds12(0x0b,0x02);                            // 设定时间存储格式与时间格式
                                                        // 信息为BCD格式 ,24小时模式 ,不使用夏令时
  //enable_register_a() ;
}

//*************************************************************
// 延时程序
//  只在 ds12cr887 模块使用

void delay_ds12(unsigned int n)
{
  unsigned int count ;
  int i ;
  unsigned long j ;
  count = 2667 ;
  for(i = n ; i> 0;i--)
  {
    for (j=count ;j>0;j--);
  }
  return ;
}

/*******************************************/
//   write status of register
//   register_add: address of register which you want to write
//
void write_register(unchar register_add,unchar register_data)
{
  AS0 ;   DS1 ; RW1 ;  DS0 ;
  _NOP() ;
  AS1 ;
  _NOP() ;
  CS0 ;
  DATA_DIR = 0XFF ;
  DATA_OUT = register_add ;
  AS0 ;                                   //  AS  下降沿 锁存地址
  delay_ds12(100) ;
  DS1 ;RW0 ;
  DATA_OUT = register_data ;
  delay_ds12(100) ;
  DS0 ;                                  //  DS   下降沿 锁存数据
  AS1 ;
}

/*******************************************/
//  read status of register
//  register_add: address of register which you want to read
//  register_data:

void read_register(unchar register_add ,unchar *register_data)
{
  DATA_DIR = 0XFF ;                      //   P1 口为输出方向
  AS0 ;
  DS1 ;
  RW0 ;
  DS0 ;
  _NOP() ;
  AS1 ;
  _NOP() ;
  CS0 ;
  DATA_OUT = register_add ;
  AS0 ;                                  //  AS  下降沿 锁存地址
  DATA_DIR = 0X00 ;
  P3OUT |= (BIT0 + BIT1)  ;              //   DS  RW 都为高
  delay_ds12(40) ;                       //   等待、数据在 DS RW 为高的后期 传输到总线上
                                         //   时间参数 40 是经过多次实验所得
  *register_data = DATA_IN ;
  DS0 ;                                  //   读周期结束,DS 复位
}


⌨️ 快捷键说明

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