精华内容
下载资源
问答
  • 2021-11-02 23:15:24

    51单片机 1602液晶显示的DS1302实时时钟+Proteus仿真


    • Proteus仿真
      在这里插入图片描述

    实例代码

    /*************** ******************/
    #include <reg52.h>
    #include <intrins.h>
    #include <string.h&g
    更多相关内容
  • DS1302 是 DALLAS (达拉斯)公司推出的涓流充电时钟芯片 内含有一个实时时钟/日历和 31 字节静态 RAM 通过简单的串行接口与单片机进行通信,实时时钟/日历电路提供秒、分、时、日、日期、月、年的信息,每月的天数...
  • 运用51单片机,进行简单编程,通过对数码管端口的控制,实现实时时钟的目的。(此程序需包含一块开发板,一个LED数码管,一个下载器)
  • DS1302 是DALLAS 公司推出的涓流充电时钟芯片内含有一个实时 时钟/日历和31 字节静态RAM 可通过简单的串行接口与单片机进行通信
  • 本论文(设计)采用STC89C52单片机和DS1302实时时钟芯片为主要器件设计的实时时钟系统。能够准确的显示实时时间、日期、星期。通过8位低功耗数码管将时间信息显示出来,数码管由单片机直接驱动,无需其他驱动芯片,...
  • 最新单片机仿真 1602液晶显示的DS1302实时时钟最新单片机仿真 1602液晶显示的DS1302实时时钟最新单片机仿真 1602液晶显示的DS1302实时时钟最新单片机仿真 1602液晶显示的DS1302实时时钟最新单片机仿真 1602液晶显示...
  • DS1302实时时钟

    千次阅读 2021-08-02 19:49:32
    DS1302是一种串行接口的实时时钟,芯片内部具有可编程的日历时钟和31个字节的静态RAM。 2.内部结构 (1)SCLK:串行时钟输入端,控制数据输入与输出。 (2)I/O:双向输入线 (3)CE:使能端,CE为高时允许DS1302...

    1.介绍
    DS1302是一种串行接口的实时时钟,芯片内部具有可编程的日历时钟和31个字节的静态RAM。
    2.内部结构请添加图片描述
    (1)SCLK:串行时钟输入端,控制数据输入与输出。
    (2)I/O:双向输入线
    (3)CE:使能端,CE为高时允许DS1302读写数据,CE端为低时DS1302数据不可读写
    (4)X1与X2:外接32.768的圆形晶振,给时钟芯片提供晶振频率。
    3.时钟日历控制寄存器
    请添加图片描述
    (1)秒寄存器(0X81,0X80): 当CH=1秒位停止关闭。
    (2)小时寄存器(0x85,0x84):当BIT7为1时为12小时制,当BIT7为0时为24小时制。
    (3)控制寄存器(0x8f,0x8e):当WP为1时,不能对Ds1302做任何操作。
    4.DS130231字节的RAM寄存器
    请添加图片描述
    就是断电后仍然存在的数据区域
    5.DS1302的工作模式寄存器
    请添加图片描述
    突发模式就是一次性转输多个字节的的数据到时钟或RAM
    6.DS1320的通信时序
    (1)从最低位开始
    (2)读写数据:都是CE端由低到高,然后前8位,写命令字节,后8位,写数据字节。(上升沿时为写入,下降沿时为读出)
    7.BCD码转换
    (1)解释
    因为我们时间是按一位一位来记录的,例如个位秒,十位秒,个位分…
    所以我们用4位2进制就可以表示0-9的数字,(即8421任意选择加)
    所以8421为 0000 0000,前四位表示10位,后四位表示个位
    (2)BCD转8421码(BCD码)
    例如45这个十进制数,先把十位与个位分开得到4与5,4是属于高四位的所以要再乘与16到高四位,所以45 = 416+5= 69 = 0100 0101
    (3)8421转BCD码
    如69这个8421码,先69/16得到高四位的值为4,再69%16得到低四位的值5,然后4
    10+5=45,就是十进制数。

    #include <reg52.h> 
    #include <intrins.h>
    sbit LA=P2^2;
    sbit LB=P2^3;
    sbit LC=P2^4;
    sbit TSCLK = P3^6;     //时钟线
    sbit TIO = P3^4;       //数据线
    sbit TRST = P3^5;       //CE端,使能
    //以下为显示函数
    unsigned int miao;
    unsigned char smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
    					0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
    void delay2(unsigned int z)    
    {
    	unsigned int x,y;
    	for(x=z;x>0;x--)
    	   for(y=120;y>0;y--);
    }
    void timefrist()
    {
    	EA = 1;
    	ET0 = 1;
    	TR0 = 1;
    	TMOD |= 0x01;
    	TH0 = 0xED;
    	TL0 = 0xFF;
    }
    void DigDisplay(unsigned int h)
    {
    	unsigned int a = h % 60 % 10;
    	unsigned int b = h % 60 / 10;
    	unsigned int c = h / 60 % 10;
    	unsigned int d = h / 60 / 10;
    	static unsigned char wei=0;
    	switch(wei)
    	{
    		case 0: LA=1;LB=1;LC=1;P0 = smgduan[d];break;
    		case 1:	LA=0;LB=1;LC=1;P0 = smgduan[c];break;
    		case 2: LA=1;LB=0;LC=1;P0 = smgduan[b];break;
    		case 3: LA=0;LB=0;LC=1;P0 = smgduan[a];break;
    	}
    	wei++;
    	if(wei==4)
    	{
    		wei = 0;
    	}
    }
    void timer0() interrupt 1
    {
    	 TH0 = 0xED;
    	 TL0 = 0xFF;
    	 DigDisplay(miao);
    }
    //以下为时钟函数
    //写入数据
    unsigned char Write_DS1302_DAT(unsigned char cmd,unsigned char dat)
    {
    	unsigned  char i;
    	TRST = 0;
    	TSCLK = 0;
    	
    	TRST = 1;     //CE端产生上升沿启动读写
    	for(i=0;i<8;i++)
    	{
    		TSCLK = 0;
    		TIO = cmd & 0x01;  //由最低位开始
    		TSCLK = 1;       //产生上升沿,直接写入数据
    		cmd >>= 1;       //数据不断左移,把最低位提上
    	}
    	for(i=0;i<8;i++)
    	{
    		TSCLK = 0;
    		TIO = dat & 0x01;
    		TSCLK = 1;
    		dat >>= 1;
    	}
    	
    }
    //读数据
    char Read_DS1302_DAT(unsigned char cmd)
    {
    	unsigned char i,dat;
    	TRST = 0;
    	TSCLK = 0;
    	TRST = 1;         //CE端拉高,启动读或写
    	for(i=0;i<8;i++)    //写入指命,找位置与功能
    	{
    		TSCLK = 0;
    		TIO = cmd & 0x01;
    		TSCLK = 1;
    		cmd >>= 1;
    	}
    	for(i=0;i<8;i++)  
    	{
    		TSCLK = 0;  //前面TSCLK已经被拉高了,现在拉低,数据读出
    		dat >>= 1;  //数据右移动
    		if(TIO) dat |= 0x80;  //转出数据为高电平,就最高位加一然后不断右移动到最低位
    		TSCLK = 1;  //重新拉高回来
    	}
    	return dat; //返回数据
    }
    //10位变BCD
    unsigned char Dat_Chg_BCD(unsigned char dat)
    {
    	unsigned char dat1,dat2;
    	dat1 = dat /10;
      dat2 = dat % 10;
    	dat2 = dat1*16 + dat2;
      return dat2;	
    }
    //BCD为10位
    unsigned char BCD_Chg_Dat(unsigned char dat)
    {
    	unsigned char dat1,dat2;
    	dat1 = dat / 16;
    	dat2 = dat2 %16;
    	dat2 = dat2 + dat1*10;
    	return dat2;
    }
    void main()
    {
    	unsigned char a,b,c;
    	timefrist();
    	Write_DS1302_DAT(0x8e,0);               //打开0x8e上WE置位为0
    	Write_DS1302_DAT(0x80,Dat_Chg_BCD(10)); //写秒0x80指命,后写入数据
    	Write_DS1302_DAT(0x82,Dat_Chg_BCD(50)); //写秒0x82指命,后写入数据
    	Write_DS1302_DAT(0x84,Dat_Chg_BCD(11)); //写秒0x84指命,后写入数据
    	Write_DS1302_DAT(0x8e,0x80);         //打开0x8e上WE置位为1,不可读写
    	while(1)
    	{
    		Write_DS1302_DAT(0x8e,0); //打开0x8e上WE置位为0
    		a = BCD_Chg_Dat(Read_DS1302_DAT(0x81));//读取指命0x81,时间秒
    		b = BCD_Chg_Dat(Read_DS1302_DAT(0x83));//读取指命0x83,时间秒
    		c = BCD_Chg_Dat(Read_DS1302_DAT(0x85));//读取指命0x85,时间秒
    		Write_DS1302_DAT(0x8e,0x80); 打开0x8e上WE置位为1,不可读写
    		miao = a + b*60;  //这里只用到了秒与分,全部化为秒后给全局变量
    		delay2(1000);
    	}
    }
    
    展开全文
  • 单片机C语言程序设计 1602液晶显示的DS1302实时时钟(有源码)单片机C语言程序设计 1602液晶显示的DS1302实时时钟(有源码)单片机C语言程序设计 1602液晶显示的DS1302实时时钟(有源码)单片机C语言程序设计 1602液晶...
  • 51单片机Proteus仿真实例 1602液晶显示DS1302实时时钟51单片机Proteus仿真实例 1602液晶显示DS1302实时时钟51单片机Proteus仿真实例 1602液晶显示DS1302实时时钟51单片机Proteus仿真实例 1602液晶显示DS1302实时时钟...
  • ds1302实时时钟

    2019-02-21 13:51:20
    基于单片机ds1302模块的实时时钟程序设计,保证无误且实用
  • DS1302是由美国DALLAS公司推出的具有涓细电流充电能力的低功耗实时时钟芯片。它可以对年、月、日、周、时、分、秒进行计时,且具有闰年补偿等多种功能。
  • C51单片机 项目6-实时时钟芯片DS1302 (仿真文件+程序包)C51单片机 项目6-实时时钟芯片DS1302 (仿真文件+程序包)C51单片机 项目6-实时时钟芯片DS1302 (仿真文件+程序包)C51单片机 项目6-实时时钟芯片DS1302 ...
  • 单片机C语言程序设计13 1602液晶显示的DS1302实时时钟(基于8051+Proteus仿真)单片机C语言程序设计13 1602液晶显示的DS1302实时时钟(基于8051+Proteus仿真)单片机C语言程序设计13 1602液晶显示的DS1302实时时钟...
  • 基于STM32F407的实时时钟程序,采用DS1302实时时钟模块和TM1637四位数码管,可用通过按键修改时间。已编写DS1302和TM1637模块的驱动程序,移植直接在宏定义中修改接口即可。 STM32F103程序另见主页。
  • 基于stm8S系列单片机和ds1302,实现万年历功能
  • 基于STM32F103的实时时钟程序,采用DS1302实时时钟模块和TM1637四位数码管,可用通过按键修改时间。已编写DS1302和TM1637模块的驱动程序,移植直接在宏定义中修改接口即可。 STM32F407程序另见主页。
  • DS1302实时时钟,LCD1602显示,可调时间
  • 本小节介绍的实时时钟芯片是DS1302,它是一款具有涓细(细小)电流充电能力的低功耗实时时钟芯片,它可以对年、月、日、周、时、分、秒进行计时,且具有闰年补偿等多种功能。DS1302采用串行数据传输,可为掉电保护电源...

    4.7 DS1302 实时时钟芯片

    4.7.1 原理图介绍

    图4-7-1 

    图4-7-2

    驱动DS1302之前,实验板上需要将JP595跳线帽和J11跳线帽断开。JP1302跳线帽接上。

    4.7.2 DS1302时钟芯片介绍

    现在流行的串行实时时钟(RTC)芯片很多,如DS1302、 DS1307、PCF8485等。这些芯片接口简单、价格低廉、使用方便,被广泛地采用。

    本小节介绍的实时时钟芯片是DS1302 ,它是一款具有涓细(细小)电流充电能力的低功耗实时时钟芯片,它可以对年、月、日、周、时、分、秒进行计时,且具有闰年补偿等多种功能。DS1302采用串行数据传输,可为掉电保护电源提供可编程的充电功能,并且可以关闭充电功能,晶振采用32.768kHz。

    DS1302与单片机通信仅需3根线:(1) RST(复位),(2) I/O(数据线)和 (3) SCLK(串行时钟);数据可以每次一个字节的单字节形式或多达 31 字节的多字节形式传输。

    图4-7-3 DS1302内部框图

    图4-7-4 管脚功能说明

    4.7.3 时序图介绍

    (1). 读数据时序

    图4-7-5

    上面的时序图是从DS1302寄存器读取数据的时序图,读取数据之前,需要先设置读取数据的寄存器地址,再接收DS1302返回的数据。

    从时序图里得知,开始传输数据之前,RST保持低电平,时钟线保持低电平,开始传输数据时,RST保持高电平。数据是先从低位开始传输,在上升沿改变数据,在下降沿保持数据稳定,数据传输完毕之后RST保持低电平。  

    示例代码:

    /*
    函数功能: 从DS1302指定寄存器里读取一个字节数据
    */
    u8 DS1302_ReadByte(u8 addr)
    {
        u8 n=0,dat=0;
        DS1302_RST=1;   //然后将DS1302_RST(CE)置高电平。
        /*1. 设置读取的地址*/
        for(n=0;n<8;n++)
        {
            DS1302_IO=addr&0x01;//数据从低位开始传送
            addr>>=1;
            DS1302_SCLK=1;//数据在上升沿时,DS1302读取数据
            DS1302_SCLK=0;//DS1302下降沿时,放置数据
        }
        /*2. 读取数据*/
        for(n=0;n<8;n++)
        {
            dat>>=1;
            if(DS1302_IO)dat|=0x80;
            DS1302_SCLK=1;
            DS1302_SCLK=0;//DS1302下降沿时,放置数据
        }
        DS1302_RST=0;
        //必须的操作,复位时间
        DS1302_IO=0;
        DS1302_IO=1;
    return dat; 
    }

    (2). 写数据时序

    图4-7-6

    上面的时序图是向DS1302寄存器写入数据的时序图,写入数据之前,需要先设置写入数据的寄存器地址,再写入实际的数据。

    从时序图里得知,开始传输数据之前,RST保持低电平,时钟线保持低电平,开始传输数据时,RST保持高电平。数据是先从低位开始传输,在上升沿改变数据,在下降沿保持数据稳定,数据传输完毕之后RST保持低电平。  

    示例代码:

    /*
    函数功能: 向DS1302指定寄存器里写一个字节数据
    */
    void DS1302_WriteByte(u8 addr,u8 dat)
    {
        u8 n;
        DS1302_RST=1; //然后将DS1302_RST(CE)置高电平。
        /*1. 设置写入的地址*/
        for(n=0;n<8;n++)
        {
            DS1302_IO=addr&0x01;//数据从低位开始传送
            addr>>=1;
            DS1302_SCLK=1;//数据在上升沿时,DS1302读取数据
            DS1302_SCLK=0;
        }
        
        /*2. 写入数据*/
        for(n=0;n<8;n++)
        {
            DS1302_IO=dat&0x01;
            dat>>=1;
            DS1302_SCLK=1;//数据在上升沿时,DS1302读取数据
            DS1302_SCLK=0;
        }   
        DS1302_RST=0;//传送数据结束
    }

    (3). 单字节读写顺序图

    图4-7-7

    4.7.4 寄存器定义

    图4-7-8

    寄存器的最低位是读写控制位,0是写,1是读。

    寄存器里的数据是BCD码格式,得到十进制可以进行分离:data>>4分离出十位,data&0x0F得到个位。

    秒寄存器说明:

    秒寄存器的位7定义为时钟暂停位。当此位设置为逻辑1时, 时钟振荡器停止,DS1302被置入低功率的备份方式, 其电源消耗小于 100 纳安(nanoamp)。 当把此位写成逻辑 0 时, 时钟将启动。

    控制寄存器说明:

    写保护寄存器的位7是写保护位。 开始 7 位(位 0-6) 置为零, 在读操作时总是读出零。 在对时钟或RAM 进行写操作之前, 位 7 必须为零。 当它为高电平时, 写保护位禁止对任何其它寄存器进行写操作。

    小时寄存器说明:

    小时寄存器的位 7 定义为 12 或 24 小时方式选择位。 当它为高电平时, 选择 12 小时方式, 在 12 小时方式下, 位 5 是 AM/PM 位, 此位为逻辑高电平表示 PM。在 24 小时方式下, 位 5 是第 2 个 10 小时位(20-23时)。

    上面寄存器地址,转换成16进制的地址如下:

    控制寄存器(写保护)()0x8E

    年寄存器地址:  ()0x8c  ()0x8c|0x01

    月寄存器地址:  ()0x88  ()0x88|0x01

    日寄存器地址:  ()0x86  ()0x86|0x01

    时寄存器地址:  ()0x84  ()0x84|0x01

    分寄存器地址:  ()0x82  ()0x82|0x01

    秒寄存器地址:  ()0x80  ()0x80|0x01

    星期寄存器地址:()0x8a  ()0x8a|0x01

    4.7.5 寄存器详细功能介绍

    图4-7-9 寄存器简图

    寄存器 0:最高位 CH 是一个时钟停止标志位。如果时钟电路有备用电源,上电后,可以先检测一下这一位,如果这一位是 0,那说明时钟芯片在系统掉电后,由于备用电源的供给,时钟是持续正常运行的;如果这一位是 1,那么说明时钟芯片在系统掉电后,时钟部分不工作了。如果 Vcc1 悬空或者是电池没电了,当下次重新上电时,读取这一位,那这一位就是 1,可以通过这一位判断时钟在单片机系统掉电后是否还正常运行。剩下的7 位高 3 位是秒的十位,低 4 位是秒的个位,DS1302 内部是 BCD 码,而秒的十位最大是 5。

    寄存器 1:最高位未使用,剩下的7位中高3位是分钟的十位,低 4 位是分钟的个位。

    寄存器 2:bit7 是1代表是 12 小时制,0 代表是 24 小时制;bit6 固定是 0,bit5 在12 小时制下 0 代表的是上午,1 代表的是下午,在 24 小时制下和 bit4 一起代表了小时的十位,低 4 位代表的是小时的个位。

    寄存器 3:高 2 位固定是 0,bit5 和 bit4 是日期的十位,低 4 位是日期的个位。

    寄存器 4:高 3 位固定是 0,bit4 是月的十位,低 4 位是月的个位。

    寄存器 5:高 5 位固定是 0,低 3 位代表了星期。(1~7)

    寄存器 6:高 4 位代表了年的十位,低 4 位代表了年的个位。 00~99 指的是 2000 年~2099 年。

    寄存器 7: 最高位一个写保护位,如果这一位是 1,那么是禁止给任何其它寄存器或者那 31 个字节的 RAM 写数据的。因此在写数据之前,这一位必须先写成 0。

    4.7.6  BCD码转十进制

    BCD码是用4位二进制数来表示1位十进制数中的0~9这10个数码,是一种二进制的数字编码形式,用二进制编码的十进制代码。BCD码这种编码形式利用了四个位元来储存一个十进制的数码,使二进制和十进制之间的转换变得方便。

    示例代码:

    /*函数功能: 将十进制数据转为BCD码*/
    u8 DEC_TO_BCD(u8 val)
    {
        return ((val/10)<<4)+val%10;
    }
    /*函数功能: 将BCD码数据转为十进制格式*/
    u8 BCD_TO_DEC(u8 val)
    {
    return (val&0x0f)+(val>>4)*10;
    }

    4.7.7 DS1302示例代码

    下面代码里实现DS1302的寄存器读写,时间的设置与读取,在主函数里判断了之前DS1302是否正常工作,如果DS1302处于停止计时状态,就重新设置时间,在循环代码里,每1秒钟,向串口打印读取的时间。

    (硬件平台说明:CPU是STC90C516RD 、晶振频率12MHZ 、工作在12T模式下、一个机器周期为1us时间)

    示例代码:

    #include <reg51.h>
    //定义ds1302使用的IO口
    sbit DS1302_IO=P3^4;
    sbit DS1302_RST=P3^5;
    sbit DS1302_SCLK=P3^6;
    
    u8 DS1302_TIME[7]; //存放读取的时间
    
    /*
    函数功能: 将十进制数据转为BCD码
    */
    u8 DEC_TO_BCD(u8 val)
    {
        return ((val/10)<<4)+val%10;
    }
    
    /*
    函数功能: 将BCD码数据转为十进制格式
    */
    u8 BCD_TO_DEC(u8 val)
    {
        return (val&0x0f)+(val>>4)*10;
    }
    
    void DS1302_Init(void)
    {
       DS1302_RST=0;
       DS1302_SCLK=0;//先将DS1302_SCLK置低电平。
    }
    
    /*
    函数功能: 向DS1302指定寄存器里写一个字节数据
    */
    void DS1302_WriteByte(u8 addr,u8 dat)
    {
        u8 n;
        DS1302_RST=1; //然后将DS1302_RST(CE)置高电平。
        /*1. 设置写入的地址*/
        for(n=0;n<8;n++)
        {
            DS1302_IO=addr&0x01;//数据从低位开始传送
            addr>>=1;
            DS1302_SCLK=1;//数据在上升沿时,DS1302读取数据
            DS1302_SCLK=0;
        }
        
        /*2. 写入数据*/
        for(n=0;n<8;n++)
        {
            DS1302_IO=dat&0x01;
            dat>>=1;
            DS1302_SCLK=1;//数据在上升沿时,DS1302读取数据
            DS1302_SCLK=0;
        }   
        DS1302_RST=0;//传送数据结束
    }
    
    /*
    函数功能: 从DS1302指定寄存器里读取一个字节数据
    */
    u8 DS1302_ReadByte(u8 addr)
    {
        u8 n=0,dat=0;
        DS1302_RST=1;   //然后将DS1302_RST(CE)置高电平。
        /*1. 设置读取的地址*/
        for(n=0;n<8;n++)
        {
            DS1302_IO=addr&0x01;//数据从低位开始传送
            addr>>=1;
            DS1302_SCLK=1;//数据在上升沿时,DS1302读取数据
            DS1302_SCLK=0;//DS1302下降沿时,放置数据
        }
        /*2. 读取数据*/
        for(n=0;n<8;n++)
        {
            dat>>=1;
            if(DS1302_IO)dat|=0x80;
            DS1302_SCLK=1;
            DS1302_SCLK=0;//DS1302下降沿时,放置数据
        }
        DS1302_RST=0;
        //必须的操作,复位时间
        DS1302_IO=0;
        DS1302_IO=1;
        return dat; 
    }
    
    /*
    函数功能: 设置DS1302芯片的时间
    DS1302的时间基准是从2000年开始的,设置年份时要减去2000再传入设置
    例如:DS1302_WriteTime(20,1,18,14,46,20,6);
    */
    void DS1302_WriteTime(u8 year,u8 mon,u8 mday,u8 hour,u8 min,u8 sec,u8 week)
    {
        DS1302_WriteByte(0x8E,0x00); //禁止写保护,就是关闭写保护功能  
        DS1302_WriteByte(0x8c,DEC_TO_BCD(year)); //设置年  
        DS1302_WriteByte(0x88,DEC_TO_BCD(mon));  //设置月  
        DS1302_WriteByte(0x86,DEC_TO_BCD(mday)); //设置日  
        DS1302_WriteByte(0x84,DEC_TO_BCD(hour)); //设置时  
        DS1302_WriteByte(0x82,DEC_TO_BCD(min));  //设置分  
        DS1302_WriteByte(0x80,DEC_TO_BCD(sec));  //设置秒  
        DS1302_WriteByte(0x8a,DEC_TO_BCD(week)); //设置星期 
        DS1302_WriteByte(0x8E,0x80);             //打开写保护功能
    }
    
    /*
    函数功能: 读取DS1302时钟的时间
    DS1302寄存器的最低位是读写位,0是写,1是读
    */
    void DS1302_ReadTime(void)
    {
        DS1302_TIME[0]=BCD_TO_DEC(DS1302_ReadByte(0x8c|0x01));//读取年
        DS1302_TIME[1]=BCD_TO_DEC(DS1302_ReadByte(0x88|0x01));//读取月
        DS1302_TIME[2]=BCD_TO_DEC(DS1302_ReadByte(0x86|0x01));//读取日 
        DS1302_TIME[3]=BCD_TO_DEC(DS1302_ReadByte(0x84|0x01));//读取时
        DS1302_TIME[4]=BCD_TO_DEC(DS1302_ReadByte(0x82|0x01));//读取分 
        DS1302_TIME[5]=BCD_TO_DEC(DS1302_ReadByte(0x80|0x01));//读取秒 
        DS1302_TIME[6]=BCD_TO_DEC(DS1302_ReadByte(0x8a|0x01));//读取星期
    }
    
    int main()
    {
        u8 stat;
        UART_Init();        //初始化串口波特率为4800
        DS1302_Init();
        stat=DS1302_ReadByte(0x80|0x01);//读取秒
        if(stat&0x80)
        {
            DS1302_WriteTime(2020-2000,1,18,16,33,33,6);
        }
        else
        {
            printf("DS1302 OK\r\n");
        }
        while(1)
        {
            DS1302_ReadTime();
            printf("DS1302:%d-%d-%d %d:%d:%d %d\r\n",
            (int)DS1302_TIME[0]+2000,
            (int)DS1302_TIME[1],
            (int)DS1302_TIME[2],
            (int)DS1302_TIME[3],
            (int)DS1302_TIME[4],
            (int)DS1302_TIME[5],
            (int)DS1302_TIME[6]
            );     
            DelayMs(1000);
        }
    }

    图4-7-10 

    展开全文
  • C51---10 DS1302实时时钟

    2022-03-17 21:53:25
    C51---10 DS1302实时时钟DS1302介绍引脚定义和应用电路内部结构框图寄存器定义时序定义BCD码 DS1302介绍 DS1302是由美国DALLAS公司推出的具有涓细电流充电能力的低功耗实时时钟芯片。它可以对年、月、日、周、时、...

    DS1302介绍✨

    • DS1302是由美国DALLAS公司推出的具有涓细电流充电能力的低功耗实时时钟芯片。它可以对年、月、日、周、时、分、秒进行计时,且具有闰年补偿等多种功能
    • RTC(Real Time Clock):
      实时时钟,是一种集成电路,通常称为时钟芯片
      在这里插入图片描述

    引脚定义和应用电路

    在这里插入图片描述

    内部结构框图

    在这里插入图片描述

    寄存器定义

    在这里插入图片描述

    时序定义

    在这里插入图片描述

    BCD码

    在这里插入图片描述

    DS1302时钟🎉

    代码

    main.c

    #include <REGX52.H>
    #include "LCD1602.h"
    #include "DS1302.h"
    
    void main()
    {
    	LCD_Init();
    	DS1302_Init();
    	LCD_ShowString(1,1,"  -  -  ");//静态字符初始化显示
    	LCD_ShowString(2,1,"  :  :  ");
    	
    	DS1302_SetTime();//设置时间
    	
    	while(1)
    	{
    		DS1302_ReadTime();//读取时间
    		LCD_ShowNum(1,1,DS1302_Time[0],2);//显示年
    		LCD_ShowNum(1,4,DS1302_Time[1],2);//显示月
    		LCD_ShowNum(1,7,DS1302_Time[2],2);//显示日
    		LCD_ShowNum(2,1,DS1302_Time[3],2);//显示时
    		LCD_ShowNum(2,4,DS1302_Time[4],2);//显示分
    		LCD_ShowNum(2,7,DS1302_Time[5],2);//显示秒
    	}
    }
    
    
    

    DS1302.c

    #include <REGX52.H>
    
    //引脚定义
    sbit DS1302_SCLK=P3^6;
    sbit DS1302_IO=P3^4;
    sbit DS1302_CE=P3^5;
      
    //寄存器写入地址/指令定义
    #define DS1302_SECOND		0x80
    #define DS1302_MINUTE		0x82
    #define DS1302_HOUR			0x84
    #define DS1302_DATE			0x86
    #define DS1302_MONTH		0x88
    #define DS1302_DAY			0x8A
    #define DS1302_YEAR			0x8C
    #define DS1302_WP			0x8E
    
    //时间数组,索引0~6分别为年、月、日、时、分、秒、星期
    unsigned char DS1302_Time[]={22,3,18,12,59,50,5};
    
    /**
      * @brief  DS1302初始化
      * @param  无
      * @retval 无
      */
    void DS1302_Init(void)
    {
    	DS1302_CE=0;
    	DS1302_SCLK=0;
    }
    
    /**
      * @brief  DS1302写一个字节
      * @param  Command 命令字/地址
      * @param  Data 要写入的数据
      * @retval 无
      */
    void DS1302_WriteByte(unsigned char Command,Data)
    {
    	unsigned char i;
    	DS1302_CE=1;
    	for(i=0;i<8;i++)
    	{
    		DS1302_IO=Command&(0x01<<i);
    		DS1302_SCLK=1;
    		DS1302_SCLK=0;
    	}
    	for(i=0;i<8;i++)
    	{
    		DS1302_IO=Data&(0x01<<i);
    		DS1302_SCLK=1;
    		DS1302_SCLK=0;
    	}
    	DS1302_CE=0;
    }
    
    /**
      * @brief  DS1302读一个字节
      * @param  Command 命令字/地址
      * @retval 读出的数据
      */
    unsigned char DS1302_ReadByte(unsigned char Command)
    {
    	unsigned char i,Data=0x00;
    	Command|=0x01;	//将指令转换为读指令
    	DS1302_CE=1;
    	for(i=0;i<8;i++)
    	{
    		DS1302_IO=Command&(0x01<<i);
    		DS1302_SCLK=0;
    		DS1302_SCLK=1;
    	}
    	for(i=0;i<8;i++)
    	{
    		DS1302_SCLK=1;
    		DS1302_SCLK=0;
    		if(DS1302_IO){Data|=(0x01<<i);}
    	}
    	DS1302_CE=0;
    	DS1302_IO=0;	//读取后将IO设置为0,否则读出的数据会出错
    	return Data;
    }
    
    /**
      * @brief  DS1302设置时间,调用之后,DS1302_Time数组的数字会被设置到DS1302中
      * @param  无
      * @retval 无
      */
    void DS1302_SetTime(void)
    {
    	DS1302_WriteByte(DS1302_WP,0x00);
    	DS1302_WriteByte(DS1302_YEAR,DS1302_Time[0]/10*16+DS1302_Time[0]%10);//十进制转BCD码后写入
    	DS1302_WriteByte(DS1302_MONTH,DS1302_Time[1]/10*16+DS1302_Time[1]%10);
    	DS1302_WriteByte(DS1302_DATE,DS1302_Time[2]/10*16+DS1302_Time[2]%10);
    	DS1302_WriteByte(DS1302_HOUR,DS1302_Time[3]/10*16+DS1302_Time[3]%10);
    	DS1302_WriteByte(DS1302_MINUTE,DS1302_Time[4]/10*16+DS1302_Time[4]%10);
    	DS1302_WriteByte(DS1302_SECOND,DS1302_Time[5]/10*16+DS1302_Time[5]%10);
    	DS1302_WriteByte(DS1302_DAY,DS1302_Time[6]/10*16+DS1302_Time[6]%10);
    	DS1302_WriteByte(DS1302_WP,0x80);
    }
    
    /**
      * @brief  DS1302读取时间,调用之后,DS1302中的数据会被读取到DS1302_Time数组中
      * @param  无
      * @retval 无
      */
    void DS1302_ReadTime(void)
    {
    	unsigned char Temp;
    	Temp=DS1302_ReadByte(DS1302_YEAR);
    	DS1302_Time[0]=Temp/16*10+Temp%16;//BCD码转十进制后读取
    	Temp=DS1302_ReadByte(DS1302_MONTH);
    	DS1302_Time[1]=Temp/16*10+Temp%16;
    	Temp=DS1302_ReadByte(DS1302_DATE);
    	DS1302_Time[2]=Temp/16*10+Temp%16;
    	Temp=DS1302_ReadByte(DS1302_HOUR);
    	DS1302_Time[3]=Temp/16*10+Temp%16;
    	Temp=DS1302_ReadByte(DS1302_MINUTE);
    	DS1302_Time[4]=Temp/16*10+Temp%16;
    	Temp=DS1302_ReadByte(DS1302_SECOND);
    	DS1302_Time[5]=Temp/16*10+Temp%16;
    	Temp=DS1302_ReadByte(DS1302_DAY);
    	DS1302_Time[6]=Temp/16*10+Temp%16;
    }
    
    

    DS1302.h

    #ifndef __DS1302_H__
    #define __DS1302_H__
    
    //外部可调用时间数组,索引0~6分别为年、月、日、时、分、秒、星期
    extern unsigned char DS1302_Time[];
    
    void DS1302_Init(void);
    void DS1302_WriteByte(unsigned char Command,Data);
    unsigned char DS1302_ReadByte(unsigned char Command);
    void DS1302_SetTime(void);
    void DS1302_ReadTime(void);
    
    #endif
    
    

    实验结果

    在这里插入图片描述


    DS1302可调时钟🐱‍🏍

    简介

    模式选择功能
    模式0 在LCD上显示年月日时分秒
    模式1 设置LCD上的年月日时分秒
    驱动代码与定时时钟 难点在于代码逻辑和判断

    代码

    main.c

    #include <REGX52.H>
    #include "LCD1602.h"
    #include "DS1302.h"
    #include "Key.h"
    #include "Timer0.h"
    
    unsigned char KeyNum,MODE,TimeSetSelect,TimeSetFlashFlag;
    
    void TimeShow(void)//时间显示功能
    {
    	DS1302_ReadTime();//读取时间
    	LCD_ShowNum(1,1,DS1302_Time[0],2);//显示年
    	LCD_ShowNum(1,4,DS1302_Time[1],2);//显示月
    	LCD_ShowNum(1,7,DS1302_Time[2],2);//显示日
    	LCD_ShowNum(2,1,DS1302_Time[3],2);//显示时
    	LCD_ShowNum(2,4,DS1302_Time[4],2);//显示分
    	LCD_ShowNum(2,7,DS1302_Time[5],2);//显示秒
    }
    
    void TimeSet(void)//时间设置功能
    {
    	if(KeyNum==2)//按键2按下
    	{
    		TimeSetSelect++;//设置选择位加1
    		TimeSetSelect%=6;//越界清零
    	}
    	if(KeyNum==3)//按键3按下
    	{
    		DS1302_Time[TimeSetSelect]++;//时间设置位数值加1
    		if(DS1302_Time[0]>99){DS1302_Time[0]=0;}//年越界判断
    		if(DS1302_Time[1]>12){DS1302_Time[1]=1;}//月越界判断
    		if( DS1302_Time[1]==1 || DS1302_Time[1]==3 || DS1302_Time[1]==5 || DS1302_Time[1]==7 || 
    			DS1302_Time[1]==8 || DS1302_Time[1]==10 || DS1302_Time[1]==12)//日越界判断
    		{
    			if(DS1302_Time[2]>31){DS1302_Time[2]=1;}//大月
    		}
    		else if(DS1302_Time[1]==4 || DS1302_Time[1]==6 || DS1302_Time[1]==9 || DS1302_Time[1]==11)
    		{
    			if(DS1302_Time[2]>30){DS1302_Time[2]=1;}//小月
    		}
    		else if(DS1302_Time[1]==2)
    		{
    			if(DS1302_Time[0]%4==0)
    			{
    				if(DS1302_Time[2]>29){DS1302_Time[2]=1;}//闰年2月
    			}
    			else
    			{
    				if(DS1302_Time[2]>28){DS1302_Time[2]=1;}//平年2月
    			}
    		}
    		if(DS1302_Time[3]>23){DS1302_Time[3]=0;}//时越界判断
    		if(DS1302_Time[4]>59){DS1302_Time[4]=0;}//分越界判断
    		if(DS1302_Time[5]>59){DS1302_Time[5]=0;}//秒越界判断
    	}
    	if(KeyNum==4)//按键3按下
    	{
    		DS1302_Time[TimeSetSelect]--;//时间设置位数值减1
    		if(DS1302_Time[0]<0){DS1302_Time[0]=99;}//年越界判断
    		if(DS1302_Time[1]<1){DS1302_Time[1]=12;}//月越界判断
    		if( DS1302_Time[1]==1 || DS1302_Time[1]==3 || DS1302_Time[1]==5 || DS1302_Time[1]==7 || 
    			DS1302_Time[1]==8 || DS1302_Time[1]==10 || DS1302_Time[1]==12)//日越界判断
    		{
    			if(DS1302_Time[2]<1){DS1302_Time[2]=31;}//大月
    			if(DS1302_Time[2]>31){DS1302_Time[2]=1;}
    		}
    		else if(DS1302_Time[1]==4 || DS1302_Time[1]==6 || DS1302_Time[1]==9 || DS1302_Time[1]==11)
    		{
    			if(DS1302_Time[2]<1){DS1302_Time[2]=30;}//小月
    			if(DS1302_Time[2]>30){DS1302_Time[2]=1;}
    		}
    		else if(DS1302_Time[1]==2)
    		{
    			if(DS1302_Time[0]%4==0)
    			{
    				if(DS1302_Time[2]<1){DS1302_Time[2]=29;}//闰年2月
    				if(DS1302_Time[2]>29){DS1302_Time[2]=1;}
    			}
    			else
    			{
    				if(DS1302_Time[2]<1){DS1302_Time[2]=28;}//平年2月
    				if(DS1302_Time[2]>28){DS1302_Time[2]=1;}
    			}
    		}
    		if(DS1302_Time[3]<0){DS1302_Time[3]=23;}//时越界判断
    		if(DS1302_Time[4]<0){DS1302_Time[4]=59;}//分越界判断
    		if(DS1302_Time[5]<0){DS1302_Time[5]=59;}//秒越界判断
    	}
    	//更新显示,根据TimeSetSelect和TimeSetFlashFlag判断可完成闪烁功能
    	if(TimeSetSelect==0 && TimeSetFlashFlag==1){LCD_ShowString(1,1,"  ");}
    	else {LCD_ShowNum(1,1,DS1302_Time[0],2);}
    	if(TimeSetSelect==1 && TimeSetFlashFlag==1){LCD_ShowString(1,4,"  ");}
    	else {LCD_ShowNum(1,4,DS1302_Time[1],2);}
    	if(TimeSetSelect==2 && TimeSetFlashFlag==1){LCD_ShowString(1,7,"  ");}
    	else {LCD_ShowNum(1,7,DS1302_Time[2],2);}
    	if(TimeSetSelect==3 && TimeSetFlashFlag==1){LCD_ShowString(2,1,"  ");}
    	else {LCD_ShowNum(2,1,DS1302_Time[3],2);}
    	if(TimeSetSelect==4 && TimeSetFlashFlag==1){LCD_ShowString(2,4,"  ");}
    	else {LCD_ShowNum(2,4,DS1302_Time[4],2);}
    	if(TimeSetSelect==5 && TimeSetFlashFlag==1){LCD_ShowString(2,7,"  ");}
    	else {LCD_ShowNum(2,7,DS1302_Time[5],2);}
    }
    
    void main()
    {
    	LCD_Init();
    	DS1302_Init();
    	Timer0Init();
    	LCD_ShowString(1,1,"  -  -  ");//静态字符初始化显示
    	LCD_ShowString(2,1,"  :  :  ");
    	
    	DS1302_SetTime();//设置时间
    	
    	while(1)
    	{
    		KeyNum=Key();//读取键码
    		if(KeyNum==1)//按键1按下
    		{
    			if(MODE==0){MODE=1;TimeSetSelect=0;}//功能切换
    			else if(MODE==1){MODE=0;DS1302_SetTime();}
    		}
    		switch(MODE)//根据不同的功能执行不同的函数
    		{
    			case 0:TimeShow();break;
    			case 1:TimeSet();break;
    		}
    	}
    }
    
    void Timer0_Routine() interrupt 1
    {
    	static unsigned int T0Count;
    	TL0 = 0x18;		//设置定时初值
    	TH0 = 0xFC;		//设置定时初值
    	T0Count++;
    	if(T0Count>=500)//每500ms进入一次
    	{
    		T0Count=0;
    		TimeSetFlashFlag=!TimeSetFlashFlag;//闪烁标志位取反
    	}
    }
    
    

    DS1302.c

    #include <REGX52.H>
    
    //引脚定义
    sbit DS1302_SCLK=P3^6;
    sbit DS1302_IO=P3^4;
    sbit DS1302_CE=P3^5;
    
    //寄存器写入地址/指令定义
    #define DS1302_SECOND		0x80
    #define DS1302_MINUTE		0x82
    #define DS1302_HOUR			0x84
    #define DS1302_DATE			0x86
    #define DS1302_MONTH		0x88
    #define DS1302_DAY			0x8A
    #define DS1302_YEAR			0x8C
    #define DS1302_WP			0x8E
    
    //时间数组,索引0~6分别为年、月、日、时、分、秒、星期,设置为有符号的便于<0的判断
    char DS1302_Time[]={19,11,16,12,59,55,6};
    
    /**
      * @brief  DS1302初始化
      * @param  无
      * @retval 无
      */
    void DS1302_Init(void)
    {
    	DS1302_CE=0;
    	DS1302_SCLK=0;
    }
    
    /**
      * @brief  DS1302写一个字节
      * @param  Command 命令字/地址
      * @param  Data 要写入的数据
      * @retval 无
      */
    void DS1302_WriteByte(unsigned char Command,Data)
    {
    	unsigned char i;
    	DS1302_CE=1;
    	for(i=0;i<8;i++)
    	{
    		DS1302_IO=Command&(0x01<<i);
    		DS1302_SCLK=1;
    		DS1302_SCLK=0;
    	}
    	for(i=0;i<8;i++)
    	{
    		DS1302_IO=Data&(0x01<<i);
    		DS1302_SCLK=1;
    		DS1302_SCLK=0;
    	}
    	DS1302_CE=0;
    }
    
    /**
      * @brief  DS1302读一个字节
      * @param  Command 命令字/地址
      * @retval 读出的数据
      */
    unsigned char DS1302_ReadByte(unsigned char Command)
    {
    	unsigned char i,Data=0x00;
    	Command|=0x01;	//将指令转换为读指令
    	DS1302_CE=1;
    	for(i=0;i<8;i++)
    	{
    		DS1302_IO=Command&(0x01<<i);
    		DS1302_SCLK=0;
    		DS1302_SCLK=1;
    	}
    	for(i=0;i<8;i++)
    	{
    		DS1302_SCLK=1;
    		DS1302_SCLK=0;
    		if(DS1302_IO){Data|=(0x01<<i);}
    	}
    	DS1302_CE=0;
    	DS1302_IO=0;	//读取后将IO设置为0,否则读出的数据会出错
    	return Data;
    }
    
    /**
      * @brief  DS1302设置时间,调用之后,DS1302_Time数组的数字会被设置到DS1302中
      * @param  无
      * @retval 无
      */
    void DS1302_SetTime(void)
    {
    	DS1302_WriteByte(DS1302_WP,0x00);
    	DS1302_WriteByte(DS1302_YEAR,DS1302_Time[0]/10*16+DS1302_Time[0]%10);//十进制转BCD码后写入
    	DS1302_WriteByte(DS1302_MONTH,DS1302_Time[1]/10*16+DS1302_Time[1]%10);
    	DS1302_WriteByte(DS1302_DATE,DS1302_Time[2]/10*16+DS1302_Time[2]%10);
    	DS1302_WriteByte(DS1302_HOUR,DS1302_Time[3]/10*16+DS1302_Time[3]%10);
    	DS1302_WriteByte(DS1302_MINUTE,DS1302_Time[4]/10*16+DS1302_Time[4]%10);
    	DS1302_WriteByte(DS1302_SECOND,DS1302_Time[5]/10*16+DS1302_Time[5]%10);
    	DS1302_WriteByte(DS1302_DAY,DS1302_Time[6]/10*16+DS1302_Time[6]%10);
    	DS1302_WriteByte(DS1302_WP,0x80);
    }
    
    /**
      * @brief  DS1302读取时间,调用之后,DS1302中的数据会被读取到DS1302_Time数组中
      * @param  无
      * @retval 无
      */
    void DS1302_ReadTime(void)
    {
    	unsigned char Temp;
    	Temp=DS1302_ReadByte(DS1302_YEAR);
    	DS1302_Time[0]=Temp/16*10+Temp%16;//BCD码转十进制后读取
    	Temp=DS1302_ReadByte(DS1302_MONTH);
    	DS1302_Time[1]=Temp/16*10+Temp%16;
    	Temp=DS1302_ReadByte(DS1302_DATE);
    	DS1302_Time[2]=Temp/16*10+Temp%16;
    	Temp=DS1302_ReadByte(DS1302_HOUR);
    	DS1302_Time[3]=Temp/16*10+Temp%16;
    	Temp=DS1302_ReadByte(DS1302_MINUTE);
    	DS1302_Time[4]=Temp/16*10+Temp%16;
    	Temp=DS1302_ReadByte(DS1302_SECOND);
    	DS1302_Time[5]=Temp/16*10+Temp%16;
    	Temp=DS1302_ReadByte(DS1302_DAY);
    	DS1302_Time[6]=Temp/16*10+Temp%16;
    }
    
    

    DS1302.h

    #ifndef __DS1302_H__
    #define __DS1302_H__
    
    //外部可调用时间数组,索引0~6分别为年、月、日、时、分、秒、星期,设置为有符号的便于<0的判断
    extern char DS1302_Time[];
    
    void DS1302_Init(void);
    void DS1302_WriteByte(unsigned char Command,Data);
    unsigned char DS1302_ReadByte(unsigned char Command);
    void DS1302_SetTime(void);
    void DS1302_ReadTime(void);
    
    #endif
    
    

    key.c

    #include <REGX52.H>
    #include "Delay.h"
    
    /**
      * @brief  获取独立按键键码
      * @param  无
      * @retval 按下按键的键码,范围:0~4,无按键按下时返回值为0
      */
    unsigned char Key()
    {
    	unsigned char KeyNumber=0;
    	
    	if(P3_1==0){Delay(20);while(P3_1==0);Delay(20);KeyNumber=1;}
    	if(P3_0==0){Delay(20);while(P3_0==0);Delay(20);KeyNumber=2;}
    	if(P3_2==0){Delay(20);while(P3_2==0);Delay(20);KeyNumber=3;}
    	if(P3_3==0){Delay(20);while(P3_3==0);Delay(20);KeyNumber=4;}
    	
    	return KeyNumber;
    }
    
    

    key.h

    #ifndef __KEY_H__
    #define __KEY_H__
    
    unsigned char Key();
    
    #endif
    
    

    time0.c

    #include <REGX52.H>
    
    /**
      * @brief  定时器0初始化,1毫秒@12.000MHz
      * @param  无
      * @retval 无
      */
    void Timer0Init(void)
    {
    	TMOD &= 0xF0;		//设置定时器模式
    	TMOD |= 0x01;		//设置定时器模式
    	TL0 = 0x18;		//设置定时初值
    	TH0 = 0xFC;		//设置定时初值
    	TF0 = 0;		//清除TF0标志
    	TR0 = 1;		//定时器0开始计时
    	ET0=1;
    	EA=1;
    	PT0=0;
    }
    
    /*定时器中断函数模板
    void Timer0_Routine() interrupt 1
    {
    	static unsigned int T0Count;
    	TL0 = 0x18;		//设置定时初值
    	TH0 = 0xFC;		//设置定时初值
    	T0Count++;
    	if(T0Count>=1000)
    	{
    		T0Count=0;
    		
    	}
    }
    */
    
    

    time0.h

    #ifndef __TIMER0_H__
    #define __TIMER0_H__
    
    void Timer0Init(void);
    
    #endif
    
    
    展开全文
  • DS1302实时时钟实验

    2010-08-04 20:31:07
    DS1302 是美国DALLAS公司推出的一种高性能、低功耗、带RAM的实时时钟电路,它可以对年、月、日、周日、时、分、秒进行计时,具有闰年补偿功能,工作电压为2.5V~5.5V。采用三线接口与CPU进行同步通信,并可采用突发...
  • FPGA 读写rtc_ds1302实时时钟的Verilog逻辑源码Quartus工程文件+文档说明,RTC芯片型号ds1302,FPGA型号Cyclone4E系列中的EP4CE6F17C8,Quartus版本17.1。 module top( //sys input clk, input rst_n, output ...
  • 该文件是本人收集整理的资料,关于ds1302的相关文字资料。以及相关的C51单片机的历程,以及相关的DS1302的库文件.c文件以及.h文件。这个只需你在stm32中调用函数,即可完美使用
  • Arduino MEGA2560 需要的库已经加载好,虚拟串口助手也在压缩包里。打开就能使用。 使用教程见我的另一篇文章。
  • 学习DS1302模块
  • DS1302是由美国DALLAS公司推出的具有涓细电流充电能力的低功耗实时时钟芯片。它可以对年、月、日、周、时、分、秒进行计时,并且具有闰年补偿等多种功能。 1、DS1302控制字格式: 2、DS1302 相关的寄存器:...
  • 1602液晶显示的DS1302实时时钟,仿真实例,现成调用封装使用,可运行的仿真电路图和调好的程序,开箱即用。适用于教学案例、毕业设计、电子设计比赛、出书项目实例,实际设计、个人DIY参考。 已调试好,proteus直接...
  • 在本实验中,我们将使用DS1302实时时钟(RTC)模块获取当前日期和时间。   DS1302可以用于数据记录,特别是对某些具有特殊意义的数据点的记录,能实现数据与出现该数据的时间同时记录。这种记录对长时间的连续测控...
  • 本文主要讲了液晶显示单片机DS1302实时时钟程序,希望对你的学习有所帮助。
  • DS1302实时时钟芯片和液晶显示屏CD1602为基础设计的电子钟

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 18,369
精华内容 7,347
关键字:

ds1302实时时钟