ds1302时钟

DS1302_R.H

#ifndef __DS1302_R_H__
#define __DS1302_R_H__

#ifndef uchar
#define uchar unsigned char
#endif
#ifndef uint
#define uint unsigned int
#endif
#include <reg52.h>

//定义模块通信管脚
sbit IO = P3^4;
sbit RST = P3^5;
sbit CLK = P3^6;

//定义存储时间的类型
//typedef struct time_str
//{
// uchar sec; // 秒
// uchar min; // 分
// uchar hour; // 小时
// uchar date; // 日
// uchar month; // 月
// uchar day; // 星期
// uchar year; // 年
//}Time_str;

//声明函数
void DS1302_init();
uchar DS1302_read_byte(uchar addr);
void Send_str(char str);
void Uart1Init();
void Send_str_1(char *str);

#endif

DS1302_R.c

/*********************************************************************/
/***********平台:Keil U4 + STC12C5A60S2 + DS1302时钟模块*************/
/***********名称:读取DS1302中的时间并通过串口显示********************/
/***********编写:WCT ********************************/
/***********日期:2019年1月21日19:37:07*******************************/
/*********** ******************************************/
/***********晶振:11.0592MHZ *****************************************/
/***********变更记录:无 *********************************************/
/*********************************************************************/
#include "DS1302_R.h"

//初始化DS1302 RST与CLK全部拉低
void DS1302_init()
{
RST = 0;
CLK = 0;
}

uchar DS1302_read_byte(uchar addr)
{
uchar i, temp;
RST = 1; // 启动DS1302
//写入目标地址:addr
// addr |= 0x01; //最低位置高,寄存器0位为0时写, 为1时读
for( i = 0; i < 8; i ++)
{

if(addr & 0x01 )
{
IO = 1;
}
else
{
IO = 0;
}
CLK = 1;
CLK = 0;
addr >>= 1;

}

//输出temp
for( i = 0; i < 8; i ++ )
{

temp >>= 1;
if( IO )
{
temp |= 0x80;
}
CLK = 1;
CLK = 0;
}
RST = 0; //停止DS1302总线

return temp;
}

uart.c

/**********************************************/
/* 平台:Keil U4 + STC12C5A60S */
/* 名称:串口通信 */
/* 编写:WCT */
/* 日期:2019年1月21日18:43:49 */
/* */
/* 晶振:11.0592MHZ */
/* 变更记录: 无 */
/**********************************************/

#include <reg52.h>

#define F_f 11059200UL //晶振频率11.0692MHZ
#define Baud_rate 9600UL //波特率9600

sfr AUXR = 0x8E; //定义特殊功能寄存器AUXR
sfr BRT = 0x9C; //定义独立波特率发生寄存器BRT

void Send_str(char str)
{
SBUF = str;
while( !TI ); //等待发送完成
TI = 0; //清除发送中断请求
}

void Send_str_1(char *str)
{
while( *str )
{
SBUF = *str;
while( !TI ); //等待发送完成
TI = 0; //清除发送中断请求
str ++;
}
}

void Uart1Init()
{
PCON &= 0x7F; // 波特率不加倍
SCON = 0x50; // 设置串行通信工作方式1,并允许串行接受
AUXR &= 0xFB; // 独立波特率发生器时钟12T
BRT = 256 - F_f / (12 * Baud_rate * 32); //独立波特率发生器装载初值
AUXR |= 0x11; // 允许独立波特率发生器作为串口波特率发生器,并开启
EA = 1; // 开启总中断
ES = 1; // 开启串行中断
}

void Uart1Routine() interrupt 4
{
unsigned char uart_sbuf;
if(RI) //接受完成RI = 1;
{
uart_sbuf = SBUF;
if(uart_sbuf == 0xaa )
{
Send_str_1("收到ok\n");
}
RI = 0; //清除接受中断请求
}
}

main.c

/*********************************************************************/
/***********平台:Keil U4 + STC12C5A60S2 + DS1302时钟模块*************/
/***********名称:读取DS1302中的时间并通过串口显示********************/
/***********编写:WCT ********************************/
/***********日期:2019年1月21日19:37:07*******************************/
/*********** ******************************************/
/***********晶振:11.0592MHZ *****************************************/
/***********变更记录:无 *********************************************/
/*********************************************************************/
#include <reg52.h>
#include "DS1302_R.h"

//写时间寄存器地址------------读时间寄存器地址:写地址 + 1
uchar code READ_RTC_ADDR[7] = {0x81, 0x83, 0x85, 0x87, 0x89, 0x8b, 0x8d};
uchar TIME[7] = { 0 };

void main()
{
uchar n;
uchar i = 5000;

while( i -- );

DS1302_init();
Uart1Init();

for(n= 0; n < 7; ++ n )
{
TIME[n] = DS1302_read_byte( READ_RTC_ADDR[n] );
}

Send_str( '2' );
Send_str( '0' );
Send_str(( TIME[6] >> 4 ) + '0' );
Send_str(( TIME[6] & 0x0f ) + '0' );
Send_str('-' );

Send_str(( TIME[4] >> 4 ) + '0' );
Send_str(( TIME[4] & 0x0f ) + '0' );

Send_str( '-' );

Send_str(( TIME[3] >> 4 ) + '0' );
Send_str(( TIME[3] & 0x0f ) + '0' );

Send_str( ' ' );

Send_str(( TIME[2] >> 4 ) + '0' );
Send_str(( TIME[2] & 0x0f ) + '0' );

Send_str( ':' );

Send_str(( TIME[1] >> 4 ) + '0' );
Send_str(( TIME[1] & 0x0f ) + '0' );

Send_str( ':' );

Send_str(( TIME[0] >> 4 ) + '0' );
Send_str(( TIME[0] & 0x0f ) + '0' );

Send_str_1( " 星期:" );
Send_str(( TIME[5] >> 4 ) + '0' );
Send_str(( TIME[5] & 0x0f ) + '0' );

Send_str( '\n' );

while(1);

}