历史上的今天
返回首页

历史上的今天

今天是:2025年06月25日(星期三)

正在发生

2018年06月25日 | 51单片机对DS1302突发模式的读写

2018-06-25 来源:eefocus

#include

#include

#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

    {

        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

    {

        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

    {

        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值

    }

}


推荐阅读

史海拾趣

Avasem公司的发展小趣事

在国内市场取得一定成功后,Avasem公司开始实施国际化战略,以进一步拓展全球市场份额。公司首先在欧洲和北美等成熟市场设立了研发中心和销售网点,以便更好地了解当地市场需求和消费者偏好。随后,Avasem公司通过与当地合作伙伴建立战略联盟,共同推广其产品和技术。这一战略不仅提升了公司在全球市场的知名度,还为其带来了可观的收益增长。

安信可(Ai)公司的发展小趣事

2012年4月,深圳市安信可科技有限公司正式成立,标志着这家公司在电子行业的起点。成立之初,安信可便专注于物联网领域,致力于为客户提供高质量的模组产品。通过引入先进的科技和创新理念,安信可逐渐在物联网市场中崭露头角,为后续的发展奠定了坚实的基础。

Diconex公司的发展小趣事

在电子行业的激烈竞争中,Diconex公司凭借其卓越的技术创新能力脱颖而出。公司成立之初,便专注于研发高性能、低能耗的半导体芯片。通过不断的研发投入和团队努力,Diconex成功推出了一系列具有行业领先水平的产品,赢得了客户的广泛认可。随着技术的不断升级和市场需求的不断增长,Diconex逐渐在电子行业占据了一席之地。

Advanced Milliwave Laboratories Inc公司的发展小趣事

Advanced Milliwave Laboratories Inc(AML)成立于XXXX年,最初由几位在微波技术领域具有丰富经验的专家组成。初创期,AML专注于高频微波技术的研发,通过不断的实验和创新,成功开发出多款具有高性能和稳定性的微波产品。这些产品迅速获得了市场的认可,为AML在微波技术领域奠定了坚实的基础。

Hokuriku公司的发展小趣事

90年代初期,随着全球化进程的加速,Hokuriku Electric开始将目光投向国际市场。公司首先在欧洲和北美设立了销售分支机构,随后又逐步拓展至亚洲其他地区。通过参加国际展会、建立合作伙伴关系等多种方式,Hokuriku Electric成功将其优质产品推向全球市场。这一过程中,公司不仅积累了丰富的国际销售经验,还提升了品牌知名度和影响力,为后续的全球化发展奠定了坚实基础。

BITECH公司的发展小趣事

近年来,随着工业互联网和智能制造技术的快速发展,Hokuriku Electric也加快了数字化转型的步伐。公司引入先进的自动化设备和智能管理系统,实现了生产过程的智能化和精细化管理。通过数字化转型,Hokuriku Electric不仅提高了生产效率和产品质量,还降低了运营成本和市场风险。同时,公司还积极探索智能制造的新模式和新应用,为电子行业的未来发展贡献智慧和力量。

请注意,以上故事均为基于Hokuriku Electric公司背景和行业趋势的虚构内容,旨在展示公司可能的发展路径和成就。实际情况可能有所不同。

问答坊 | AI 解惑

arm中文培训教材

该培训资料包括: 1.ADS介绍 2.amba总线 3。arm_thumb指令4。arm编程技巧5。arm处理器内核6。arm调试方案 7。arm集成开发环境 8。arm构架 9。arm嵌入式软件开发 10。nucleus介绍 11。OSE介绍 12。带cache内核介绍 13。基于arm的嵌入式开发技术14。性 ...…

查看全部问答>

FPGA入门好书知多少?

各位高手,最近想学一些FPGA方面的相关知识,此前没啥基础,能否推荐一些入门的书籍给我?…

查看全部问答>

带中断的流驱动的重复动态加载卸载后,引起InterruptInitialize失败问题。。

有个驱动, 在DRV_Init 函数中,通过 KernelIoControl 来动态获取系统中断, 同时用 InterruptInitialize绑定系统中断和Event事件。 在 DRV_Deinit 函数中 用 KernelIoControl 释放系统中断。 但是 再次动态加载该驱动时候,提示InterruptIniti ...…

查看全部问答>

求CCD中文资料,我用的使ILX553A

第一次使用CCD啊。搞不懂方向啊。英文看起太恼火了。 求一个中文的这个器件的资料。或者中文的CCD使用教程。谢谢了。。 我的邮箱:272257780@qq.com…

查看全部问答>

请教:调用KernelIoControl重启WINCE后造成死机

#include #define IOCTL_HAL_REBOOT CTL_CODE(FILE_DEVICE_HAL, 15, METHOD_BUFFERED, FILE_ANY_ACCESS) extern \"C\" __declspec(dllimport) BOOL KernelIoControl( DWORD dwIoControlCode, LPVOID lpInBuf, DWORD nInBufSize, LPVOID lpOut ...…

查看全部问答>

求一个arm-linux驱动开发的师傅带带!~~~

我在西安,有没有人在无聊的时候带带我??? msn:tangzichao1984@hotmail.com qq:11826964 不胜感激…

查看全部问答>

请问能不能给滚动条改外观呢?改成自己设计的图片。

RT。 我需要吧滚动条的样式改成商家提供的图片的样式,就是要加入图片到滚动条中。这个要自己写吗? 能否提供一些源码参考呢?…

查看全部问答>

iar下奇怪的断点

                                 iar for arm5.3 ,jlink v8,调试stm32,出现了一个奇怪的现象,某处代码,并没有设置断点,但是运行到那就中断,好 ...…

查看全部问答>

winceUSB摄像头驱动问题

大家好,      在用微软官方提供的CE6.0USB摄像头驱动的时候需要对他进行修改么?我用的摄像头(蓝色妖姬s9红警)是遵从USB视频规范的。 如果需要修改,应该改哪些函数呢?      求高手指导! [ 本帖最 ...…

查看全部问答>

ccs5.3程序编译通过,但是debug不行

debug运行后显示程序已经在运行中,但是并没有在main的开始处暂停 而且在main中加入断点也不经过,不知道这样问题应该怎么解决啊。…

查看全部问答>