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 + -
显示快捷键?