ds1302 订阅
DS1302是由美国DALLAS公司推出的具有涓细电流充电能力的低功耗实时时钟芯片。它可以对年、月、日、周、时、分、秒进行计时,且具有闰年补偿等多种功能。 展开全文
DS1302是由美国DALLAS公司推出的具有涓细电流充电能力的低功耗实时时钟芯片。它可以对年、月、日、周、时、分、秒进行计时,且具有闰年补偿等多种功能。
信息
公    司
DALLAS公司
外文名
DS1302
类    型
时钟芯片
国    家
美国
中文名
DS1302
DS1302摘要
DS1302 [1]  的在实时显示时间中的应用。关键词:时钟电路;实时时钟;单片机;
收起全文
精华内容
下载资源
问答
  • DS1302 DS1302DS1302 DS1302DS1302 DS1302DS1302 DS1302DS1302 DS1302DS1302 DS1302DS1302 DS1302DS1302 DS1302DS1302 DS1302DS1302 DS1302DS1302 DS1302DS1302 DS1302DS1302 DS1302DS1302 DS1302DS1302 DS1302DS...
  • DS1302

    2018-05-16 11:17:39
    DS1302.c#include "ds1302.h" #include "stm32f10x.h" #define NOP() __NOP #define DS1302_CLK_H() (GPIOA->BSRR=GPIO_Pin_4) #define DS1302_CLK_L() (GPIOA->BRR=GPIO_Pin_4...
    DS1302.c
    #include "ds1302.h"
    #include "stm32f10x.h"
    
    #define NOP() __NOP
    
    #define DS1302_CLK_H()	(GPIOA->BSRR=GPIO_Pin_4)
    #define DS1302_CLK_L()	(GPIOA->BRR=GPIO_Pin_4)
    
    #define DS1302_RST_H()	(GPIOA->BSRR=GPIO_Pin_6)
    #define DS1302_RST_L()	(GPIOA->BRR=GPIO_Pin_6)
    
    #define DS1302_OUT_H()	(GPIOA->BSRR=GPIO_Pin_5)
    #define DS1302_OUT_L()	(GPIOA->BRR=GPIO_Pin_5)
    											
    #define DS1302_IN_X			(GPIOA->IDR&GPIO_Pin_5)
    
    
    
    static GPIO_InitTypeDef GPIO_InitStructure;
    
    void DS1302_Configuration(void)
    {
    	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE);
    
    	/* PE4,5,6输出 */
    	GPIO_ResetBits(GPIOE,GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6);
    	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6;
    	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;	//推挽输出
    	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;	//50M时钟速度
    	GPIO_Init(GPIOA, &GPIO_InitStructure);
    }
    
    
    static void DelayNOP(u32 count)
    {
    	while(count--) ;
    }
    
    static void DS1302_OUT(void)
    {
    	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
    	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    	GPIO_Init(GPIOA, &GPIO_InitStructure);
    }
    
    static void DS1302_IN(void)
    {
    	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
    	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
    	GPIO_Init(GPIOA, &GPIO_InitStructure);
    }
    
    void DS1302SendByte(u8 byte)
    {
    	u8	i;
    
    	for(i=0x01;i;i<<=1)
    	{
    		if(byte&i)	DS1302_OUT_H();
    		else	DS1302_OUT_L();
    		DS1302_CLK_H();
    		DelayNOP(50);		//加延时
    		DS1302_CLK_L();
    	}
    }
    
    u8 DS1302ReceiveByte(void)
    {
    	u8	i,byte=0;
    
    	for(i=0x01;i;i<<=1)
    	{
    		if(DS1302_IN_X)	byte |= i;
    		DS1302_CLK_H();
    		DelayNOP(50);		//加延时
    		DS1302_CLK_L();
    	}
    	return(byte);
    }
    
    void Write1302(u8 addr,const u8 data)
    {
        DS1302_OUT();
    	DS1302_RST_L();
    	DS1302_CLK_L();
    	DS1302_RST_H();
    	DelayNOP(100);
    	DS1302SendByte(addr);
    	DS1302SendByte(data);
    	DelayNOP(100);
    	DS1302_RST_L();
    }
    
    u8 Read1302(u8 addr)
    {
        u8 data=0;
    
       DS1302_OUT();
    	DS1302_RST_L();
    	DS1302_CLK_L();
    	DS1302_RST_H();
    	DelayNOP(100);
    	DS1302SendByte(addr|0x01);
    	DS1302_IN();
    	data = DS1302ReceiveByte();
    	DelayNOP(100);
    	DS1302_RST_L();
    	return(data);
    }
    
    extern char  time_oled[20];
    extern char clock_oled[20];
    extern u8 time[7] ;
    //读取时间函数
    void DS1302_GetTime(void)
    {
    	
    	time[0] = Read1302(DS1302_YEAR);
    	time[1] = Read1302(DS1302_WEEK);
    	time[2] = Read1302(DS1302_MONTH);
    	time[3] = Read1302(DS1302_DAY);
    	time[4] = Read1302(DS1302_HOUR);
    	time[5] = Read1302(DS1302_MINUTE);
    	time[6] = Read1302(DS1302_SECOND);	
    	
    	time_oled[3]=(time[0]>>4)+'0';   //年
      time_oled[4]=(time[0]&0x0F)+'0'; //
    	time_oled[6]=(time[2]>>4)+'0';   //月
      time_oled[7]=(time[2]&0x0F)+'0'; //
    	time_oled[9]=(time[3]>>4)+'0';   //日
      time_oled[10]=(time[3]&0x0F)+'0'; //
    	
    	clock_oled[2]=(time[4]>>4)+'0';   //时
      clock_oled[3]=(time[4]&0x0F)+'0'; //
    	clock_oled[5]=(time[5]>>4)+'0';   //分
      clock_oled[6]=(time[5]&0x0F)+'0'; //
    	clock_oled[8]=(time[6]>>4)+'0';   //秒
      clock_oled[9]=(time[6]&0x0F)+'0'; //
    }
    
    /*
    读取DS1302中的RAM
    addr:地址,从0到30,共31个字节的空间
    返回为所读取的数据
    */
    u8 ReadDS1302Ram(u8 addr)
    {
    	u8	tmp,res;
    
    	tmp = (addr<<1)|0xc0;
    	res = Read1302(tmp);
    	return(res);
    }
    
    /*
    写DS1302中的RAM
    addr:地址,从0到30,共31个字节的空间
    data:要写的数据
    */
    void WriteDS1302Ram(u8 addr,u8 data)
    {
    	u8	tmp;
    
    	Write1302(DS1302_WRITE,0x00);		//关闭写保护
    	tmp = (addr<<1)|0xc0;
    	Write1302(tmp,data);
    	Write1302(DS1302_WRITE,0x80);		//打开写保护
    }
    
    void ReadDSRam(u8 *p,u8 add,u8 cnt)
    {
    	u8 i;
    	
    	if(cnt>30) return;
    	for(i=0;i<cnt;i++)
    	{
    		*p = ReadDS1302Ram(add+1+i);
    		p++;
    	}
    }
    
    void WriteDSRam(u8 *p,u8 add,u8 cnt)
    {
    	u8 i;
    	
    	if(cnt>30) return;
    	for(i=0;i<cnt;i++)
    	{
    		WriteDS1302Ram(add+1+i,*p++);
    	}
    }
      
    /*
    读时间函数,顺序为:年周月日时分秒
    */
    void ReadDS1302Clock(u8 *p)
    {
    	DS1302_OUT();
    	DS1302_RST_L();
    	DS1302_CLK_L();
    	DS1302_RST_H();
    	DelayNOP(100);
    	DS1302SendByte(0xbf);			//突发模式
    	DS1302_IN();
    	p[5] = DS1302ReceiveByte();		//秒
    	p[4] = DS1302ReceiveByte();		//分
    	p[3] = DS1302ReceiveByte();		//时
    	p[2] = DS1302ReceiveByte();		//日
    	p[1] = DS1302ReceiveByte();		//月
    	DS1302ReceiveByte();			//周
    	p[0] = DS1302ReceiveByte();		//年
    	DS1302ReceiveByte();			//保护标志字节
    	DelayNOP(100);
    	DS1302_RST_L();
    }
    
    /*
    写时间函数,顺序为:年周月日时分秒
    */
    void WriteDS1302Clock(u8 *p)
    {
    	Write1302(DS1302_WRITE,0x00);		//关闭写保护
    	DS1302_OUT();
    	DS1302_RST_L();
    	DS1302_CLK_L();
    	DS1302_RST_H();
    	DelayNOP(100);
    	DS1302SendByte(0xbe);				//突发模式
    	DS1302SendByte(p[5]);				//秒
    	DS1302SendByte(p[4]);				//分
    	DS1302SendByte(p[3]);				//时
    	DS1302SendByte(p[2]);				//日
    	DS1302SendByte(p[1]);				//月
    	DS1302SendByte(0x01);				//周,设置成周一,没有使用
    	DS1302SendByte(p[0]);				//年
    	
    	DS1302SendByte(0x80);				//保护标志字节
    	DelayNOP(100);
    	DS1302_RST_L();
    }
    void InitClock(void)
    {
    	u8	tmp;
    
    	DS1302_Configuration();
    	tmp = ReadDS1302Ram(0);
    	if(tmp^0xa5)
    	{
    		WriteDS1302Ram(0,0xa5);
    		Write1302(DS1302_WRITE,0x00);		//关闭写保护
    		Write1302(0x90,0x03);				//禁止涓流充电
    		Write1302(DS1302_HOUR,0x00);		//设置成24小时制
    		Write1302(DS1302_SECOND,0x00);		//使能时钟运行
    		Write1302(DS1302_WRITE,0x80);		//打开写保护
    	}
    }
    /*
    void TestDS1302(void)
    {
    	u8 i,tt[7],dd1[30],dd2[30];
    	
    	DS1302_Configuration();
    	InitClock();
    	tt[0] = 0x13;
    	tt[1] = 0x05;
    	tt[2] = 0x23;
    	tt[3] = 0x09;
    	tt[4] = 0x25;
    	tt[5] = 0x00;
    	WriteDS1302Clock(tt);
    	for(i=0;i<30;i++)
    	{
    		dd1[i] = i;
    		dd2[i] = 0;
    	}
    	WriteDSRam(dd1,0,30);
    	ReadDSRam(dd2,0,30);
    	while(1) 
    	{
    		ReadDS1302Clock(tt);
    	}
    }
    */
    //end
    
    ds1302.h
    #ifndef DS1302_H
    #define DS1302_H
    
    typedef  unsigned char  u8;
    
    #define Time_24_Hour	0x00	//24时制控制	
    #define Time_Start		0x00	//开始走时
    
    #define DS1302_SECOND	0x80	//DS1302各寄存器操作命令定义
    #define DS1302_MINUTE	0x82
    #define DS1302_HOUR		0x84
    #define DS1302_DAY		0x86
    #define DS1302_MONTH	0x88
    #define DS1302_WEEK		0x8A
    #define DS1302_YEAR		0x8C
    #define DS1302_WRITE	0x8E
    #define DS1302_POWER	0x90
    
    void InitClock(void);
    void ReadDS1302Clock(u8 *p);
    void WriteDS1302Clock(u8 *p);
    void ReadDSRam(u8 *p,u8 add,u8 cnt);
    void WriteDSRam(u8 *p,u8 add,u8 cnt);
    void TestDS1302(void);
    void DS1302_GetTime(void);
    void Write1302(u8 addr,const u8 data);
    #endif
    
    
    main.c
    DS1302_GetTime();   // 获取时间
    TestDS1302();      // 设置时间
    展开全文
  • ds1302 ds1302

    2018-04-28 10:29:35
    ds1302 资源,这个可以对ds1302有一些作用,可以比较好地学习学习
  • ds1302

    2017-07-04 19:52:38
    原文地址:ds1302作者:面包会有的DS1302是 DALLAS 公司推出的涓流充电时钟芯片,内含一个实时时钟/日历和31字节静态 RAM,可以通过串行接口与单片机进行通信,仅需三根 I/O线:复位(RST)、I/O数据线、串行时钟...
    原文地址:ds1302作者:面包会有的

    DS1302是 DALLAS 公司推出的涓流充电时钟芯片,内含一个实时时钟/日历和31字节静态 RAM,可以通过串行接口与单片机进行通信,仅需三根 I/O线:复位(RST)、I/O数据线、串行时钟(SCLK),(补充一点小知识:一般来讲,无论是哪种同步通讯类型的串行接口,都是对时钟信号敏感的,而且一般数据写入有效是在上升沿,读出有效是在下降沿)。要想与ds1302通讯,就必须先了解它的控制字,[转载]ds1302如图所示,控制字的最高有效位(位7)必须是逻辑1,如果它为0,则不能把数据写入到 DS1302中;位6:如果为0,则表示存取日历时钟数据,为1表示存取 RAM 数据;位5至位1(A4~A0):指示操作单元的地址;位0(最低有效位):如为0,表示要进行写操作,为1表示进行读操作。控制字总是从最低位开始输出。在控制字指令输入后的下一个SCLK 时钟的上升沿时,数据被写入 DS1302,数据输入从最低位(0位)开始。同样,在紧跟8位的控制字指令后的下一个 SCLK 脉冲的下降沿,读出 DS1302的数据,读出的数据也是从最低位到最高位。

    程序还有些地方看不懂,就是关于写操作时CLK应该是上升沿,但此程序是下降沿,而且运行良好,改成上升沿反而不对了,很不理解,etc.

    现在介绍下主要的几块程序:

    void v_RTInputByte(uchar ucDa)        //输入-写操作
    {
      uchar i;
      ACC=ucDa;//待写数据送给ACC
      for(i=8;i>0;i--)
     {
       if((ACC&0x01)==1)  //ACC最后1位为1
       T_IO=1;
       else T_IO=0;//if((ACC&0x01)==0)
       T_CLK=1;
       T_CLK=0;//不是上升沿写吗?
       ACC=ACC>>1;
     }
    }

    uchar uc_RTOutputByte(void)          //输出-读操作
    {
      uchar i,ACC;
      ACC=0;//ACC清0
      for(i=0;i<8;i++)
     {
       ACC=ACC>>1;  

       if(T_IO==1)
       ACC=ACC|0x80;//ACC第1位置1
       T_CLK=1;
       T_CLK=0;  //下降沿
     }
     return(ACC);//返回ACC
    }

     

    void v_W1302(uchar ucAddr,uchar ucDa)     //指定地址写数据
    {
     T_RST=0;
     T_CLK=0;
     T_RST=1;
     v_RTInputByte(ucAddr);  //写地址

     v_RTInputByte(ucDa);    //写数据
     T_CLK=1;
     T_RST=0;
    }

     

    uchar uc_R1302(uchar ucAddr)     //指定地址读数据
    {
     unsigned char ucDa,k;  //BCD转换成16进制
     k=0x00;
     T_RST=0;
     T_CLK=0;
     T_RST=1;
     v_RTInputByte(ucAddr); 
     ucDa=uc_RTOutputByte();
     T_CLK=1;
     T_RST=0;

     k=ucDa/16;
     ucDa=ucDa;
     ucDa=ucDa+k*10;//16进制转化为10进制

     return(ucDa);
    }

    以上就是对ds1302的给定地址读写操作了,下面是显示初始值的设定和记录时间子程序

    void v_Set1302()//uchar *pSecDa)    设置初始时间值
    {
      uchar i,j;
      uchar ucAddr=0x80;     // 秒写地址
      v_W1302(0x8e,0x00);    // 控制命令,WP=0,写操作
      for(i=0;i<7;i++)       // 连续写入7个时间
     {
       j=ucCurtime[i];    // 代入初始时间
       v_W1302(ucAddr,j); // 秒 分 时  
       ucAddr +=2;        // 地址+2,因为都是两位数
     }
      v_W1302(0x8e,0x80);    // 控制命令,WP=1,写保护
    }

     

    void v_Get1302()           // 记录时间
    {
      uchar i;
      uchar ucAddr=0x81;     // 秒读地址
      for (i=0;i<7;i++)      // 连续读数据
     {
       ucCurtime[i]=uc_R1302(ucAddr);//格式为: 秒 分 时 

       ucAddr +=2;
     }
    }

    然后是数码管显示内容和显示设置

    void  t2_10()         //数码管段数字显示内容
    {
     unint k;
     a[5]=temp1/10;
     a[4]=temp1;
     a[3]=temp/1000;
     k=temp00;
     a[2]=k/100;
     k=k0;
     a[1]=k/10;
     a[0]=k;
    }

    void display2()         //显示设置
    {
     t2_10();

     wei_1(0x7f);    //秒(两位)
     duan_1(a[0]);
     wei_1(0xbf);
     duan_1(a[1]);

     

     wei_1(0xdf);   
     duan_1(10);

     

     wei_1(0xef);  
     duan_1(a[2]);
     wei_1(0xf7);
     duan_1(a[3]);

     

     wei_1(0xfb);   
     duan_1(10);

     

     wei_1(0xfd);  
     duan_1(a[4]);
     wei_1(0xfe);
     duan_1(a[5]);

     

     wei_1(0xff);  
    }

    然后是主程序

    void main()
    {
     unint i,k;
     for(i=0;i<7;i++)       //将10进制转换成16进制
     {
      k=ucCurtime[i]/10;
      ucCurtime[i]=ucCurtime[i];
      ucCurtime[i]=ucCurtime[i]+16*k;
     }
     v_Set1302();           //时间初值
     while(1)

     {

       v_Get1302();                              //记录时间
       temp1=ucCurtime[2];                       //时
       temp=ucCurtime[1]*100+ucCurtime[0];       //分+秒
       display2();                               //显示

     }
    }

    这个程序是比较综合的除了中断没用到,其他的基本都用到了,其实若加进去整点报时或闹铃设置就更全面了,想着以后用1602做个时钟加进去这两个功能,试试吧。

    展开全文
  • ds1302 时钟程序详解 ,ds1302 程序流程图 (C 程序 ) ds1302 时钟程序详解 DS1302 的控制字如图 2 所示控制字节的最高有效位 (位 7)必须是逻辑 1如果它为 0 则不能把数据写 入 DS1302 中位 6 如果为 0则表示存取日历...
  • ds1302时钟程序详解ds1302程序流程图C程序 ds1302时钟程序详解 DS1302的控制字如图2所示控制字节的最高有效位 位7必须是逻辑1 ,如果它为0 ,则不能把数据写 入DS1302中位6如果为0,则表示存取日历时钟数据 为1表示存取...
  • Ds1302

    2017-01-23 21:06:00
    void Ds1302Write(uchar addr, uchar dat); uchar Ds1302Read(uchar addr); // 初始化 void Ds1302Init(); //读DS1302. void Ds1302ReadTime(); void delay(); uchar KeyScan(); ...
    #include 
    #include 
    #define uchar unsigned char 
    unsigned char dspcom = 0;
    unsigned char dspbuf[8] = {10,10,10,10,10,10,10,10};
    code unsigned char tab[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,
                                0xff,0xbf};
    sbit DSIO=P2^3;
    sbit RST=P1^3;
    sbit SCLK=P1^7;
    uchar Num=0;
    void Ds1302Write(uchar addr, uchar dat);
    uchar Ds1302Read(uchar addr);						// 初始化
    void Ds1302Init();											//读DS1302.
    void Ds1302ReadTime();									
    
    void delay();
    uchar KeyScan();
    uchar TIME[7];
    uchar code DIG_CODE[17]=
    {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
    0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
    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};
    uchar TIME[7] = {0x00, 0x04, 0x11, 0x15, 0x01, 0x07, 0x17};
    uchar DisplayData[8];
    void display(void); 
    //向DS1302命令(地址+数据)
    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;//数据在上升沿时,DS1302读取数据
    		_nop_();
    		SCLK = 0;
    		_nop_();	
    	}	
    		 
    	RST = 0;//传送数据结束
    	_nop_();
    }
    // 读取一个地址的数据
    uchar Ds1302Read(uchar addr)
    {
    	uchar n,dat,dat1;
    	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;//DS1302下降沿时,放置数据
    		_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;	
    }
    //初始化DS1302.
    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]);
    	}
    }
    
    
    void main()
    {		TMOD |= 0x01;  //?????????
        TH0 = (65536-2000)/256;
        TL0 = (65536-2000)%256;  
        EA = 1;
        ET0 = 1;  
        TR0 = 1;  
    	Ds1302Init();
    	while(1)
    	{	Ds1302ReadTime();
    		dspbuf[0]=TIME[2]/16;
    		dspbuf[1]=TIME[2]&0x0f;
    		dspbuf[2]=11;
    		dspbuf[3]=TIME[1]/16;
    		dspbuf[4]=TIME[1]&0x0f;
    		dspbuf[5]=11;
    		dspbuf[6]=TIME[0]/16;
    		dspbuf[7]=TIME[0]&0x0f;
    	}
    }
    void display(void)
    {   
    	P2 = ((P2&0x1f)|0xE0); 
    	P0 = 0xff;
    	P2 &= 0x1f;
    
    	P2 = ((P2&0x1f)|0xC0); 
    	P0 = 1<
    展开全文
  • DS1302手册

    2019-04-02 23:15:26
    DS1302手册 DS1302 Trickle Charge Timekeeping Chip

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,561
精华内容 1,424
关键字:

ds1302