#include <STC89C5xRC.H>
#include <intrins.h>
#include "DS1302.h"
//DS1302管脚
sbit SCLK = P3^6; //时钟
sbit CE = P3^5; //片选
sbit databus = P3^4; //双向IO
//写模式寄存器
#define WRITE_CONTROL_SECONDS 0x80 //秒 //位7=1暂停 =0运行
#define WRITE_CONTROL_MINUTE 0x82 //分
#define WRITE_CONTROL_HOUR 0x84 //时 位7 1——12小时模式 0——24小时模式 当位7为1时位5 0——am 1——pm
#define WRITE_CONTROL_DAY 0x86 //日
#define WRITE_CONTROL_MONTH 0x88 //月
#define WRITE_CONTROL_WEEK 0x8a //周
#define WRITE_CONTROL_YEAR 0x8e //年
//读模式寄存器
#define READ_CONTROL_SECONDS 0x81 //秒
#define READ_CONTROL_MINUTE 0x83 //分
#define READ_CONTROL_HOUR 0x85 //时
#define READ_CONTROL_DAY 0x87 //日
#define READ_CONTROL_MONTH 0x89 //月
#define READ_CONTROL_WEEK 0x8b //周
#define READ_CONTROL_YEAR 0x8d //年
//控制读写寄存器
#define READ_CONTROL 0x8f //读
#define WRITE_CONTROL 0x8e //写
#define OPEN_PROTECT 0x80 //开写保护
#define CLOSE_PROTECT 0x00 //关写保护
//突发模式寄存器
#define READ_COLOCK_BURST 0xbf //读时钟突发模式寄存器
#define WRITE_COLOCK_BURST 0xbe //写时钟突发模式寄存器
#define READ_RAM_BURST 0xFF //读RAM突发模式寄存器
#define WRTIE_RAM_BURST 0xFE //写RAM突发模式寄存器
//初始值存放 秒,分,时,日,月,周,年,关写保护
unsigned char write_Data_array[8]={0,0,1,1,1,1,15,00};
//BCD转十进制值存放
unsigned char BCD_to_TEN[8] = {0};
//读取值存放
unsigned char read_Data_array[8] = {0};
//十进制转BCD
unsigned char BCD_preservation[8]={0};
void start(void); //开始
void end(void); //结束
void write_data(unsigned char Data); //写一个字节数据
unsigned char read_data(void); //读一个字节数据
void ten_to_BCD_transformation(unsigned char *pvalue,unsigned char length,unsigned char *preturn); //十进制转BCD
void BCD_to_ten_transformation(unsigned char *pvalue,unsigned char length,unsigned char *preturn); //BCD转十进制
void init_ds1302_BURST(void); //突发模式初始化
void get_ds1302_data(unsigned char length); //突发模式读取数据
//初始化ds1302
//DS1302突发模式的读写包含开关写保护
void init_ds1302_BURST(void)
{
unsigned char i = 0;
//十进制转BCD
ten_to_BCD_transformation(write_Data_array,sizeof(write_Data_array),BCD_preservation);
//关写保护
start();
write_data(WRITE_CONTROL);
write_data(CLOSE_PROTECT);
end();
//突发模式写入数据
start();
write_data(WRITE_COLOCK_BURST);
for(i = 0; i<8; i++)
{
write_data(BCD_preservation[i]);
}
end();
//开写保护
start();
write_data(WRITE_CONTROL);
write_data(OPEN_PROTECT);
end();
}
//以突发模式获取ds1302时钟数据
void get_ds1302_data(unsigned char length)
{
unsigned char i = 0;
//关写保护
start();
write_data(WRITE_CONTROL);
write_data(CLOSE_PROTECT);
end();
//开始读取数据
start();
write_data(READ_COLOCK_BURST);
for(i=0; i<length; i++)
{
read_Data_array[i] = read_data();
}
end();
//开写保护
start();
write_data(WRITE_CONTROL);
write_data(OPEN_PROTECT);
end();
//BCD转十进制
BCD_to_ten_transformation(read_Data_array,sizeof(read_Data_array),BCD_to_TEN);
}
//十进制转换为BCD
void ten_to_BCD_transformation(unsigned char *pvalue,unsigned char length,unsigned char *preturn)
{
unsigned char i = 0,high = 0,low = 0;
for(i=0;i<length;i++)
{
high = *(pvalue+i)/10%10; //获取十进制十位
low = *(pvalue+i)%10; //获取十进制个位
*(preturn+i) = (high<<4)|low; //十进制转换成BCD
}
}
//BCD转换为十进制
void BCD_to_ten_transformation(unsigned char *pvalue,unsigned char length,unsigned char *preturn)
{
unsigned char i = 0,high = 0,low = 0;
for(i=0;i<length;i++)
{
high = *(pvalue+i)/16%16; //十六进制转十进制十位
low = *(pvalue+i)%16; //十六进制转十进制个位
*(preturn+i) = (high*10)+low; //十进制组合
}
}
//开始
void start(void)
{
CE = 0;
SCLK = 0;
databus = 0;
CE = 1;
}
//结束
void end(void)
{
CE = 0;
SCLK = 1;
databus = 1;
}
//写一个字节数据
void write_data(unsigned char Data)
{
unsigned char i = 0;
for(i=0; i<8; i++)
{
SCLK = 0;
databus = Data&0x01;
SCLK = 1;
Data>>=1;
}
}
//读一个字节数据
unsigned char read_data(void)
{
unsigned char i = 0,value = 0;
for(i=0; i<8; i++)
{
SCLK = 1;
if(databus == 1)
{
value|=0x80;
}
SCLK = 0;
value>>=1;
}
return value;
}
void main(void)
{
init_ds1302_BURST(); //初始化DS1302
while(1)
{
get_ds1302_data(8); //获DS1302值
}
}
这是我写的一个ds1302的读写程序,有任何想法的人都可以讨论并加以改进。让我们共同学习。