精华内容
下载资源
问答
  • 【蓝桥杯】—{模块}—{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.数据传输摘要:

    在这里插入图片描述

    展开全文
  • 【蓝桥杯】—{模块}—{DS1302时钟芯片Part_2}一、Notes二、写时序1、时序图2、官方底层驱动代码:3、Template:4、Notes:三、写字节1、官方底层驱动代码:2、Template:四、读字节1、时序图1、官方底层驱动代码:2、...

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

    一、Notes

     ●同步串行通信
     ●三线通信
     ●内含一个实时时钟/日历和31字节静态RAM
     ●时钟/RAM的读/写数据以一个字节多达31个字节的字符组方式通信。

    二、写时序

    1、时序图

    在这里插入图片描述

    2、官方底层驱动代码:

    //-------第十届资料包,日期:2011-8-9,应该是针对12T单片机
    void Write_Ds1302(unsigned  char temp) 
    {
    	unsigned char i;
    	for (i=0;i<8;i++)     	
    	{ 
    		SCK=0;
    		SDA=temp&0x01;
    		temp>>=1; 
    		SCK=1;
    	}
    } 
    //------2020年国信长天组织的模拟测试-------//
    void Write_Ds1302_Byte(unsigned  char temp) 
    {
    	unsigned char i;
    	for (i=0;i<8;i++)     	
    	{ 
    		SCK=0;
    		SDA=temp&0x01;
    		temp>>=1; 
    		SCK=1;
    		Delay2ms();        
    	}
    }   
    
    

    3、Template:

    void DS1302_Write(uchar temp) 
    {
    	uchar i;
    	for (i=0;i<8;i++)     	
    	{ 
    		SCK=0;   
    		SDA=temp&0x01;
    		temp>>=1;    //移位兼延时
    		SCK=1;     //上升沿写入数据
    		Delay1us();//稳定电平 
    	}
    }  
    

    4、Notes:

     ●在SCLK周期的上升沿输入字节。DS1302每检测到一个SCLK上升沿就从I/O引脚(SDA)接收1位数据。
     ●先将SCK=0;再送数据,因为min(tDCt_{DC})=50ns,因此将移位temp>>=1;放于此移位兼延时
     ●再使SCK=1;产生上升沿,写入一位数据。
     ●Delay1us();min(tCHt_{CH})=250ns和min(tCLt_{CL})=250ns。即串行时钟信号SCK高低电平至少各为250ns。12T单片机12MHz主时钟,一个空指令_nop_();=一个机器周期=1个时钟周期=1/ foscf_{osc}=1/12MHz=1/12us,不够250ns,直接延时1us来稳定电平。
     ●至于min(tCLt_{CL})=250ns,由SCK=0;SCK=1;之间的执行代码充当延时。
     ●2020年国信长天组织的模拟测试中给出延时2ms,似乎有点过分?!

    三、写字节

    1、官方底层驱动代码:

    //------两个版本的驱动除了子函数名不一样外,完全相同----//
    void Write_Ds1302_Byte( unsigned char address,unsigned char dat )     
    {
     	RST=0;	_nop_();
     	SCK=0;	_nop_();
     	RST=1; 	_nop_();  
     	Write_Ds1302(address);	
     	Write_Ds1302(dat);		
     	RST=0; 
    }
    

    2、Template:

    //仅改了函数名,添加了注释
    //------------------------------------------------DS1302写字节-----------------//
    void DS1302_Write_Byte(uchar address,uchar dat)     
    {
     	RST=0;	_nop_();     //复位  
     	SCK=0;	_nop_();    //复位 
     	RST=1;  _nop_();     //开始数据传输 
     	DS1302_Write(address);//地址字节	
     	DS1302_Write(dat);	  //数据字节	
     	RST=0;                //复位,关闭数据传输 
    }
    

    四、读字节

    1、时序图

    在这里插入图片描述

    2、官方底层驱动代码:

    //-------第十届资料包,日期:2011-8-9,应该是针对12T单片机
    unsigned char Read_Ds1302_Byte ( unsigned char address )
    {
     	unsigned char i,temp=0x00;
     	RST=0;	_nop_();
     	SCK=0;	_nop_();
     	RST=1;	_nop_();
     	Write_Ds1302(address);
     	for (i=0;i<8;i++) 	
     	{		
    		SCK=0;
    		temp>>=1;	
     		if(SDA)
     		temp|=0x80;	
     		SCK=1;
    	} 
     	RST=0;	_nop_();
     	SCK=0;	_nop_();
    	SCK=1;	_nop_();
    	SDA=0;	_nop_();
    	SDA=1;	_nop_();
    	return (temp);			
    }
    //------2020年国信长天组织的模拟测试-------//
    unsigned char Read_Ds1302 ( unsigned char address )
    {
     	unsigned char i,temp=0x00;
     	RST=0;
    	_nop_();
     	SCK=0;
    	_nop_();
     	RST=1;
    	_nop_();
     	Write_Ds1302_Byte(address);
     	for (i=0;i<8;i++) 	
     	{		
    		SCK=0;
    		temp>>=1;
    		Delay2ms();	 
     		if(SDA)
     		temp|=0x80;	
     		SCK=1;
    	} 
     	RST=0;
    	_nop_();
     	RST=0;
    	SCK=0;
    	_nop_();
    	SCK=1;
    	_nop_();
    	SDA=0;
    	_nop_();
    	SDA=1;
    	return (temp);			
    }
    

    3、Template:

    //------------------------------------------------DS1302读字节-----------------//
    uchar DS1302_Read_Byte(uchar address)
    {
     	uchar i,temp=0x00;
    	
     	RST=0;	_nop_();
     	SCK=0;	_nop_();
     	RST=1;	_nop_();
     	DS1302_Write(address);  //地址字节	
     	
     	for (i=0;i<8;i++) 	
     	{		
    		SCK=0;     //开始读数据字节
    		temp>>=1;	 //延时+移位
    		Delay1us();//延时稳定电平 
     		if(SDA)
     		temp|=0x80;	
     		SCK=1;
    	} 
     	RST=0;	_nop_();
     	SCK=0;	_nop_();
    	SCK=1;	_nop_();
    	SDA=0;	_nop_();
    	SDA=1;	_nop_();
    	return (temp);			
    }
    

    4、Notes:

     ●Template与官方驱动没有实质性的变化。只是为了便于查找修改了子函数名,增加1us延时来稳定电平。
     ●还有最后的五行操作不知为啥,其他地方也没找到。
     ●2020模拟测试最后比以前多出来一行,写的更乱;其他地方的缩进,函数名都是极具个性的

    五、时钟设置

    1、RCT寄存器:

    在这里插入图片描述

    2、Template:

    uchar DS1302_Init_time[3]={23,59,50}; //DS1302初始化时间
    
    //------------------------------------------------DS1302时钟设置-----------------//
    void DS1302_Set_RCT(uchar *DS1302_Init_time)
    {
    	uchar RCT;
    	DS1302_Write_Byte(0X8E,0);		//WP=0,允许写操作
    	
    	RCT = ((DS1302_Init_time[0]/10)<<4)+(DS1302_Init_time[0]%10);
    	DS1302_Write_Byte(0X84,RCT);    //设置时
    	
    	RCT = ((DS1302_Init_time[1]/10)<<4)+(DS1302_Init_time[1]%10);
    	DS1302_Write_Byte(0X82,RCT);    //设置分
    	
    	RCT = ((DS1302_Init_time[2]/10)<<4)+(DS1302_Init_time[2]%10);
    	DS1302_Write_Byte(0X80,RCT);    //设置秒	
    	
    	DS1302_Write_Byte(0X8E,0X80);			//WP=1,禁止写操作
    }
    

    3、Notes:

     ●数组名是数组首元素的地址。数组表示法其实是在变相地使用指针。
     ●子函数定义了无符号指针型地形参,虽然形参名为数组名,但并不指向数组,形参名只是一个代表。
     ●输入的shi实参为数组名,指向数组首元素的地址,用实参来代替符号式的形参。
     ●允许写操作→写操作→关闭写操作
     ●时钟设置子函数DS1302_Set_RCT()将数据写入RCT寄存器组,来初始化时间,只需执行一遍。
     ●时间信息(秒,分,时,日,月,年)是将十进制的十位和个位分开分别转化为8421BCD码存储在相关寄存器中的。

    六、读取时钟

    1、Template:

    uchar DS1302_time[3];               //从DS1302读取到的实时时间 
    
    //------------------------------------------------DS1302读取时钟-----------------//
    void DS1302_Read_RCT(uchar *DS1302_time)
    {
    	uchar RCT;
    	
    	RCT = DS1302_Read_Byte(0X85);   //读取时
    	DS1302_time[0] = (RCT>>4)*10+(RCT&0X0F);  
    	
    	RCT = DS1302_Read_Byte(0X83);   //读取分
    	DS1302_time[1] = (RCT>>4)*10+(RCT&0X0F);  
    	
    	RCT = DS1302_Read_Byte(0X81);   //读取秒
    	DS1302_time[2] = (RCT>>4)*10+(RCT&0X0F);  
    }
    
    

    七、主函数

    void main(void)
    {
    	All_Init();  //开发板初始化
    	DS1302_Set_RCT(DS1302_Init_time);  //设置初始时钟
    	while(1)
    	{
    
    		DS1302_Read_RCT(DS1302_time);	  //DS1302读取时钟
    		
    		yi=DS1302_time[0]/10;
    		er=DS1302_time[0]%10;
    		san=23;
    		si=DS1302_time[1]/10;
    		wu=DS1302_time[1]%10;
    		liu=23;
    		qi=DS1302_time[2]/10;
    		ba=DS1302_time[2]%10;
    		
    		SEG_1_2(yi,er);
    		SEG_3_4(san,si);
    		SEG_5_6(wu,liu);
    		SEG_7_8(qi,ba);
    		SEG_Init();
    	}
    }
    
    展开全文
  • 基于蓝桥杯的单片机模块练习——DS1302时钟芯片 相关知识点 1.特点 实时时钟计算秒、分、小时、月、日、周和年,闰年补偿有效期最长为2100年。 2.详细描述 DS1302芯片包含一个实时时钟/日历和31字节的静态随机存取...

    基于蓝桥杯的单片机模块练习——DS1302时钟芯片

    相关知识点

    1.特点
    实时时钟计算秒、分、小时、月、日、周和年,闰年补偿有效期最长为2100年。
    2.详细描述
    DS1302芯片包含一个实时时钟/日历和31字节的静态随机存取存储器。它通过简单的串行接口与微处理器通信。实时时钟/日历提供秒、分、小时、日、月、星期和年的信息。对于少于31天的月份,月末日期会自动调整,包括闰年的更正。时钟以24小时制或12小时制运行,带有上午/下午指示器。
    3.地址命令字节
    在这里插入图片描述
    MSB(位7)必须是逻辑1。如果为0,对DS1302的写入将被禁用。位6如果是逻辑0则指定时钟/日历数据,如果逻辑1,则指定随机存取存储器数据。位1至5指定要输入或输出的指定寄存器。LSB(位0)是逻辑0时则为写操作(输入),逻辑1时为读操作(输出)。命令字节总是从LSB(位0)开始输入。
    4.数据的输入
    在输入写命令字节的八个SCLK周期之后,在接下来的八个SCLK周期的上升沿输入一个数据字节。如果无意中出现额外的SCLK循环,则忽略这些循环。数据从位0开始输入。
    5.数据的输出
    在输入读命令字节的八个SCLK周期之后,在接下来的八个SCLK周期的下降沿输出一个数据字节。请注意,要传输的第一个数据位出现在命令字节的最后一位写入后的第一个下降沿。
    6.时钟和日历
    时间和日历信息通过读取适当的寄存器字节获得。通过写入适当的寄存器字节来设置或初始化时间和日历。时间和日历寄存器的内容是二进制编码的十进制(BCD)格式。
    在这里插入图片描述

    注意:星期几的登记从午夜开始递增。对应于一周中某一天的值是用户定义的,但必须是连续的(如果1号对应星期日,则2号对应星期一,依此类推)不合逻辑的时间和日期输入相当于未定义。
    DS1302可以在12小时或24小时模式下运行。小时寄存器的位7定义为12或24小时模式选择位。高电平时,选择12小时模式。在12小时模式下,第5位是上午/下午位,逻辑高为下午。在24小时模式下,第5位是第二个10小时位(20–23小时)。每当12/24位发生变化时,小时数据必须重新初始化。

    秒寄存器的位7被定义为时钟停止标志。当该位设为逻辑1时,时钟振荡器停止,DS1302进入低功耗待机模式,漏电流小于100nA。当该位写入逻辑0时,时钟将启动。通电后默认为0。
    控制寄存器的位7是写保护位(通电后默认为0。前七位(位0至位6)被强制为0,并且在读取时总是读取0。在对时钟或随机存取存储器进行任何写操作之前,位7必须为0。高电平时,写保护位阻止对任何其他寄存器的写操作。因此,在尝试写入设备之前,应清除WP位。
    7.数据的传输
    1.单字节写入
    在这里插入图片描述

    //==========写入8bit数据==============================
    void Write_Ds1302(unsigned  char temp) 
    {
    	unsigned char i;
    	for (i=0;i<8;i++)  //传输8bit数据   	
    	{ 
    		SCK=0;//初始时钟线置0
    		SDA=temp&0x01;//取最低位,注意 DS1302 的数据和地址都是从最低位开始传输的
    		temp>>=1; //数据右移一位,准备传输下一位数据
    		SCK=1;//时钟线拉高,制造上升沿,SDA 的数据被传输
    	}
    }   
    /*****************************************************************
    说明:先写地址,后写数据
    
    功能:像相应的地址中,写入一个字节的数据
    
    
    **************************************************************/
    void Write_Ds1302_Byte( unsigned char address,unsigned char dat )     
    {
     	RST=0;	_nop_();//初始CE置0
     	SCK=0;	_nop_();//初始时钟线置0
     	RST=1; 	_nop_(); //CE为1,传输开始 
     	Write_Ds1302(address);//传输命令字,要写入的时间或日历地址	
     	Write_Ds1302(dat);	//写入要修改的时间或日期	
     	RST=0; //CE位0,结束数据传输
    }
    
    

    2.单字节读取
    在这里插入图片描述

    /*****************************************************************
    说明: 先写地址,后读数据
    
    功能:从 相应地址中读取一个字节的数据
    
    
    **************************************************************/
    unsigned char Read_Ds1302_Byte ( unsigned char address )
    {
     	unsigned char i,temp=0x00;
     	RST=0;	_nop_();//初始 CE 线置为 0
     	SCK=0;	_nop_();//初始时钟线置为 0
     	RST=1;	_nop_();//初始 CE 置为 1,传输开始
     	Write_Ds1302(address);//传输命令字,要读取的时间/日历地址
     	for (i=0;i<8;i++) //读取要得到的时间/日期	
     	{		
    		SCK=0;//制造下降沿读取数据
    		temp>>=1;//要返回的数据左移一位	
     		if(SDA)//当数据线为高时,证明该位数据为 1
     		temp|=0x80;	//要传输数据的当前值置为 1,若不是,则为 0
     		SCK=1;//拉高时钟线
    	} 
     	RST=0;	_nop_();//读取结束,CE 置为 0,结束数据的传输
     	SCK=0;	_nop_();
    	SCK=1;	_nop_();
    	SDA=0;	_nop_();
    	SDA=1;	_nop_();
    	return (temp);	//返回得到的时间/日期		
    }
    

    8.比赛时需要改写ds1302驱动

    /*
      程序说明: DS1302驱动程序
      软件环境: Keil uVision 4.10 
      硬件环境: CT107单片机综合实训平台 8051,12MHz
      日    期: 2011-8-9
    */
    #include "ds1302.h"
    
    
    
    unsigned char write_address[] = {0x80,0x82,0x84,0x86,0x88,0x8a,0x8c};
    unsigned char read_address[] = {0x81,0x83,0x85,0x87,0x89,0x8b,0x8d};
    unsigned char ds1302data[] = {0x06,0x59,0x23,0x09,0x02,0x02,0x21};
    unsigned char time[] = {0x06,0x59,0x23,0x09,0x02,0x02,0x21};
    												
    //==========写入8bit数据==============================
    void Write_Ds1302(unsigned  char temp) 
    {
    	unsigned char i;
    	for (i=0;i<8;i++)  //传输8bit数据   	
    	{ 
    		SCK=0;//初始时钟线置0
    		SDA=temp&0x01;//取最低位,注意 DS1302 的数据和地址都是从最低位开始传输的
    		temp>>=1; //数据右移一位,准备传输下一位数据
    		SCK=1;//时钟线拉高,制造上升沿,SDA 的数据被传输
    	}
    }   
    
    
    
    /*****************************************************************
    说明:先写地址,后写数据
    
    功能:像相应的地址中,写入一个字节的数据
    
    
    **************************************************************/
    void Write_Ds1302_Byte( unsigned char address,unsigned char dat )     
    {
     	RST=0;	_nop_();//初始CE置0
     	SCK=0;	_nop_();//初始时钟线置0
     	RST=1; 	_nop_(); //CE为1,传输开始 
     	Write_Ds1302(address);//传输命令字,要写入的时间或日历地址	
     	Write_Ds1302(dat);	//写入要修改的时间或日期	
     	RST=0; //CE位0,结束数据传输
    }
    
    
    
    
    /*****************************************************************
    说明: 先写地址,后读数据
    
    功能:从 相应地址中读取一个字节的数据
    
    
    **************************************************************/
    unsigned char Read_Ds1302_Byte ( unsigned char address )
    {
     	unsigned char i,temp=0x00;
     	RST=0;	_nop_();//初始 CE 线置为 0
     	SCK=0;	_nop_();//初始时钟线置为 0
     	RST=1;	_nop_();//初始 CE 置为 1,传输开始
     	Write_Ds1302(address);//传输命令字,要读取的时间/日历地址
     	for (i=0;i<8;i++)//读取要得到的时间/日期	
     	{		
    		SCK=0;//制造下降沿读取数据
    		temp>>=1;//要返回的数据左移一位	
     		if(SDA)//当数据线为高时,证明该位数据为 1
     		temp|=0x80;	//要传输数据的当前值置为 1,若不是,则为 0
     		SCK=1;//拉高时钟线
    	} 
     	RST=0;	_nop_();//读取结束,CE 置为 0,结束数据的传输
     	SCK=0;	_nop_();
    	SCK=1;	_nop_();
    	SDA=0;	_nop_();
    	SDA=1;	_nop_();
    	return (temp);	//返回得到的时间/日期		
    }
    void DS1302_Config()
    {
    	unsigned char i;
    	Write_Ds1302_Byte( 0x8e,0x00 );
    	for(i = 0; i < 7; i++)
    	{
    		Write_Ds1302_Byte( write_address[i],ds1302data[i] );
    	}
    	Write_Ds1302_Byte( 0x8e,0x80 );
    }
    
    void DS1302_Read()
    {
    	unsigned char i;
    	for(i = 0; i < 7; i++)
    	{
    		time[i] = Read_Ds1302_Byte( read_address[i] );
    	}
    }
    

    头文件ds1302.h

    #ifndef __DS1302_H
    #define __DS1302_H
    
    #include "SystemInit.h"
    #include <intrins.h>
    sbit SCK=P1^7;		
    sbit SDA=P2^3;	   	//数据传输IO
    sbit RST = P1^3;   // DS1302复位(SE)
    
    void Write_Ds1302(unsigned char temp);
    void Write_Ds1302_Byte( unsigned char address,unsigned char dat );
    unsigned char Read_Ds1302_Byte( unsigned char address );
    void DS1302_Config();
    void DS1302_Read();
    #endif
    
    

    部分相关代码及注解

    unsigned char write_address[] = {0x80,0x82,0x84,0x86,0x88,0x8a,0x8c};//对应RTC寄存器的写地址
    unsigned char read_address[] = {0x81,0x83,0x85,0x87,0x89,0x8b,0x8d};//对应RTC寄存器的读地址
    unsigned char ds1302data[] = {0x50,0x59,0x23,0x09,0x02,0x02,0x21};//要配置的初始时间/日期,一定要按秒、分、小时、日、月、星期和年的顺序
    unsigned char time[7];//用于存储 读取到的时间/日期数据
    
    void DS1302_Config()//配置初始时间函数
    {
    	unsigned char i;
    	Write_Ds1302_Byte( 0x8e,0x00 );//清除WP(取消写保护)
    	for(i = 0; i < 7; i++)
    	{
    		Write_Ds1302_Byte( write_address[i],ds1302data[i] );//将数据写入秒、分、小时、日、月、星期和年寄存器。注意,按对应顺序写入
    	}
    	Write_Ds1302_Byte( 0x8e,0x80 );//置位WP(打开写保护)
    }
    
    void DS1302_Read()//读取芯片里的当前时间/日期
    {
    	unsigned char i;
    	for(i = 0; i < 7; i++)
    	{
    		time[i] = BCD_TO_DECIMAL(Read_Ds1302_Byte( read_address[i] ));
    	}
    }
    
    // BCD 码 转 十进制
    #define BCD_TO_DECIMAL(x)   ((((x) & 0xf0) >> 4) * 10 + ((x) & 0x0f))
    // 十进制 转 BCD 码
    #define DECIMAL_TO_BCD(x)   ((((x) / 10) << 4) + ((x) % 10))
    

    注意事项

    DS1302外部晶振有一个起振时间,所以单片机需要等待他晶振起振完成才可以对它操作,建议把关于DS1302的配置函数写到最后。

    展开全文
  • 对51编程的DS1302时钟芯片测试工程(驱动已经模块化)
  • —{模板Template}—{Part7:DS18B20温度传感器}一、基本模板1、`头文件`● 改编自国信长天蓝桥杯官方蓝皮书例程,按照自己的习惯进行了补充和修改【蓝桥杯】—{模块}—{DS1302时钟芯片Part_1}一、基本模板、头文件.....

    九层妖塔 起于垒土

    在这里插入图片描述



    改编自国信长天蓝桥杯官方蓝皮书例程,按照自己的习惯进行了补充和修改


    【蓝桥杯】—{模块}—{DS1302时钟芯片Part_1}
    【蓝桥杯】—{模块}—{DS1302时钟芯片Part_2}


    一、基本模板

    1、头文件

    //-------------------------------------DS1302时钟芯片--------------------------------//
    sbit SCK=P1^7;		
    sbit SDA=P2^3;		
    sbit RST = P1^3;   // DS1302复位		
    
    extern uchar puc_RTC[3];  
    
    void Set_RTC(uchar * puc_RTC); //设置时钟
    void Read_RTC(uchar *puc_RTC); //读取时钟  
    

    2、写设置时钟函数Set_RTC()

    //--------------------------------------------设置时钟----------------//
    void Set_RTC(uchar * puc_RTC)
    {
        uchar temp;
    	
    	Write_Ds1302_Byte(0X8E,0);   //WP=0:允许写操作
    	
    	temp = ((puc_RTC[0]/10)<<4) + puc_RTC[0]%10;
    	Write_Ds1302_Byte(0X84,temp);  //设置时
    	
    	temp = ((puc_RTC[1]/10)<<4) + puc_RTC[1]%10;
    	Write_Ds1302_Byte(0X82,temp);  //设置分
    
    	temp = ((puc_RTC[2]/10)<<4) + puc_RTC[2]%10;
    	Write_Ds1302_Byte(0X80,temp);  //设置秒
    	
    	Write_Ds1302_Byte(0X8E,0X80);   //WP=1:禁止写操作	
    }
    
    

    Notes:
     ●写字节函数:第一个字节为地址字节,第二个为控制字节。

    void Write_Ds1302_Byte(unsigned char address,unsigned char dat); 
    

    3、写读取时钟函数Read_RTC()

    //--------------------------------------------读取时钟----------------//
    void Read_RTC(uchar *puc_RTC)
    {
        uchar temp;
    
    	temp = Read_Ds1302_Byte(0X85); //读取时   
    	puc_RTC[0] = (temp>>4)*10 + (temp&0X0F);
    	
    	temp = Read_Ds1302_Byte(0X83); //读取分  
    	puc_RTC[1] = (temp>>4)*10 + (temp&0X0F);
    	
    	temp = Read_Ds1302_Byte(0X81); //读取秒  
    	puc_RTC[2] = (temp>>4)*10 + (temp&0X0F);
    }
    

    Notes:
     ●读字节函数:写入形参为地址字节,返回值为数据字节。

    unsigned char Read_Ds1302_Byte(unsigned char address);
    

    在这里插入图片描述
     ●8421BCD码与二进制原码的相互转换。


    二、备用拓展模板

    1、设置时钟暂停标志

    void DS1302_Run_Stop(void)
    {
    	uchar temp = 0;
    	static bit flag = 0;
    	
    	if(flag == 0)
    	{
    		flag = 1;
    		Write_Ds1302_Byte(0x8e,0x00);  //开写保护
    		temp = Read_Ds1302_Byte(0x81); //秒   读
    		Write_Ds1302_Byte(0x80,(temp|0x80));  //秒  写
    		Write_Ds1302_Byte(0x8e,0x80);
    	}
    	else if(flag == 1)  //注意是else if
    	{
    		flag = 0;
    		Write_Ds1302_Byte(0x8e,0x00);   //开写保护
    		temp = Read_Ds1302_Byte(0x81); //秒   读
    		Write_Ds1302_Byte(0x80,(temp&0x7f));  //秒  写
    		Write_Ds1302_Byte(0x8e,0x80);
    	}
    
    }
    
    

      
      
      
      
    彩 蛋

    展开全文
  • /******************** (C) COPYRIGHT 2017 EESKILL多功能开发学习板******************** * 文件名 :main.c * 描述 :CPU不断读取DS1302时钟芯片上的数据,并显示在oled上 * 实验平台:EESKILL多功能开发学习板 * ...
  • 一、 DS1302时钟模块简介 DS1302 是DALLAS 公司推出的涓流充电时钟芯片,内含有一个实时时钟/日历和31 字节静态RAM ,通过简单的串行接口与单片机进行通信。实时时钟/日历电路提供秒、分、时、日、周、月、年的信息...
  • 蓝桥杯单片机设计与开发————蓝桥杯模块练习------DS1302-时钟芯片
  • 我个人觉得我的代码不是很规范,一些内核函数可能用得有些死板,属于初学者 =。= ,希望大家能提出问题,共同学习提高。 ...下图是我硬件RTC的电路图: ...static int ds1302_close(struct inode *inode ,...
  • Arduino 传感器: 使用DS1302时钟模块

    千次阅读 2017-01-05 04:30:17
    本文阐述了如何在Arduino上使用基于DS1302时钟芯片的时钟模块计时. 应用场景: 新年钟声倒计时 + LED显示 + LED显示华彩(显示特效) 原材料清单 DS1302 RTC模块 Arduino Uno R3 USB 电源 杜邦线 实验过程 最开始把...
  • 【Arduino】使用DS1302时钟模块搭配TM1637四位数码管制作简易电子钟材料准备DS1302时钟模块DS1302芯片简介DS1302时钟模块简介TM1637四位数码管简介部分接线图Arduino IDE代码完成效果注意事项 材料准备 ① Arduino ...
  • 在单片机c语言编程中,模块化编程显得非常重要。我觉得,模块化恰恰体现了c语言很好的可移植性。嵌入式编程中,硬件模块区分非常明显,所以驱动程序用模块化编程显得十分方便简洁。  详细规则不在赘述,可以百度...
  • 基于STM32的DS1302时钟模块驱动程序(详细)

    千次阅读 多人点赞 2020-03-19 14:01:19
    目录 1.项目概述 2.DS1032的数据手册解析 2.1 DS1302的引脚介绍 2.2 DS1302的通讯协议及时序 2.3 DS1302的相关寄存器 ...本程序采用的主控芯片为STM32F103RCT6,通过主控芯片驱动DS1302时钟模块,并将其实...
  • PowerRealy是一个继电器,是用来控制升压模块通断的,封装是典型黄色的HK信号继电器 继电器左边的两个接口,标有- S +的是红外热释探头的接入口,实现人来自动开,可在-和S之间再并联一个自锁开关可实现手动开关,另...
  • 本设计以AT89S52单片机为控制核心,时钟芯片DS1302提供时钟源,配合LCD1602液晶显示模块,组成基本硬件系统,同时利用HC-05嵌入式蓝牙串口通讯模块,可在手机端进行日期、时间的校准。具有走时精确,功耗低,显示...
  • 本设计以AT89S52单片机为控制核心,时钟芯片DS1302提供时钟源,配合LCD1602液晶显示模块,组成基本硬件系统,同时利用HC-05嵌入式蓝牙串口通讯模块,可在手机端进行日期、时间的校准。具有走时精确,功耗低,显示...
  •   现在有很多流行的串行时钟芯片,如DS1302,DS1307,PCF8485等,由于简单的接口,低成本和易用性,他们被广泛应用于电话、传真、便携式仪器等产品领域。在本实验中,我们将使用DS1302实时时钟(RTC)模块获取当前...
  • 如题, 这个是网上所谓的变态版的3线SPI总线:一根时钟线,一根使能线,一根双向IO线.  一个模块,两个文件: //spi3.c #include "typedef.h" #include "spi3.h" /********************************************...

空空如也

空空如也

1 2 3 4 5 ... 9
收藏数 162
精华内容 64
关键字:

ds1302时钟芯片模块