精华内容
下载资源
问答
  • 时钟芯片是时钟一个很重要的部分。时钟芯片大多都是由美国DALAS公司生产的,有着低电流充电的作用,并且低消耗电量。下面我们分享下时钟芯片的接口,时钟芯片DS1302原理
  • 每个程序的运行都需要频率这...RTC 是集成电路,通常称为时钟芯片。  时钟芯片是时钟一个很重要的部分。时钟芯片大多都是由美国DALAS公司生产的,有着低电流充电的作用,并且低消耗电量。时钟芯片能够对年、月、
  • 摘 要:介绍美国DALLAS公司推出的具有涓细电流充电能力的低功耗实时时钟电路DS1302的结构、工作原理及其在实时显示时间中的应用。它可以对年、月、日、周日、时、分、秒进行计时,且具有闰年补偿等多种功能。给出DS...
  • DS3102芯片的具体引脚及功能实现,时序图,电路原理图
  • 基于AT89C52单片机的万年历protel原理图,用DS1302时钟芯片,用数码管显示,包括通信电路,复位电路,矩阵键盘
  • 小编今天跟大家分享一下用proteus7.8做的基于DS1302模块的时钟电路 设计的原理图如下:

    小编今天跟大家分享一下用proteus7.8做的基于DS1302模块的时钟电路
    设计的仿真原理图如下:
    图1
    ds1302.h文件

    #ifndef _DS1302_H_  //定义头文件的固定格式
    #define _DS1302_H_  //定义头文件的固定格式
    
    #include <reg52.h>   //包含51的头文件
    #include <intrins.h>  //包含51的头文件
    
    /*重定义关键字(一个字节)*/
    #ifndef uchar      
    #define uchar unsigned char 
    #endif  
    
    /*重定义关键字(二个字节)*/
    #ifndef uint      
    #define uint unsigned int 
    #endif  
    
    sbit SCLK=P1^0;
    sbit RST=P1^1;
    sbit I_O=P1^2;
    
    //---定义全局函数---//
    void DS1302_Write(uchar addr,uchar dat);
    uchar DS1302_Read(uchar addr);
    void DS1302Init();
    void DS1302ReadTime();
    
    //---加入全局变量--//
    extern uchar TIME[7]; //加入全局变量
    #endif      //定义头文件的固定格式

    ds1302.c文件

    #include "ds1302.h"
    
    /*读写DS1302要先输入控制字(一个字节),用来确定对DS1302的哪个寄存器进行读/写的操作,即先确定地址*/
    /*因此构建寄存器地址控制数组完成上述要求,根据控制字表写出数组*/
    
    /*下面两个即为控制字数组*/
    
    uchar code Read_addr[7]={0x81, 0x83, 0x85, 0x87, 0x89, 0x8b, 0x8d}; //读秒寄存器、分寄存器、小时寄存器、日寄存器、月寄存器、星期寄存器、年寄存器
    uchar code Write_addr[7]={0x80, 0x82, 0x84, 0x86, 0x88, 0x8a, 0x8c};  // 写秒寄存器、分寄存器、小时寄存器、日寄存器、月寄存器、星期寄存器、年寄存器
    
    //---DS1302时钟初始化2020年6月23日星期二14点47分58秒。---//
    //---存储顺序是秒分时日月周年,存储格式是用BCD码---//
    uchar TIME[7] = {0x58,0x47,0x14,0x23,0x06,0x02,0x20};//0x20是2020年,0x02是星期二,0x06是6月,0x23是23日,0x14是24小时制时, 0x47是分,0x58秒 ,相当于一个缓冲数组,中间量
    
    /*******************************************************************************
    * 函 数 名         : WriteByte
    * 函数功能     : 向DS1302写一个字节
    * 输    入         : bytedata
    * 输    出         : 无
    *******************************************************************************/
    void WriteByte(uchar bytedata){
     uchar i=8;  //局部变量,用于循环 
     for(i=8;i>0;i--){
      I_O=bytedata&0x01; //数据从低位开始传送
      bytedata>>=1; 
      SCLK=1;  //SCLK拉高,数据在SCLK上升沿时,DS1302读写数据 ***这里特别注意,下面DS1302_Write在用这个函数之前已经吧SCLK清零了,所以,这里SCLK直接拉高
         // 要注意个子程序中SCLK关联的关系
      _nop_();
      SCLK=0;  //SCLK拉低,接着传
      _nop_();
     }
    }
    
    /*******************************************************************************
    * 函 数 名         : ReadByte
    * 函数功能     : 向DS1302读一个字节
    * 输    入         : 无
    * 输    出         : datareturn
    *******************************************************************************/
    uchar ReadByte(){
     uchar i=8;
     uchar datareturn=0,temp=0;
     for(i=8;i>0;i--){
      temp = I_O;//从最低位开始接收
      datareturn = (datareturn>>1) | (temp<<7);
      SCLK = 1;  //SCLK拉高。配合写地址完后SCLK清零,完成读操作
      _nop_();
      SCLK = 0;//SCLK拉低,接着读的操作
      _nop_(); 
     }
     return datareturn;
    }
    
    /*******************************************************************************
    * 函 数 名         : DS1302_Write
    * 函数功能     : DS1302的写数据函数(先给地址,再给数据),完成单片机向DS1302的写过程
    * 输    入         : addr,dat
    * 输    出         : 无
    *******************************************************************************/
    void DS1302_Write(uchar addr,uchar dat){   //写入的完整2步
     RST=0; //RST先拉低,准备拉高有效
     _nop_();
     SCLK=0;
     _nop_();_nop_();
     RST=1;   // 字节读写时,只有SCLK为低时,才能置片选CS/为高
     _nop_();_nop_();
     WriteByte(addr); //先写地址
     WriteByte(dat);  //再写数据
     SCLK = 0;   //SCLK拉低清RST为0
     _nop_();
     RST = 0;//传送数据结束
     _nop_(); 
    }
    
    /*******************************************************************************
    * 函 数 名         : DS1302_Read
    * 函数功能     : DS1302的读数据函数(给地址),获取地址里的数据,完成单片机向DS1302的读过程
    * 输    入         : addr
    * 输    出         : datareturn
    *******************************************************************************/
    uchar DS1302_Read(uchar addr){ //读的完整2步
     uchar datareturn; 
     RST=0; //RST先拉低,准备拉高有效
     _nop_();
     SCLK=0;
     _nop_();_nop_();
     RST=1;   // 字节读写时,只有SCLK为低时,才能置片选CS/为高
     _nop_();_nop_();
     WriteByte(addr); //先写地址
     _nop_();
     datareturn=ReadByte();
     RST = 0;//传送数据结束
     _nop_();
     SCLK = 1;   //SCLK拉高
     _nop_();
        I_O = 0;   //以下为DS1302复位的稳定时间,必须的。
     _nop_();
     I_O = 1;
     _nop_();
     return datareturn;   
    }
    
    /*******************************************************************************
    * 函 数 名         : DS1302Init
    * 函数功能     : 初始化DS1302.
    * 输    入         : 无
    * 输    出         : 无
    *******************************************************************************/
    void DS1302Init(){
     uchar i;
     DS1302_Write(0x8E,0X00);   //禁止写保护,就是关闭写保护功能
     for (i=0; i<7; i++)//写入7个字节的时钟信号:分秒时日月周年
     {
      DS1302_Write(Write_addr[i],TIME[i]); 
     }
     DS1302_Write(0x8E,0x80);   //打开写保护功能
    }
    
    /*******************************************************************************
    * 函 数 名         : DS1302ReadTime
    * 函数功能     : 读取时钟信息
    * 输    入         : 无
    * 输    出         : 无
    *******************************************************************************/
    void DS1302ReadTime()
    {
     uchar i;
     for (i=0; i<7; i++)//读取7个字节的时钟信号:分秒时日月周年
     {
      TIME[i] = DS1302_Read(Read_addr[i]);
     } 
    }

    main.c

    /*SPI主要应用于E2PROM,FLASH,实时时钟,AD转换器等
    同步串行数据传输
    数据传输是高位在前,低位在后
    
    MOSI 主机输出,从机输入
    MISO 主机输入,从机输出 
    SCLK  时钟信号
    CS/   片选使能
    
    通过管脚模拟SPI的通信方式
    SPI没有应答机制,不能确定是否收到数据
    */
    
    /*DS1302:
    RST/ : 低电平是复位,因此工作时应选高电平,来模拟CS/的作用
    I/O:模拟MOSI、MISO
    控制寄存器:控制命令;控制寄存器的8位作用见数据手册或者普中科技PPT
    控制指令字输入后:下一个SCLK时钟的上升沿时数据被写入DS1302,数据输入从低位开始
    同样在控制指令字后:SCLK脉冲下一个下降沿读出DS1302的数据,数据从低位到高位
    */
    
    //DS1302是通过SPI串行总线与单片机通信的,一次读写至少两个字节
    //第一个字节是控制字,即命令
    //第二个读写是数据
    //但字节读写时,只有SCLK为低时,才能置片选CS/为高
    //I/O传输数据:在SCLK上升沿数据写入DS1302,SCLK下降沿时读取DS1302数据
    
    /*本程序是在数码管上显示时钟*/
    #include <reg52.h>
    #include "ds1302.h"
    
    #define uchar unsigned char
    #define uint unsigned int
    
    sbit LSA=P2^2;   //三八译码器,用作选通数码管
    sbit LSB=P2^3;
    sbit LSC=P2^4;
    
    uchar num=0;
    uchar displaydat[8];  //定义数码管的各位显示数,缓冲区
    uchar code smgduan[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//数码管段选//据,各位数码管具体选的数****数组后面要加“;” 啊啊!!!!
    
    /*******************************************************************************
    * 函 数 名         : delay
    * 函数功能     : 延时函数,i=1时,大约延时10us
    *******************************************************************************/
    void delay(uint x){
     while(x--); 
    }
    
    /*******************************************************************************
    * 函 数 名         : datapros()
    * 函数功能     : 时间读取处理转换函数
    * 输    入         : 无
    * 输    出         : 无
    *******************************************************************************/
    void datapros(){
       DS1302ReadTime();
     displaydat[0] = smgduan[TIME[2]/16];    //时,YIME里面是BCD码16进制格式,显示则要转16进制,因为数码管接收的是16进制数
     displaydat[1] = smgduan[TIME[2]&0x0f];    //14时的BCD16进制为0001 0010(24)24/16=1,然后&0xff得低四位0x0010=4 
     displaydat[2] = 0x40;  //一个"-",后面类似
     displaydat[3] = smgduan[TIME[1]/16];    //分
     displaydat[4] = smgduan[TIME[1]&0x0f]; 
     displaydat[5] = 0x40;
     displaydat[6] = smgduan[TIME[0]/16];    //秒
     displaydat[7] = smgduan[TIME[0]&0x0f];
    }  
    
    /*******************************************************************************
    * 函数名         :display()
    * 函数功能   :数码管显示函数
    * 输入           : 无
    * 输出           : 无
    *******************************************************************************/
    void display(){
     uchar i=0;
     for(i=0;i<8;i++)
     {
      switch(i)  //位选,选择点亮的数码管,
      {
       case(0):
        LSA=0;LSB=0;LSC=0; break;//显示第0位
       case(1):
        LSA=1;LSB=0;LSC=0; break;//显示第1位
       case(2):
        LSA=0;LSB=1;LSC=0; break;//显示第2位
       case(3):
        LSA=1;LSB=1;LSC=0; break;//显示第3位
       case(4):
        LSA=0;LSB=0;LSC=1; break;//显示第4位
       case(5):
        LSA=1;LSB=0;LSC=1; break;//显示第5位
       case(6):
        LSA=0;LSB=1;LSC=1; break;//显示第6位
       case(7):
        LSA=1;LSB=1;LSC=1; break;//显示第7位 
      }
      P0=displaydat[7-i];//发送数据
      delay(100); //间隔一段时间扫描 
      P0=0x00;//消隐
     }  
    }
    
    void main(){
     
     DS1302Init();  //DS1302初始化程序
     while(1){
      
      datapros();  //数据处理函数
      display();   //数码管显示函数
     }
    }
    

    最后,我们来看一下仿真的结果图:
    图2
    **注意:**软件仿真时对时序的要求极高,必须严格按照时序图的要求来

    虽然很简单,但希望对大家有所帮助,嘻嘻!!!

    文章有什么不对的地方请留言,小编及时改正!!!

    展开全文
  • 【蓝桥杯】—{模块}—{DS1302时钟芯片} 1、原理图 2、典型工作电路 3、框图 4、引脚说明 引脚 名称 功能 1 VCC2VCC_2VCC2​ 双电源配置中的主电源引脚。 VCC1连接到备用电源,以在没有主电源的情况下维持...

       九层妖塔 起于垒土
    在这里插入图片描述

    1、原理图:

    在这里插入图片描述

    2、典型工作电路:

    在这里插入图片描述

    3、框图:

    在这里插入图片描述

    4、引脚说明:

    引脚 名称 功能
    1 VCC2VCC_2 双电源配置中的主电源引脚。 VCC1连接到备用电源,以在没有主电源的情况下维持时间和日期。当VCC2大于VCC1 + 0.2V时,VCC2为DS1302供电。 当VCC2小于VCC1时,VCC1为DS1302供电。
    2,3 X1,X2 与标准的32.768kHz石英晶体的连接。 内部振荡器被设计与具有6pF规定负载电容的晶体一起工作。DS1302也可以由一个外部32.768kHz振荡器驱动。 在这种配置中,X1引脚连接到外部振荡器信号,而X2引脚悬空。
    4 GND 电源地
    5 CE 输入。在读取或写入期间,CE信号必须置为高电平。 该引脚内部具有一个40kΩ(典型值)下拉电阻接地。 注意:以前的数据表修订版将CE称为RST。 引脚的功能未更改。
    6 I/O(数据线) 输入/推挽输出。I/O引脚是三线接口的双向数据引脚。 该引脚具有一个内部40kΩ(典型值)下拉电阻接地。
    7 SCLK(串行时钟) 输入。SCLK用于同步串行接口上的数据移动。 该引脚具有一个内部40kΩ(典型值)下拉电阻接地。
    8 VCC1VCC_1 单电源和电池供电系统中的低功率运行以及低功率电池备用。 在使用涓流充电的系统中,可充电电源连接到该引脚。

    5、 振荡电路:

     ●DS1302使用外部32.768kHz晶体。 振荡电路不需要任何外部电阻或电容器即可工作。 表1列出了外部晶振的几个晶振参数。 图1显示了振荡器电路的功能原理图。 如果使用具有指定特性的晶体,则启动时间通常少于一秒。

    6、时钟精度:

     ●时钟的精度取决于晶振的精度以及振荡电路的容性负载与晶振校正的容性负载之间的匹配精度。温度漂移引起的晶体频率漂移会增加额外的误差。耦合到振荡器电路中的外部电路噪声可能导致时钟快速运行。

    7、命令字:

     ●图3显示了命令字。命令字启动每次数据传输。
     ●MSB(位7)必须为逻辑1。如果为0,将禁止对DS1302的写操作。
     ●位6如果为逻辑0,指定时钟/日历数据;如果逻辑1,指定RAM /数据。
     ●位1至位5指定要输入或输出的指定寄存器。
     ●LSB(位0)在逻辑0时为写操作(输入),在逻辑1时为读操作(输出)。
     ●命令字始终从LSB(位0)开始输入(最低有效位)。

    在这里插入图片描述

    8、CE和时钟控制:

     ●将CE输入驱动(变为)为高电平会启动所有数据传输。
     ●CE输入具有两个功能。首先,CE打开控制逻辑,该逻辑允许访问地址/命令序列的移位寄存器。其次,CE信号提供了一种终止单字节或多字节CE数据传输的方法。
     ●一个时钟周期是一系列上升沿后跟下降沿。
     ●对于数据输入,数据必须在时钟的上升沿有效,并且数据位在时钟的下降沿输出。
     ●如果CE输入为低电平,则所有数据传输终止,并且I / O引脚成高阻态
     ●图4显示了数据传输。在上电时,CE必须为逻辑0,直到VCC> 2.0V。
     ●同样,当CE被驱动(变为)为逻辑1状态时,SCLK必须为逻辑0。

    9、数据输入:

     ●在输入写命令字的八个SCLK周期之后,在接下来的八个SCLK周期的上升沿输入数据字节。
    如果其他SCLK周期无意间发生,则将被忽略。 从位0开始输入数据。

    10、数据输出:

     ●在输入读取命令字的八个SCLK周期之后,在接下来的八个SCLK周期的下降沿输出一个数据字节。 注意,要发送的第一个数据位出现在写入命令字节的最后一位之后的第一个下降沿
    只要CE保持为高电平,其他SCLK周期就会无意中重发数据字节。 该操作允许连续突发模式读取功能。
    同样,在SCLK的每个上升沿将I / O引脚设为三态。从位0开始输出数据。

    11、突发模式(脉冲串模式):

     ●可以通过寻址小数点后31位(地址/命令位1至5为逻辑1)为时钟/日历或RAM寄存器指定突发模式。
     ●如前所述,位6指定时钟或RAM,位0指定读取或写入。
     ●时钟/日历寄存器中的位置9到31或RAM寄存器中的位置31没有数据存储容量。
     ●突发模式下的读取或写入从地址0的位0开始。
     ●在突发模式下写入时钟寄存器时,必须写入前八个寄存器,以便传输数据。 但是,在以突发模式写入RAM时,不必为传输数据而全部写入31个字节。不管是否写入所有31个字节,写入的每个字节都将传送到RAM。

    12、时钟/日历:

     ●通过读取适当的寄存器字节可以获得时间和日历信息。表3列出了RTC寄存器。通过写入适当的寄存器字节来设置或初始化时间和日历。
     ●时间和日历寄存器的内容为二进制编码的十进制(BCD)格式
     ●星期几寄存器在午夜增加。对应于星期几的值是用户定义的,但必须是连续的(即,如果1等于星期日,则2等于星期一,依此类推。)。不正确的时间和日期输入会导致未定义的操作。
     ●读写时间和日期寄存器时,辅助(用户)缓冲区用于防止内部寄存器更新时发生错误。读取时间和日期寄存器时,用户缓冲区在CE的上升沿同步到内部寄存器
     ●每当写入秒寄存器时,倒数链就会复位。写传输发生在CE的下降沿。为避免翻转问题,一旦重置倒计时链,则必须在1秒内写入剩余的时间和日期寄存器。
     ●DS1302可以12小时或24小时模式运行。小时寄存器的位7定义为12或24小时模式选择位。为高时,选择12小时模式。在12小时模式下,位5为AM / PM位,逻辑高电平为PM。在24小时模式下,第5位是第二个10小时位(20-23小时)。每当更改12/24位时,必须重新初始化小时数据。

    13、时钟暂停标志:

     ●秒寄存器的第7位定义为时钟暂停(CH)标志。 当该位置1时,时钟振荡器停止工作,DS1302进入低功耗待机模式,电流消耗小于100nA。当该位写入逻辑0时,时钟开始。初始上电状态未定义

    14、写保护位:

     ●控制寄存器的位7是写保护位。
     ●前七个位(位0到6)被强制为0,并且在读取时始终为0。
     ●在对时钟或RAM进行任何写操作之前,位7必须为0。
     ●为高电平时,写保护位可防止对其他任何寄存器的写操作。
     ●初始上电状态未定义。 因此,在尝试写入设备之前,应先清除WP位。

    15、涓流充电寄存器:

    16、 时钟/日历突发模式:

     ●时钟/日历命令字节指定突发模式操作。
     ●在此模式下,可以从地址0的位0开始连续读取或写入前八个时钟/日历寄存器(参见表3)。
     ●如果在指定写时钟/日历突发模式时将写保护位设置为高电平,则八个时钟/日历寄存器(包括控制寄存器)中的任何一个都不会发生数据传输。
     ●涓流充电器在突发模式下不可使用。
     ●在读取时钟脉冲开始时,当前时间将传输到第二组寄存器。从这些辅助寄存器中读取时间信息,而时钟可以继续运行。这样在读取期间更新主寄存器的情况下,无需重新读取寄存器。

    17、RAM:

     ●静态RAM是在RAM地址空间中是可连续寻址的31 x 8字节。

    18、RAM突发模式:

     ●RAM命令字节指定突发模式操作。 在这种模式下,可以从地址0的位0开始连续读取或写入31个RAM寄存器(请参见表3)。

    19、寄存器摘要:

     ●表3给出了寄存器数据格式摘要。
    在这里插入图片描述

    20、晶体选择:

     ●可以通过引脚2和3(X1,X2)将32.768kHz的晶振直接连接到DS1302。
    选择使用的晶振应具有6pF的规定负载电容(CL)。

    21、Figure 4.数据传输摘要:

    在这里插入图片描述

    展开全文
  • 介绍美国DALLAS公司推出的具有涓细电流充电能力的低功耗实时时钟电路DS1302的结构、工作原理及其在实时显示时间中的应用。它可以对年、月、日、周日、时、分、秒进行计时,且具有闰年补偿等多种功能。给出DS1302在...
  • 摘 要:介绍了高精度模数转换器AD7671的工作原理,并在此基础上...由DS1302和超级电容构成的电源备份电路1所示,DS1302的VCC2接主电源,VCC1接超级电容正极。针对不同的电源备份系统,如可充电的镍氢电池、镍镉电池
  • 1、首先讲解一下原理图上开关电路、复位电路、时钟电路; 2、讲解573工作原理, 3、首先点亮一个发光二极管,然后让一个二极管亮灭变化。 4、编写函数证明573的工作原理:锁住后不导通就不能再更新数据。 5、编写...
  • 本液晶万年历功能,具有以下特点: 1、基于STC12C5A60S2(STC12C5A60S2数据手册)单片机,运用DS1302DS1302数据手册)(RTC)和数字化温度传感器18B02可实现(公历年月...电路原理图和pcb:AD09 格式*1 源代码:KEIL4*1
  • 更重要的是,DS1302时钟芯片的加入大大提高了数字钟时间的准确性,而且该电路在断电后不丢失时间和数据信息时也使得该方案的研究与提升更具有开发的意义。 三.核心芯片功能介绍 1.AT89C51 AT89S51[3]美国ATMEL公司...
  • 基于at89s52单片机制作的电子时钟,该程序是结合某一开发板的电路制作的,读者须认清电路原理;只供爱好者参考
  • LCD接口电路原理图 LCD1602 模块化代码在后面 其实1602说白了就是我们向1602传送数据,1602在光标所在的位置把我们的数据全部写出来即可。所以我们只需要关注光标和数据即可。 芯片原理 知识点 其实LCD1602是一个...

    原理图

    主控芯片原理图
    在这里插入图片描述LCD接口电路原理图
    在这里插入图片描述

    LCD1602

    模块化代码在后面
    这一章为了显示LCD1602,我是把LCD1602和DS1302结合到一起写了一个最简单的日期时间显示器
    本来两个模块是放到一起的,但是自己调试模块代码的时候出现了问题,于是发成了两篇文章。bug太难了 😦
    其实1602说白了就是我们向1602传送数据,1602在光标所在的位置把我们的数据全部写出来即可。所以我们只需要关注光标和数据即可。
    芯片原理
    在这里插入图片描述
    知识点
    其实LCD1602是一个很简单的模块,我们只需要知道以下几点即可
    (PS:这些知识均为芯片手册上的内容,如果大家觉得我写的有错,可以自行查阅芯片手册,找不到手册的可以私聊)
    ①:读/写时序
    在这里插入图片描述在这里插入图片描述

    ②操作方法
    在这里插入图片描述③光标映射图
    我们需要了解光标所在的位置
    在这里插入图片描述④指令集
    在这里插入图片描述在这里插入图片描述模块化代码
    注意:我的实物里面DS1302的引脚是引出来的,我把引出来的引脚连到了P10-P12上面

    /*main.c*/
    #include "pbdata.h"
    
    struct sTime bufTime;
    void ShowBcdByte(unsigned char x, unsigned char y, unsigned char bcd);
    void RefreshTimeShow();
    void main()
    {	 //uchar a[4] = {"abcd"};
    	InitLcd1602();
    	InitDS1302();
    	LcdShowStr(2, 0, "20  -  - ");
    	LcdShowStr(4, 1, " : : ");
    	while(1)
    	{
    		GetRealTime(&bufTime);
    		//LcdShowStr(0,0,&bufTime);
    		RefreshTimeShow();
    	}
    }
    
    /* 将一个BCD 码字节显示到屏幕上,(x,y)-屏幕起始坐标,bcd-待显示BCD 码 */
    void ShowBcdByte(unsigned char x, unsigned char y, unsigned char bcd)
    {
    	unsigned char str[4];
    	str[0] = (bcd >> 4) + '0';
    	str[1] = (bcd&0x0F) + '0';
    	str[2] = '\0';
    	LcdShowStr(x, y, str);
    }
    /* 刷新日期时间的显示 */
    void RefreshTimeShow()
    {
    	ShowBcdByte(4, 0, bufTime.year);
    	ShowBcdByte(7, 0, bufTime.mon);
    	ShowBcdByte(10, 0, bufTime.day);
    	ShowBcdByte(4, 1, bufTime.hour);
    	ShowBcdByte(7, 1, bufTime.min);
    	ShowBcdByte(10, 1, bufTime.sec);
    }
    
    /*pbdata.h*/
    #ifndef __PBDATA_H__
    #define __PBDATA_H__
    #define uchar unsigned char
    #define uint unsigned int
    
    #include <reg52.h>
    #include "DS1302.h"
    #include "LCD1602.h"
    
    /*LCD1602*/
    sbit LCD1602_RS = P3^5;	 //RS端
    sbit LCD1602_RW = P3^6;	 //RW端
    sbit LCD1602_E = P3^4;	 //EN端
    
    /*DS1302*/
    sbit DS1302_CE = P1^2;//使能
    sbit DS1302_CK = P1^0;//时钟线
    sbit DS1302_IO = P1^1;//双通信引脚
    
    
    
    #endif
    
    /*LCD1602.h*/
    #ifndef __LCD1602_H__
    #define __LCD1602_H__
    #define LCD1602_DB P0	//LCD1602数据总线
    
    void LcdWaitReady(); //等待液晶准备
    void LcdWriteCmd(unsigned char cmd);//写一个命令
    void LcdWriteDat(unsigned char dat);//写一个数据
    void LcdSetCursor(unsigned char x, unsigned char y);//设置光标起始值
    void LcdShowStr(unsigned char x, unsigned char y, unsigned char *str);//显示字符串
    /*void LcdOpenCursor();//打开光标闪烁
    void LcdCloseCursor();//关闭光标闪烁 
    void LcdAreaClear(unsigned char x, unsigned char y, unsigned char len);//区域清除
    void LcdFullClear(); //整屏清除 
    可以根据需要来确定是否需要这些函数*/
    void LcdAreaClear(unsigned char x, unsigned char y, unsigned char len);//清除从x-y的字
    void LcdFullClear();//全屏清楚
    void InitLcd1602();//初始化
    
    #endif
    
    
    /*LCD1602.c*/
    #include "pbdata.h"
    
    /* 等待液晶准备好 */
    void LcdWaitReady()
    {
    	unsigned char sta;
    	LCD1602_DB = 0xFF;
    	LCD1602_RS = 0;
    	LCD1602_RW = 1;
    	do {
    		LCD1602_E = 1;
    		sta = LCD1602_DB; //读取状态字
    		LCD1602_E = 0;
    	} while (sta & 0x80); //bit7 等于1 表示液晶正忙,重复检测直到其等于0 为止
    }
    /* 向LCD1602 液晶写入一字节命令,cmd-待写入命令值 */
    void LcdWriteCmd(unsigned char cmd)
    {
    	LcdWaitReady();
    	LCD1602_RS = 0;
    	LCD1602_RW = 0;
    	LCD1602_DB = cmd;
    	LCD1602_E = 1;
    	LCD1602_E = 0;
    }
    /* 向LCD1602 液晶写入一字节数据,dat-待写入数据值 */
    void LcdWriteDat(unsigned char dat)
    {
    	LcdWaitReady();
    	LCD1602_RS = 1;
    	LCD1602_RW = 0;
    	LCD1602_DB = dat;
    	LCD1602_E = 1;
    	LCD1602_E = 0;
    }
    /* 设置显示RAM 起始地址,亦即光标位置,(x,y)-对应屏幕上的字符坐标 */
    void LcdSetCursor(unsigned char x, unsigned char y)
    {
    	unsigned char addr;
    	if (y == 0) //由输入的屏幕坐标计算显示RAM 的地址
    		addr = 0x00 + x; //第一行字符地址从0x00 起始
    	else
    		addr = 0x40 + x; //第二行字符地址从0x40 起始
    	LcdWriteCmd(addr | 0x80); //设置RAM 地址
    }
    /* 在液晶上显示字符串,(x,y)-对应屏幕上的起始坐标,str-字符串指针 */
    void LcdShowStr(unsigned char x, unsigned char y, unsigned char *str)
    {
    	LcdSetCursor(x, y); //设置起始地址
    	while (*str != '\0') //连续写入字符串数据,直到检测到结束符
    	{
    		LcdWriteDat(*str++);
    	}
    }
    ///* 打开光标的闪烁效果 */
    //void LcdOpenCursor()
    //{
    //	LcdWriteCmd(0x0F);
    //}
    ///* 关闭光标显示 */
    //void LcdCloseCursor()
    //{
    //	LcdWriteCmd(0x0C);
    //}
    ///* 区域清除,清除从(x,y)坐标起始的len 个字符位 */
    //void LcdAreaClear(unsigned char x, unsigned char y, unsigned char len)
    //{
    //	LcdSetCursor(x, y); //设置起始地址
    //	while (len--) //连续写入空格
    //	{
    //		LcdWriteDat(' ');
    //	}
    //}
    ///* 整屏清除 */
    //void LcdFullClear()
    //{	
    //	LcdWriteCmd(0x01);
    //}
    /* 初始化1602 液晶 */
    void InitLcd1602()
    {
    	LcdWriteCmd(0x38); //16*2 显示,5*7 点阵,8 位数据接口
    	LcdWriteCmd(0x0C); //显示器开,光标关闭
    	LcdWriteCmd(0x06); //文字不动,地址自动+1
    	LcdWriteCmd(0x01); //清屏
    }
    
    /*DS1302.h*/
    #ifndef __DS1302_H__
    #define __DS1302_H__
    
    struct sTime { //日期时间结构体定义
    unsigned int year; //年
    unsigned char mon; //月
    unsigned char day; //日
    unsigned char hour; //时
    unsigned char min; //分
    unsigned char sec; //秒
    unsigned char week; //星期
    };
    
    void DS1302ByteWrite(unsigned char dat);
    unsigned char DS1302ByteRead();
    void DS1302SingleWrite(unsigned char reg, unsigned char dat);
    unsigned char DS1302SingleRead(unsigned char reg);
    void DS1302BurstWrite(unsigned char *dat);
    void DS1302BurstRead(unsigned char *dat);
    void GetRealTime(struct sTime *time);
    void SetRealTime(struct sTime *time);
    void InitDS1302();
    
    
    
    #endif
    
    
    /*DS1302.c*/
    #include "pbdata.h"
    sbit LED1 = P1^4;
    sbit LED2 = P1^5;
    sbit LED3 = P1^6;
    sbit LED4 = P1^7;
    bit flag200ms = 0; //200ms 定时标志
    unsigned char T0RH = 0; //T0 重载值的高字节
    unsigned char T0RL = 0; //T0 重载值的低字节
    
    /* 发送一个字节到DS1302 通信总线上 */
    void DS1302ByteWrite(unsigned char dat)
    {
    	unsigned char mask;
    	for (mask=0x01; mask!=0; mask<<=1) //低位在前,逐位移出,一位一位发数据
    	{								   //也就是0000 0001和dat来比,来做到一位一位发数据
    		if ((mask&dat) != 0) //首先输出该位数据
    			DS1302_IO = 1;
    		else
    			DS1302_IO = 0;
    		DS1302_CK = 1; //然后拉高时钟
    		DS1302_CK = 0; //再拉低时钟,完成一个位的操作
    	}
    	DS1302_IO = 1; //最后确保释放IO 引脚
    }
    /* 由DS1302 通信总线上读取一个字节 */
    unsigned char DS1302ByteRead()
    {
    	unsigned char mask;
    	unsigned char dat = 0;
    	for (mask=0x01; mask!=0; mask<<=1) //低位在前,逐位读取
    	{
    		if (DS1302_IO != 0) //首先读取此时的IO 引脚,并设置dat 中的对应位
    		{
    			dat |= mask;
    		}
    		DS1302_CK = 1; //然后拉高时钟
    		DS1302_CK = 0; //再拉低时钟,完成一个位的操作
    	}
    	return dat; //最后返回读到的字节数据
    }
    /* 用单次写操作向某一寄存器写入一个字节,reg-寄存器地址,dat-待写入字节 */
    void DS1302SingleWrite(unsigned char reg, unsigned char dat)
    {
    	DS1302_CE = 1; //使能片选信号
    	DS1302ByteWrite((reg<<1)|0x80); //发送写寄存器指令
    	DS1302ByteWrite(dat); //写入字节数据
    	DS1302_CE = 0; //除能片选信号
    }
    /* 用单次读操作从某一寄存器读取一个字节,reg-寄存器地址,返回值-读到的字节 */
    unsigned char DS1302SingleRead(unsigned char reg)
    {
    	unsigned char dat;
    	DS1302_CE = 1; //使能片选信号
    	DS1302ByteWrite((reg<<1)|0x81); //发送读寄存器指令
    	dat = DS1302ByteRead(); //读取字节数据DS1302_CE = 0; //除能片选信号
    	return dat;
    }
    /* 用突发模式连续写入8 个寄存器数据,dat-待写入数据指针 */
    void DS1302BurstWrite(unsigned char *dat)
    {
    	unsigned char i;
    	DS1302_CE = 1;
    	DS1302ByteWrite(0xBE); //发送突发写寄存器指令
    	for (i=0; i<8; i++) //连续写入8 字节数据
    	{
    		/*j = dat[i]/10;	 //BCD码转换
    		dat[i] %= 10;	 //BCD码转换
    		dat[i] += j*16; //BCD码转换*/
    		DS1302ByteWrite(dat[i]);
    	}
    	DS1302_CE = 0;
    }
    /* 用突发模式连续读取8 个寄存器的数据,dat-读取数据的接收指针 */
    //注意返回的值是BCD码
    void DS1302BurstRead(unsigned char *dat)
    {
    	unsigned char i;
    	DS1302_CE = 1;
    	DS1302ByteWrite(0xBF); //发送突发读寄存器指令
    	for (i=0; i<8; i++) //连续读取8 个字节
    	{
    		dat[i] = DS1302ByteRead();
    	}
    	DS1302_CE = 0;
    }
    /* 获取实时时间,即读取DS1302 当前时间并转换为时间结构体格式 */
    void GetRealTime(struct sTime *time)
    {
    	unsigned char buf[8];
    	DS1302BurstRead(buf);
    	time->year = buf[6] + 0x2000;
    	time->mon = buf[4];
    	time->day = buf[3];
    	time->hour = buf[2];
    	time->min = buf[1];
    	time->sec = buf[0];
    	time->week = buf[5];
    }/* 设定实时时间,时间结构体格式的设定时间转换为数组并写入DS1302 */
    void SetRealTime(struct sTime *time)
    {
    	unsigned char buf[8];
    	buf[7] = 0;
    	buf[6] = time->year;
    	buf[5] = time->week;
    	buf[4] = time->mon;
    	buf[3] = time->day;
    	buf[2] = time->hour;
    	buf[1] = time->min;
    	buf[0] = time->sec;
    	DS1302BurstWrite(buf);
    }
    /* DS1302 初始化,如发生掉电则重新设置初始时间 */
    void InitDS1302()
    {
    	unsigned char dat;
    	struct sTime code InitTime = { //2020 年6 月 8 日 12:30:00 星期二
    	0x2020,0x06,0x03, 0x14,0x02,0x00, 0x03
    	};
    	DS1302_CE = 0; //初始化DS1302 通信引脚
    	DS1302_CK = 0;
    	dat = DS1302SingleRead(0); //读取秒寄存器
    	DS1302SingleWrite(7, 0x00); //撤销写保护以允许写入数据
    	SetRealTime(&InitTime); //设置DS1302 为默认的初始时间
    }
    /*原来的版本,可以判断是否掉电
    void InitDS1302()
    {
    	unsigned char dat;
    	struct sTime code InitTime[] = { //2020 年6 月2 日 12:30:00 星期二
    	0x2020,0x06,0x02, 0x12,0x30,0x00, 0x02
    	};
    	DS1302_CE = 0; //初始化DS1302 通信引脚
    	DS1302_CK = 0;
    	dat = DS1302SingleRead(0); //读取秒寄存器
    	if ((dat & 0x80) != 0) //由秒寄存器最高位CH 的值判断DS1302 是否已停止
    	{
    		DS1302SingleWrite(7, 0x00); //撤销写保护以允许写入数据
    		SetRealTime(&InitTime); //设置DS1302 为默认的初始时间
    	}
    }*/
    

    具体样例
    在这里插入图片描述

    展开全文
  • DS18B20 DS1302的结构

    2008-11-21 10:32:13
    摘 要:介绍美国DALLAS公司推出的具有涓细电流充电能力的低功耗实时时钟电路DS1302的结构、工作原理及其在实时显示时间中的应用。它可以对年、月、日、周日、时、分、秒进行计时,且具有闰年补偿等多种功能。给出DS...
  • DS1302 中文资料

    2009-06-09 10:57:22
    介绍美国DALLAS公司推出的具有涓细电流充电能力的低功耗实时时钟电路DS1302的结构、工作原理及其在实时显示时间中的应用。它可以对年、月、日、周日、时、分、秒进行计时,且具有闰年补偿等多种功能。给出DS1302在...
  • LCD接口电路原理图 DS1302 DS1302 老样子,如果大家不想看长篇的知识点,可以直接跳到后面看模块化代码 知识点 单片机和人一样,你总要知道现在处于什么时间点,而DS1302就能够告诉你现在的时间 DS1302芯片图和...

    原理图

    新人求赞 😃 谢谢大家

    主控芯片原理图
    在这里插入图片描述

    DS1302
    在这里插入图片描述

    DS1302


    修订:模块化代码里面,InitLcd1602()这一个函数在最开始版本里面,因为原理图的VCC里面是接了电池的,但是我的实物里面是没有接电池的,返回的dat值跟模块化代码不匹配,所以是不需要考虑掉电DS1302是否继续走,所以把那一段代码改了一下,变成了一个直接初始化值的代码,把原来的可以判断是否掉电的代码注释掉了,大家看的时候可以注意一下。


    老样子,如果大家不想看长篇的知识点,可以直接跳到后面看模块化代码
    知识点
    单片机和人一样,你总要知道现在处于什么时间点,而DS1302就能够告诉你现在的时间
    DS1302芯片图和引脚
    在这里插入图片描述在这里插入图片描述BCD码
    为了让单片机中的2进制代码和我们现实生活中的10进制代码能够完美转换,前辈们设计出了BCD码,我的DS1302中的时钟寄存器使用的是最常用的8421码型的BCD码
    BCD码就是用4位2进制数来表示一位十进制数0-9
    比如1001就是表示9,那么10用BCD码转换之后就变成了0001 0000;

    /*BCD码转换代码*/
    /*以把45转化成BCD码为实例*/
    unsigned char data1,data2 = 45;
    data1 = data2/10;	 //BCD码转换
    data2 %= 10;	 //BCD码转换
    data2 += data1*16; //BCD码转换
    

    DS1302控制命令
    DS1302的一条指令是一个字节共8位
    在这里插入图片描述第7位,固定为1,如果这个写成了0,那么写进去的命令也是无效的
    第6位,是选择RAM还是CLOCK,如果是1则要用RAM,如果是0则要用CLOCK
    第5位到第1位,是寄存器的五位地址
    第0位,是读写位,如果是0就是读,如果是1就是写
    5位地址分别是0b00000-0b00111,但是芯片手册里面已经把7 6 0位的值给了出来,所以指令就变成了0x80,0x81这些类别。
    DS1302寄存器
    芯片中寄存器可以说是一个非常重要的东西
    DS1302可以理解成包含时钟日历和控制寄存器,静态RAM寄存器和突发模式配置寄存器

    DS1302
    时钟日历
    控制寄存器8Fh 8Eh
    秒寄存器 81h 80h
    小时寄存器 85h 84h
    日寄存器
    ...
    31字节静态RAM
    工作模式寄存器

    时钟日历寄存器包含在7个读/写寄存器中
    秒寄存器 BIT7定义为时钟暂停标志(CH),当此位置为1,时钟振荡器停止,为0时,开始运行,也就是说如果此位为0,时钟芯片掉电之后,如果还有备用电源仍然可以继续运行。剩下的7位里面,低4位是秒的各位,中高3位是秒的十位
    分钟寄存器 和秒寄存器类似
    小时寄存器 BIT7用于定义DS1302是在12小时模式还是24小时模式,为1时,为12小时,当BIT5为AM/PM位,24小时模式时,此位是小时数据位
    日寄存器 BIT5 BIT4代表十位 BIT3-0代表个位
    周年寄存器 类似,具体可以看下列表格
    控制寄存器 BIT7为写保护位,其他7位均为0.在任何对时钟读写操作之前,BIT7必须为0,当BIT7为1的时候,不允许进行写操作
    举个例子
    如果给时钟发送81,那么就返回秒。发送83返回分,这是正常读取数据的方法。
    在这里插入图片描述31字节静态RAM
    在这里插入图片描述
    突发模式寄存器
    在这里插入图片描述
    在这里插入图片描述
    操作DS1302顺序
    在实际的操作过程中,如果我们一位一位读,那就有可能会出现比如时间在00:59的时候读出应该是00:59,但是一位一位读,在读出59的时候,时钟瞬间进了一位,导致读分的时候读出来是1,也就变成了1:59,也就产生了错误,所以,就有了突发模式这一说法
    突发模式就是把5位地址位全部写1,操作指令变成0XBF,那么8个字节同时会锁存在缓冲区里面,我们读的就是缓冲区的数据,也就没有误差了。
    通信时序
    在这里插入图片描述
    在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述
    模块化代码
    接口就是DS1302.c里面的几个函数

    /*pbdata.h*/
    #ifndef __PBDATA_H__
    #define __PBDATA_H__
    #define uchar unsigned char
    #define uint unsigned int
    
    #include <reg52.h>
    #include "DS1302.h"
    
    /*DS1302*/
    sbit DS1302_CE = P1^2;//使能
    sbit DS1302_CK = P1^0;//时钟线
    sbit DS1302_IO = P1^1;//双通信引脚
    
    #endif
    
    /*DS1302.h*/
    #ifndef __DS1302_H__
    #define __DS1302_H__
    
    struct sTime { //日期时间结构体定义
    unsigned int year; //年
    unsigned char mon; //月
    unsigned char day; //日
    unsigned char hour; //时
    unsigned char min; //分
    unsigned char sec; //秒
    unsigned char week; //星期
    };
    
    void DS1302ByteWrite(unsigned char dat);
    unsigned char DS1302ByteRead();
    void DS1302SingleWrite(unsigned char reg, unsigned char dat);
    unsigned char DS1302SingleRead(unsigned char reg);
    void DS1302BurstWrite(unsigned char *dat);
    void DS1302BurstRead(unsigned char *dat);
    void GetRealTime(struct sTime *time);//得到当前时间
    void SetRealTime(struct sTime *time);//设置当前时间
    void InitDS1302();//初始化DS1302 自己在.c里面修改初始化的时间
    
    #endif
    
    
    /*DS1302.c*/
    #include "pbdata.h"
    
    bit flag200ms = 0; //200ms 定时标志
    unsigned char T0RH = 0; //T0 重载值的高字节
    unsigned char T0RL = 0; //T0 重载值的低字节
    
    /* 发送一个字节到DS1302 通信总线上 */
    void DS1302ByteWrite(unsigned char dat)
    {
    	unsigned char mask;
    	for (mask=0x01; mask!=0; mask<<=1) //低位在前,逐位移出,一位一位发数据
    	{								   //也就是0000 0001和dat来比,来做到一位一位发数据
    		if ((mask&dat) != 0) //首先输出该位数据
    			DS1302_IO = 1;
    		else
    			DS1302_IO = 0;
    		DS1302_CK = 1; //然后拉高时钟
    		DS1302_CK = 0; //再拉低时钟,完成一个位的操作
    	}
    	DS1302_IO = 1; //最后确保释放IO 引脚
    }
    /* 由DS1302 通信总线上读取一个字节 */
    unsigned char DS1302ByteRead()
    {
    	unsigned char mask;
    	unsigned char dat = 0;
    	for (mask=0x01; mask!=0; mask<<=1) //低位在前,逐位读取
    	{
    		if (DS1302_IO != 0) //首先读取此时的IO 引脚,并设置dat 中的对应位
    		{
    			dat |= mask;
    		}
    		DS1302_CK = 1; //然后拉高时钟
    		DS1302_CK = 0; //再拉低时钟,完成一个位的操作
    	}
    	return dat; //最后返回读到的字节数据
    }
    /* 用单次写操作向某一寄存器写入一个字节,reg-寄存器地址,dat-待写入字节 */
    void DS1302SingleWrite(unsigned char reg, unsigned char dat)
    {
    	DS1302_CE = 1; //使能片选信号
    	DS1302ByteWrite((reg<<1)|0x80); //发送写寄存器指令
    	DS1302ByteWrite(dat); //写入字节数据
    	DS1302_CE = 0; //除能片选信号
    }
    /* 用单次读操作从某一寄存器读取一个字节,reg-寄存器地址,返回值-读到的字节 */
    unsigned char DS1302SingleRead(unsigned char reg)
    {
    	unsigned char dat;
    	DS1302_CE = 1; //使能片选信号
    	DS1302ByteWrite((reg<<1)|0x81); //发送读寄存器指令
    	dat = DS1302ByteRead(); //读取字节数据DS1302_CE = 0; //除能片选信号
    	return dat;
    }
    /* 用突发模式连续写入8 个寄存器数据,dat-待写入数据指针 */
    void DS1302BurstWrite(unsigned char *dat)
    {
    	unsigned char i;
    	DS1302_CE = 1;
    	DS1302ByteWrite(0xBE); //发送突发写寄存器指令
    	for (i=0; i<8; i++) //连续写入8 字节数据
    	{
    		DS1302ByteWrite(dat[i]);
    	}
    	DS1302_CE = 0;
    }
    /* 用突发模式连续读取8 个寄存器的数据,dat-读取数据的接收指针 */
    void DS1302BurstRead(unsigned char *dat)
    {
    	unsigned char i;
    	DS1302_CE = 1;
    	DS1302ByteWrite(0xBF); //发送突发读寄存器指令
    	for (i=0; i<8; i++) //连续读取8 个字节
    	{
    		dat[i] = DS1302ByteRead();
    	}
    	DS1302_CE = 0;
    }
    /* 获取实时时间,即读取DS1302 当前时间并转换为时间结构体格式 */
    void GetRealTime(struct sTime *time)
    {
    	unsigned char buf[8];
    	DS1302BurstRead(buf);
    	time->year = buf[6] + 0x2000;
    	time->mon = buf[4];
    	time->day = buf[3];
    	time->hour = buf[2];
    	time->min = buf[1];
    	time->sec = buf[0];
    	time->week = buf[5];
    }/* 设定实时时间,时间结构体格式的设定时间转换为数组并写入DS1302 */
    void SetRealTime(struct sTime *time)
    {
    	unsigned char buf[8];
    	buf[7] = 0;
    	buf[6] = time->year;
    	buf[5] = time->week;
    	buf[4] = time->mon;
    	buf[3] = time->day;
    	buf[2] = time->hour;
    	buf[1] = time->min;
    	buf[0] = time->sec;
    	DS1302BurstWrite(buf);
    }
    /* DS1302 初始化,如发生掉电则重新设置初始时间 */
    void InitDS1302()
    {
    	unsigned char dat;
    	struct sTime code InitTime = { //2020 年6 月 8 日 12:30:00 星期二
    	0x2020,0x06,0x03, 0x14,0x02,0x00, 0x03
    	};
    	DS1302_CE = 0; //初始化DS1302 通信引脚
    	DS1302_CK = 0;
    	dat = DS1302SingleRead(0); //读取秒寄存器
    	DS1302SingleWrite(7, 0x00); //撤销写保护以允许写入数据
    	SetRealTime(&InitTime); //设置DS1302 为默认的初始时间
    }
    /*原来的版本
    void InitDS1302()
    {
    	unsigned char dat;
    	struct sTime code InitTime[] = { //2020 年6 月2 日 12:30:00 星期二
    	0x2020,0x06,0x02, 0x12,0x30,0x00, 0x02
    	};
    	DS1302_CE = 0; //初始化DS1302 通信引脚
    	DS1302_CK = 0;
    	dat = DS1302SingleRead(0); //读取秒寄存器
    	if ((dat & 0x80) != 0) //由秒寄存器最高位CH 的值判断DS1302 是否已停止
    	{
    		DS1302SingleWrite(7, 0x00); //撤销写保护以允许写入数据
    		SetRealTime(&InitTime); //设置DS1302 为默认的初始时间
    	}
    }*/
    
    展开全文
  • 摘 要:介绍了高精度模数转换器AD7671的工作原理,并在此基础上阐述了基于AD7671和TMS320VC5402进行高速高精度数据采集的实现方法,同时给出了硬件电路电路图和相应的调试程序。 关键字:AD7671;高精度;DSP;...
  • DS1302原理部分 1. 芯片引脚 X1,X2:接外部时钟 RST:芯片复位端,0–芯片禁止读写, 1–读写使能。当RST由低到高,启动数据传输。 SCLK:上升沿将数据写入DS1302芯片,下降沿读出数据 I/O:数据的传输,双向串行...
  • 采用AT89S52单片机座位主控器,DS1302时钟芯片,点阵显示 。单路简单,程序可自行编写。
  • DS1302芯片中文资料pdf

    2009-08-19 16:36:02
    美国DALLAS公司推出的具有涓细电流充电能力的低功耗实时时钟电路DS1302的结构、工作原理及其在实时显示时间中的应用。它可以对年、月、日、周日、时、分、秒进行计时,且具有闰年补偿等多种功能。给出DS1302在读写中...
  • nDS1302时钟芯片 n数字温度传感器DS18B20 n光敏器件 n超声波收发模块 nLM386音频功放模块 nLM324放大模块 nNE555信号发生模块 n直流电机接口 n步进电机接口 n8255 IO扩展芯片插座 实物图片展示:
  • 12、有DS1302实时时钟芯片(正宗的能弄到只有拆机的了),外接正品日本KDS 5ppm晶振(这个好不容易找工厂朋友弄到,厂家仪表进行过筛选) 13、母钟的同步子钟/GPS同步时钟/普通时钟,大家可以根据自己的需要,选择...
  • 时钟电路由内部时钟电路外接晶振提供,它是一种高性能、低功耗、带RAM的可随时调整时钟电路,工作电压为3V~5V;所以采用DS1302作为本设计的日历芯片;显示部份使用LCD1602B液晶模块进行数字显示,1602B液晶模块可以...
  • 美国DALLAS公司推出的具有涓细电流充电能的低功耗实时时钟电路DS1302。它可以对年、月、日、周日、时、分、秒进行计时,还具有闰年补偿等多种功能,而且DS1302的使用寿命长,误差小。对于数字电子万年历采用直观的...
  • 实时时钟使用的是DS1302,光敏电阻一颗,靠单片机AD将光转换成数字量,再将数字量靠单片机PMW控制屏幕亮度。其他也没什么了,很基本的电路了,电路图和程序都在附件中。 掌上计算器基本功能介绍: 加减乘除肯定有,支持...
  • DS1302时钟芯片,可以实现日历,时钟等时间功能 ●DS18B20数字温度传感器,可以用来测量外界温度 ●红外接收和发射管,可以进行红外遥控方面的实验 ●蜂鸣器,可以用做声音的编程练习 配套注解详细的C语言程序,...
  • 本设计由STC89C52单片机核心电路+DS1302时钟电路+5V电机调速控制电路+霍尔测速电路+蜂鸣器报警电路+按键电路+LCD1602液晶显示电路+电源电路组成。 1、通过时钟芯片DS1302获取时间。 2、LCD1602可以显示当前的速度,...
  • 仿了个12864大数字时钟12c887,板子和12864一样大,4个固定孔。 该数字时钟以STC89C52RC为主控芯片,通过DS12CR887时钟芯片和DS18B20温度传感器在12864上实现日期、星期、时间、农历、温度等的显示。...原理图:
  • 这个电路还可以加个DS1302之类的时钟模块,做一个以8421码表示时间的钟,用4颗LED表示小时,分别是8,4,2,1,亮的灯加起来就是当前的小时。然后再用6颗LED表示分钟,分别是32,16,8,4,2,1,同理加起来就是当前的分钟~...

空空如也

空空如也

1 2 3 4
收藏数 74
精华内容 29
关键字:

ds1302时钟电路原理图