ds1302.c

来自「时间日历芯片DS1302驱动代码」· C语言 代码 · 共 379 行

C
379
字号
/****************************************Copyright (c)**************************************************
**                                   DS1302 RTC读写程序
**                                   
**                                       
**
**                                         V 0.1
**
**--------------文件信息--------------------------------------------------------------------------------
**文   件   名: DS1320.c
**创   建   人: 徐亦朱
**最后修改日期: 2007年10月10日
**描        述: 原始版本
**              
**--------------历史版本信息----------------------------------------------------------------------------
** 创建人: 
** 版  本: 
** 日 期: 
** 描 述: 
**
**--------------当前版本修订------------------------------------------------------------------------------
** 修改人: 
** 日 期: 
** 描 述: 
**
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/

#include  "DS1302.h"

/*********************************************************************************************************
** 函数名称: main
** 功能描述: DS1302读写主程序
**
** 输 入:   
** 输 出: 
**         
** 全局变量: 无
** 调用模块: 无
** 调试码:   无
**  
**
** 作 者: 徐亦朱
** 日 期: 2007年10月10日
**-------------------------------------------------------------------------------------------------------
** 修改人: 
** 日 期: 
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void  main( ) 
{
     UINT8  i ;
     UINT8  send[ 8 ] ;
     UINT8  recv[ 8 ] ;
     
     init_mcu( ) ;
     init1302( ) ;
     
     for ( i = 0; i < 8; i ++ )
          send[ i ] = 0 ;
     for ( i = 0; i < 8; i ++ )
          recv[ i ] = 0xEE ;
     
     ( ( TIME_1302 )send ) -> sec  = 30 ;
     ( ( TIME_1302 )send ) -> min  = 35 ;
     ( ( TIME_1302 )send ) -> hour = 9  ;
     ( ( TIME_1302 )send ) -> day  = 11 ;
     ( ( TIME_1302 )send ) -> month= 10 ;
     ( ( TIME_1302 )send ) -> week = 2  ;
     ( ( TIME_1302 )send ) -> year = 7  ;
     ( ( TIME_1302 )send ) -> wp   = 0  ;
     for ( i = 0; i < 8; i ++ )
          send[ i ] = conv_decimal_or_bcd( send[ i ], MODEA1 ) ;
     write1302( 0xBE, send, 8 ) ;
     
     mDelay( 100 ) ;
     
     while( 1 )
     {   
          read1302( 0xBF, recv, 8 ) ;
          for ( i = 0; i < 8; i ++ )
               recv[ i ] = conv_decimal_or_bcd( recv[ i ], MODEA2 ) ;
          printf( "sec = %d\n", ( UINT16 )recv[ 0 ] ) ;
          printf( "min = %d\n", ( UINT16 )recv[ 1 ] ) ;
          printf( "hour= %d\n", ( UINT16 )recv[ 2 ] ) ;
          printf( "day = %d\n", ( UINT16 )recv[ 3 ] ) ;
          printf( "month=%d\n", ( UINT16 )recv[ 4 ] ) ;
          printf( "week= %d\n", ( UINT16 )recv[ 5 ] ) ;
          printf( "year= %d\n", ( UINT16 )recv[ 6 ] ) ;
          printf( "wp  = %d\n", ( UINT16 )recv[ 7 ] ) ;
          
          mDelay( 200 ) ;
     }
} 

/*********************************************************************************************************
** 函数名称: init_mcu
** 功能描述: 单片机初始化
**
** 输 入:   
** 输 出: 
**         
** 全局变量: 无
** 调用模块: 无
** 调试码:   无
**  
**
** 作 者: 徐亦朱
** 日 期: 2007年10月10日
**-------------------------------------------------------------------------------------------------------
** 修改人: 
** 日 期: 
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void  init_mcu( void )
{
     P0   = 0xFF ;
     P1   = 0xFF ;
     P2   = 0xFF ;
     SCON = 0x50 ;
     PCON = 0x80 ;
     TMOD = 0x21 ;
     TH1  = 0xFD ;       //11.092MHz晶振, 19200bps 
     TR1  = 1 ;
     TI   = 1 ;
}

/*********************************************************************************************************
** 函数名称: init1302
** 功能描述: DS1320初始化
**
** 输 入:   
** 输 出: 
**         
** 全局变量: 无
** 调用模块: 无
** 调试码:   无
**  
**
** 作 者: 徐亦朱
** 日 期: 2007年10月10日
**-------------------------------------------------------------------------------------------------------
** 修改人: 
** 日 期: 
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void  init1302( void ) 
{
     UINT8  * pdat ;
     UINT8  dat ;
     pdat = &dat ;
     
     SCLK = 0 ;
     RST  = 0 ;
     
     dat = 0x00 ;
     write1302( 0x80, pdat, 1 ) ;       //秒寄存器初始化,并且1302开始振荡
     dat = 0xA6 ;
     write1302( 0x90, pdat, 1 ) ;       //一个二极管+4K电阻充电
}

/*********************************************************************************************************
** 函数名称: write1302
** 功能描述: DS1302写数据
**
** 输 入: addr  - 写入的寄存器地址
**         *pdat - 写入的数据首址
**         numb  - 写入的字节数  
** 输 出: 
**         
** 全局变量: 无
** 调用模块: 无
** 调试码:   无
**  
**
** 作 者: 徐亦朱
** 日 期: 2007年10月10日
**-------------------------------------------------------------------------------------------------------
** 修改人: 
** 日 期: 
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void  write1302( UINT8 addr, UINT8 * pdat, UINT8 numb ) 
{
     UINT8  i ;
  
     RST  = 0 ;
     SCLK = 0 ;
     RST  = 1 ;
     writebyte( 0x8E ) ;      //写保护寄存器: 允许写入数据
     writebyte( 0x00 ) ;
     RST  = 0 ;
     SCLK = 0 ;
     
     RST  = 1 ;
     writebyte( addr ) ;      //写寄存器地址
     for ( i = 0; i < numb; i ++ )
     {
          writebyte( *pdat ) ;
          pdat ++ ;
     }
     RST  = 0 ;
     SCLK = 0 ;
     
     RST  = 1 ;
     writebyte( 0x8E ) ;      //写保护寄存器: 禁止写入数据
     writebyte( 0x80 ) ;
     SCLK = 0 ;
     RST  = 0 ;
}

/*********************************************************************************************************
** 函数名称: readbytes
** 功能描述: DS1302读数据
**
** 输 入: addr  - 读取的寄存器地址
**         *pdat - 读取的数据存放首址
**         numb  - 读取的字节数  
** 输 出: 
**         
** 全局变量: 无
** 调用模块: 无
** 调试码:   无
**  
**
** 作 者: 徐亦朱
** 日 期: 2007年10月10日
**-------------------------------------------------------------------------------------------------------
** 修改人: 
** 日 期: 
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void  read1302( UINT8 addr, UINT8 * pdat, UINT8 numb )
{
     UINT8  i ;
  
     RST  = 0 ;
     SCLK = 0 ;
     RST  = 1 ;
     writebyte( addr ) ;      //写寄存器地址
     for( i = 0; i < numb; i ++ )
     {
          *pdat = readbyte( ) ;
          pdat ++ ;
     }
     SCLK = 0 ;
     RST  = 0 ;
}

/*********************************************************************************************************
** 函数名称: writebyte
** 功能描述: SPI 写接口函数
**
** 输 入: byte - 要写入的数据
** 输 出: 
**         
** 全局变量: 无
** 调用模块: 无
** 调试码:   无
**  
**
** 作 者: 徐亦朱
** 日 期: 2007年10月10日
**-------------------------------------------------------------------------------------------------------
** 修改人: 
** 日 期: 
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void  writebyte( UINT8 byte )
{
     UINT8  i ;
     
     for ( i = 0; i < 8; i ++ )
     {
          SCLK = 0 ;
          IO = ( byte & 0x01 ) ? 1 : 0 ;
          SCLK = 1 ;
          byte >>= 1 ;
     }
}

/*********************************************************************************************************
** 函数名称: readbyte
** 功能描述: SPI 读接口函数
**
** 输 入: 
** 输 出: 读取的数据
**         
** 全局变量: 无
** 调用模块: 无
** 调试码:   无
**  
**
** 作 者: 徐亦朱
** 日 期: 2007年10月10日
**-------------------------------------------------------------------------------------------------------
** 修改人: 
** 日 期: 
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
UINT8  readbyte( void )
{
     UINT8  i ;
     UINT8  byte = 0 ;
     
     for ( i = 0; i < 8; i ++ )
     {
          SCLK = 0 ;
          byte = IO ? ( byte | 0x80 ) : ( byte & 0x7F ) ;
          SCLK = 1 ;
          byte = ( i == 7 ) ? byte : ( byte >> 1 ) ;
     }
     return( byte ) ;
} 

/*********************************************************************************************************
** 函数名称: mDelay
** 功能描述: ms级延时函数
**
** 输 入:   以ms为单位的延时时间
** 输 出: 
**         
** 全局变量: 无
** 调用模块: 无
** 调试码:   无
**  
**
** 作 者: 徐亦朱
** 日 期: 2007年10月10日
**-------------------------------------------------------------------------------------------------------
** 修改人: 
** 日 期: 
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void  mDelay( UINT8 delaytime )
{
     UINT8  i ;
     
     while( delaytime -- )
          for ( i = 0; i < 128 ; i ++ )
               continue ;
}

/*********************************************************************************************************
** 函数名称: conv_decimal_or_bcd
** 功能描述: 十进制,BCD码转换函数
**
** 输 入: num  - 要转换的数字
**         mode - 转换模式
**           A. MODEA1 - 十进制转BCD码
**           B. MODEA2 - BCD码转十进制
** 输 出: 转换后的结果
**         
** 全局变量: 无
** 调用模块: 无
** 调试码:   无
**  
**
** 作 者: 徐亦朱
** 日 期: 2007年10月11日
**-------------------------------------------------------------------------------------------------------
** 修改人: 
** 日 期: 
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
UINT8  conv_decimal_or_bcd( UINT8 num, UINT8 mode )
{
     UINT8  tmp  ;
     UINT8  byte ;

     if ( mode == MODEA1 )
          byte = ( num / 10 << 4 ) | ( num % 10 ) ;
     else  if ( mode == MODEA2 )
     {
          tmp  = ( num >> 4 & 0x0F )  ;
          byte = ( tmp << 1 ) + ( tmp << 3 ) + ( num & 0x0F ) ;
     }
     return( byte ) ;
}
          

⌨️ 快捷键说明

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