zoukankan      html  css  js  c++  java
  • DS1302时钟

    采用串行数据传送方式,SPI 3线接口

    SPI总线
    SPI接口是以主从方式工作的,通常有一个主器件和一个或多个从器件
    这里写图片描述

    MOSI – 主器件数据输出,从器件数据输入
    MISO – 主器件数据输入,从器件数据输出
    SCLK – 时钟信号,由主器件产生
    CS – 从器件使能信号,由主器件控制

    SPI接口的一个缺点:没有指定的流控制,没有应答机制确认是否接收到数据

    DS1302
    DS1302有一个控制寄存器、12个日历、时钟寄存器和31个RAM

    时序

    当进行一次读写操作时最少得读写两个字节,第一个字节是控制字节,告诉DS1302是读还是写,或者是对RAM还是对CLOK寄存器操作。第二个字节就是要读或写的数据

    只有在SCLK为低电平时,才能将CE置为高电平。所以在进行操作之前先将SCLK置低电平,然后将CE置为高电平,接着开始在IO上面放入要传送的电平信号,然后跳变SCLK。数据在SCLK上升沿时,DS1302读写数据,在SCLK下降沿时,DS1302放置数据到IO上

    控制寄存器
    DS1302的RST引脚(图CE)回到高电平后写入的第一个字就为控制命令。格式如下

    控制寄存器

    D7:固定为1
    D6:RAM/CK位。1,片内RAM;0,日历、时钟寄存器选择位
    D5~D1:地址位,用于选择进行读写的日历、时钟寄存器或片内RAM。对日历、时钟寄存器或片内RAM的选择见表
    D0: 读写选择。0,写;1,读

    地址位
    地址位

    日历、时钟寄存器
    日历、时钟寄存器

    数据以BCD码形式
    小时寄存器的D7位为12小时制/24小时制的选择位,当为1时选12小时制,当为0时选24小时制。当12小时制时,D5位为1是上午,D5位为0是下午,D4为小时的十位。当24小时制时,D5、D4位为小时的十位。
    秒寄存器中的CH位为时钟暂停位,当为1时钟暂停,为0时钟开始启动
    写保护寄存器中的WP为写保护位。当WP=1,写保护,当WP=0未写保护。当对日历、时钟寄存器或片内RAM进行写时WP应清零;当对日历、时钟寄存器或片内RAM进行读时WP一般置1
    慢充电寄存器的TCS位为控制慢充电的选择,当它为1010才能使慢充电工作。DS为二极管选择位。DS为01选择一个二极管,DS为10选择二个二极管,DS为11或00充电器被禁止,与TCS无关。RS用于选择连接在VCC2与VCC1之间的电阻,RS为00,充电器被禁止,与TCS无关,电阻选择情况见表

    电阻选择
    电阻选择

    BCD码
    利用了四个位元来储存一个十进制的数码,使二进制和十进制之间的转换得以快捷的进行
    采用BCD码,既可保存数值的精确度,又可免却使电脑作浮点运算时所耗费的时间

    4位二进制码大于1001时,加6

    如:BCD码00001100的二进制码为:00001100+6=00010010

    举例

    sbit DSIO = P3^4;
    sbit RST = P3^5;
    sbit SCLK = P3^6;
    
    //---DS1302写入和读取时分秒的地址命令---//
    //---秒分时日月周年 最低位读写位-------//
    uchar code READ_RTC_ADDR[7] = {0x81, 0x83, 0x85, 0x87, 0x89, 0x8b, 0x8d}; 
    uchar code WRITE_RTC_ADDR[7] = {0x80, 0x82, 0x84, 0x86, 0x88, 0x8a, 0x8c};
    
    //---DS1302时钟初始化2016年5月7日星期六12点00分00秒---//
    //---存储顺序是秒分时日月周年,存储格式是用BCD码---//
    uchar TIME[7] = {0, 0, 0x12, 0x07, 0x05, 0x06, 0x16};
    
    void Ds1302Write(uchar addr, uchar dat)
    {
        uchar n;
        RST = 0;
        _nop_();
    
        SCLK = 0; //先将SCLK置低电平
        _nop_();
        RST = 1; //然后将RST(CE)置高电平
        _nop_();
    
        for (n=0; n<8; n++) //开始传送八位地址命令
        {
            DSIO = addr & 0x01; //数据从低位开始传送
            addr >>= 1;
            SCLK = 1; //数据在上升沿时,DS1302读取数据
            _nop_();
            SCLK = 0;
            _nop_();
        }
        for (n=0; n<8; n++) //写入8位数据
        {
            DSIO = dat & 0x01;
            dat >>= 1;
            SCLK = 1;
            _nop_();
            SCLK = 0;
            _nop_();    
        }   
    
        RST = 0; //传送数据结束
        _nop_();
    }
    
    uchar Ds1302Read(uchar addr)
    {
        uchar n, dat, dat1;
        RST = 0;
        _nop_();
    
        SCLK = 0;
        _nop_();
        RST = 1; 
        _nop_();
    
        for(n=0; n<8; n++)
        {
            DSIO = addr & 0x01;
            addr >>= 1;
            SCLK = 1;
            _nop_();
            SCLK = 0;
            _nop_();
        }
    
        _nop_();
    
        for(n=0; n<8; n++) //读取8位数据
        {
            dat1 = DSIO; //从最低位开始接收
            dat = (dat>>1) | (dat1<<7);
            SCLK = 1;
            _nop_();
            SCLK = 0; //DS1302下降沿时,放置数据
            _nop_();
        }
    
        RST = 0;
        _nop_();    //以下为DS1302复位的稳定时间,必须的
        SCLK = 1;
        _nop_();
        DSIO = 0;
        _nop_();
        DSIO = 1;
        _nop_();
    
        return dat; 
    }
    
    void Ds1302Init()
    {
        uchar n;
        Ds1302Write(0x8E, 0x00);         //禁止写保护,就是关闭写保护功能
        for (n=0; n<7; n++) //写入7个字节的时钟信号:分秒时日月周年
        {
            Ds1302Write(WRITE_RTC_ADDR[n], TIME[n]);    
        }
        Ds1302Write(0x8E, 0x80);         //打开写保护功能
    }
    
    void Ds1302ReadTime()
    {
        uchar n;
        for (n=0; n<7; n++) //读取7个字节的时钟信号:分秒时日月周年
        {
            TIME[n] = Ds1302Read(READ_RTC_ADDR[n]);
        }
    }
  • 相关阅读:
    Double 四舍五入保留小数
    QQ在线人数统计图数据解析
    Errors running builder 'Android Resource Manager' on project 'DeskClock'.
    批处理脚本学习笔记——程序猿版
    BZOJ 1002: [FJOI2007]轮状病毒
    《逆袭大学——传给IT学子的正能量》文件夹
    webservice 开发规范
    webservice面试题
    jdbc连接oracle数据库问题
    jdbc连接 orale 和 mysql 所需要的jar包
  • 原文地址:https://www.cnblogs.com/zhangxuechao/p/11709623.html
Copyright © 2011-2022 走看看