zoukankan      html  css  js  c++  java
  • DS12C887实时时钟

    实物图
    2
    引脚定义
    1
    GND、 VCC:直流电源,其中VCC接+5V输入,GND接地,当VCC输入为+5V时,用户可以访问DS12C887内RAM中的数据,并可对其进行读、写操作;当VCC的输入小于+4.25V时,禁止用户对内部RAM进行读、写操作,此时用户不能正确获取芯片内的时间信息;当VCC的输入小于+3V时, DS12C887会自动将电源发换到内部自带的锂电池上。
    MOT:模式选择脚,DA12C887有两种工作模式,即Motorola模式和Intel模式,当MOT接VCC时,选用的工作模式是Motorola模式,当MOT接GND时,选用的是Intel模式。本文主要讨论Intel模式。
    SQW:方波输出脚,当供电电压VCC大于4.25V时,SQW脚可进行方波输出,此时用户可以通过对控制寄存器编程来得到13种方波信号的输出。
    AD0~AD7:复用地址数据总线,该总线采用时分复用技术,在总线周期的前半部分,出现在AD0-AD7上的是地址信息,可用以选通DS12C887内的RAM,总线周期的后半部分出现在AD0-AD7上的数据信息。
    AS:地址选通输入脚,在进行读写操作时,AS的上升沿将AD0-AD7上出现的地址信息锁存到DS12C887上,而下一个下降沿清除AD0-AD7上的地址信息,不论是否有效,DS12C887都将执行该操作。
    DS/RD:数据选择或读输入脚,该引脚有两种工作模式,当MOT接VCC时,选用Motorola工作模式,在这种工作模式中,每个总线周期的后一部分的DS为高电平,被称为数据选通。在读操作中,DS的上升沿使DS12C887将内部数据送往总线AD0-AD7上,以供外部读取。在写操作中,DS的下降沿将使总线 AD0-AD7上的数据锁存在DS12C887中。
    R/W:读/写输入端,该管脚也有2种工作模式,当MOT接VCC时,R/W工作在Motorola模式。此时,该引脚的作用是区分进行的是读操作还是写操作,当R/W为高电平时为读操作,R/W为低电平时为写操作;当MOT接GND时,该脚工作在Intle模式,此时该作为写允许输入。
    CS:片选输入,低电平有效。
    3
    举例

    #define uchar unsigned char
    #define uint unsigned int
    
    sbit dsds = P4 ^ 4;
    sbit dsrw = P4 ^ 2;
    sbit dsas = P4 ^ 5;
    sbit dscs = P2 ^ 0;
    
    //写12C887函数
    void write_ds(uchar addr, uchar date)
    {
       dscs = 0;
       dsas = 1;
       dsds = 1;
       dsrw = 1;
       P0 = addr; //先写地址
       dsas = 0;
       dsrw = 0;
       P0 = addr; //再写数据
       dsrw = 1;
       dsas = 1;
       dscs = 1;
    }
    
    //读12C887函数
    uchar read_ds(uchar addr)
    {
       uchar ds_date;
    
       dsas = 1;
       dsds = 1;
       dsrw = 1;
       dscs = 0;
       P0 = addr; //先写地址
       dsas = 0;
       dsds = 0;
       P0 = 0xff;
       ds_date = P0; //再读数据
       dsds = 1;
       dsas = 1;
       dscs = 1;
    
       return ds_date;
    }
    
    //读取12C887数据
    void read_time(void)
    {
       char hour, minute, second, year, month, date, day;
    
       year = read_ds(9);
       month = read_ds(8);
       date = read_ds(7);
       day = read_ds(6);
       hour = read_ds(4);
       minute = read_ds(2);
       second = read_ds(0);
    }
    
    /*
    	首次操作12C887时,寄存器初始化
    	配置12C887当前时间(20190716-10:54:07)
    	配置12C887闹钟
    */
    void set_time(void)
    {
       write_ds(0, 7);
       write_ds(1, 0);
       write_ds(2, 54);
       write_ds(3, 0);
       write_ds(4, 10);
       write_ds(5, 0);
       write_ds(6, 3);
       write_ds(7, 16);
       write_ds(8, 7);
       write_ds(9, 19);
    }
    
    /*首次上电设置DS12C887时使用,以后不必再调用*/
    void init(void)
    {
       write_ds(0x0A, 0x20); //打开振荡器
       write_ds(0x0B, 0x26); //设置24小时模式,数据二进制格式
       set_time();
    }
    
  • 相关阅读:
    springboot2整合seata(AT模式)
    SpringBoot2整合minio
    Minio安装(docker)、初始密码及界面操作
    elasticsearch mapper创建
    elasticsearch 中文分词
    C++11:20weak_ptr弱引用的智能指针
    C++11:19unique_ptr独占的智能指针
    C++11:18shared_ptr共享的智能指针
    C++11:17可变参数模版和type_traits的综合应用
    C++11:16可变参数模板
  • 原文地址:https://www.cnblogs.com/zhangxuechao/p/11709287.html
Copyright © 2011-2022 走看看