51单片机对DS1302突发模式的读写

#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的读写程序,有任何想法的人都可以讨论并加以改进。让我们共同学习。

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值