⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 020.c

📁 时钟芯片DS1302的设置、读取和测试程序
💻 C
字号:
/****************************************************************

 模块名称:DS1302.c
 功    能:实时时钟模块           
 时钟芯片型号:DS1302 
 说    明:
*********************************************************************/
#include <reg52.h>
#define uchar unsigned char	   //宏定义
#define uint unsigned int 

sbit     T_CLK      = P3^4;   /*实时时钟时钟线引脚 */
sbit     T_IO       = P3^5;   /*实时时钟数据线引脚 */
sbit     T_RST      = P3^3;   /*实时时钟复位线引脚 */

sbit  ACC0 = ACC^0;
sbit  ACC7 = ACC^7;
unsigned char code table[]=
{0xdf,0x86,0xbb,0xaf,0xe6,0xed,0xfd,0x87,  
0xff,0xef,0xf7,0xfc,0xd9,0xbe,0xf9,0xf1};
uchar ledaddr[]={0x20,0x10,0x08,0x04,0x02,0x01};

//函数声明
void   delay_ms(uint x);			 //延时
void   RTInputByte(uchar);       /* 输入 1Byte */
uchar  RTOutputByte(void);       /* 输出1Byte */
void   W1302(uchar, uchar);		 //往DS1302写入数据
uchar  R1302(uchar);			 //读取DS1302某地址的数据
void   Set1302(uchar *);         /* 设置时间 */
void   Bcd2asc(uchar,uchar *);
void   Get1302(); /* 读取1302当前时间 */

//uchar time1[7];
uchar ucCurtime[7];

/******************************************************************** 

 函 数 名:delay1()
 功    能:延时子程序
 说    明:通过调整x的值可以改变延时长短
 入口参数:x
 返 回 值:无  
***********************************************************************/
void delay_ms(uint x)
   {
   uchar tw;
   while (x-->0)
   		{
		for (tw=0;tw<125;tw++){;}
		}
   }


/******************************************************************** 

 函 数 名:RTInputByte()
 功    能:实时时钟写入一字节
 说    明:往DS1302写入1Byte数据 (内部函数)
 入口参数:d 写入的数据 
 返 回 值:无  
***********************************************************************/
void RTInputByte(uchar d) 
{ 
    uchar i;
    ACC = d;
    for(i=8; i>0; i--)
    {
        T_IO = ACC0;           /*相当于汇编中的 RRC */
        T_CLK = 1;
        T_CLK = 0;
        ACC = ACC >> 1; 
    } 
}
/******************************************************************** 

 函 数 名:RTOutputByte()
 功    能:实时时钟读取一字节
 说    明:从DS1302读取1Byte数据 (内部函数)
 入口参数:无  
 返 回 值:ACC
***********************************************************************/
uchar RTOutputByte(void) 
{ 
    uchar i;
    for(i=8; i>0; i--)
    {
        ACC = ACC >>1;         /*相当于汇编中的 RRC */
        ACC7 = T_IO;
        T_CLK = 1;
        T_CLK = 0;
    } 
    return(ACC); 
}
/******************************************************************** 

 函 数 名:W1302()
 功    能:往DS1302写入数据
 说    明:先写地址,后写命令/数据 (内部函数)
 调    用:RTInputByte() , RTOutputByte()
 入口参数:ucAddr: DS1302地址, ucData: 要写的数据
 返 回 值:无 
***********************************************************************/
void W1302(uchar ucAddr, uchar ucDa)
{
    T_RST = 0;
    T_CLK = 0;
    T_RST = 1;
    RTInputByte(ucAddr);       /* 地址,命令 */
    RTInputByte(ucDa);       /* 写1Byte数据*/
    T_CLK = 1;
    T_RST = 0;
} 
/******************************************************************** 

 函 数 名:R1302()
 功    能:读取DS1302某地址的数据
 说    明:先写地址,后读命令/数据 (内部函数)
 调    用:RTInputByte() , RTOutputByte()
 入口参数:ucAddr: DS1302地址
 返 回 值:ucData :读取的数据
***********************************************************************/
uchar R1302(uchar ucAddr)
{
    uchar ucData;
    T_RST = 0;
    T_CLK = 0;
    T_RST = 1;
    RTInputByte(ucAddr);             /* 地址,命令 */
    ucData = RTOutputByte();         /* 读1Byte数据 */
    T_CLK = 1;
    T_RST = 0;
    return(ucData);
}
/******************************************************************** 

 函 数 名:BurstW1302T()
 功    能:往DS1302写入时钟数据(多字节方式)
 说    明:先写地址,后写命令/数据
 调    用:RTInputByte() 
 入口参数:pWClock: 时钟数据地址 格式为: 秒 分 时 日 月 星期 年 控制
                            8Byte (BCD码)1B 1B 1B 1B 1B  1B  1B 1B
 返 回 值:无
***********************************************************************/
void BurstW1302T(uchar *pWClock)
{
    uchar i;
    W1302(0x8e,0x00);         /* 控制命令,WP=0,写操作?*/
    T_RST = 0;
    T_CLK = 0;
    T_RST = 1;
    RTInputByte(0xbe);        /* 0xbe:时钟多字节写命令 */
    for (i = 8; i>0; i--)     /*8Byte = 7Byte 时钟数据 + 1Byte 控制*/
    {
        RTInputByte(*pWClock); /* 写1Byte数据*/
        pWClock++;
    }
    T_CLK = 1;
    T_RST = 0;
} 
/******************************************************************** 

 函 数 名:BurstR1302T()
 功    能:读取DS1302时钟数据
 说    明:先写地址/命令,后读数据(时钟多字节方式)
 调    用:RTInputByte() , RTOutputByte()
 入口参数:pRClock: 读取时钟数据地址 格式为: 秒 分 时 日 月 星期 年
                               7Byte (BCD码)1B 1B 1B 1B 1B  1B  1B
 返 回 值:无
***********************************************************************/
void BurstR1302T(uchar *pRClock)
{
    uchar i;
    T_RST = 0;
    T_CLK = 0;
    T_RST = 1;
    RTInputByte(0xbf);             /* 0xbf:时钟多字节读命令 */
    for (i=8; i>0; i--) 
    {
       *pRClock = RTOutputByte();   /* 读1Byte数据 */
       pRClock++;
    }
    T_CLK = 1;
    T_RST = 0;
}
/******************************************************************** 

 函 数 名:BurstW1302R()
 功    能:往DS1302寄存器数写入数据(多字节方式)
 说    明:先写地址,后写数据(寄存器多字节方式)
 调    用:RTInputByte()
 入口参数:pWReg: 寄存器数据地址
 返 回 值:无
***********************************************************************/
void BurstW1302R(uchar *pWReg)
{
    uchar i;
    W1302(0x8e,0x00);         /* 控制命令,WP=0,写操作*/
    T_RST = 0;
    T_CLK = 0;
    T_RST = 1;
    RTInputByte(0xfe);         /* 0xbe:时钟多字节写命令 */
    for (i=31; i>0; i--)       /* 31Byte 寄存器数据 */
    {
        RTInputByte(*pWReg);    /* 写1Byte数据*/
        pWReg++;
    }
    T_CLK = 1;
    T_RST = 0;
} 
/******************************************************************** 

 函 数 名:BurstR1302R()
 功    能:读取DS1302寄存器数据
 说    明:先写地址,后读命令/数据(寄存器多字节方式)
 调    用:RTInputByte() , RTOutputByte()
 入口参数:pRReg: 寄存器数据地址
 返 回 值:无
***********************************************************************/
void BurstR1302R(uchar *pRReg)
{
    uchar i;
    T_RST = 0;
    T_CLK = 0;
    T_RST = 1;
    RTInputByte(0xff);            /* 0xff:时钟多字节读命令 */
    for (i=31; i>0; i--)          /*31Byte 寄存器数据 */
    {
        *pRReg = RTOutputByte();  /* 读1Byte数据 */
        pRReg++;
    }
    T_CLK = 1;
    T_RST = 0;
}
/******************************************************************** 

 函 数 名:Set1302()
 功    能:设置初始时间
 说    明:先写地址,后读命令/数据(寄存器多字节方式)
 调    用:W1302()
 入口参数:pClock: 设置时钟数据地址 格式为: 秒 分 时 日 月 星期 年
                               7Byte (BCD码)1B 1B 1B 1B 1B  1B  1B
 返 回 值:无
***********************************************************************/
void Set1302(uchar *pClock) 
{
    uchar i;
    uchar ucAddr = 0x80; 
    W1302(0x8e,0x00);           /* 控制命令,WP=0,写操作?*/
    for(i =7; i>0; i--)
    { 
        W1302(ucAddr,*pClock);  /* 秒 分 时 日 月 星期 年 */ 
        pClock++;
        ucAddr +=2;
    }
    W1302(0x8e,0x80);           /* 控制命令,WP=1,写保护?*/
}
/******************************************************************** 

 函 数 名:Get1302()
 功    能:读取DS1302当前时间
 说    明:
 调    用:R1302() 
 入口参数:ucCurtime: 保存当前时间地址。当前时间格式为: 秒 分 时 日 月 星期 年 
                                        7Byte (BCD码)   1B 1B 1B 1B 1B  1B  1B
 返 回 值:无
***********************************************************************/
void Get1302() 
{
    uchar i;
    uchar ucAddr = 0x81;
    for (i=0; i<7; i++)
	{
    {
        ucCurtime[i] = R1302(ucAddr);/*格式为: 秒 分 时 日 月 星期 年 */
        ucAddr += 2;

		//return ucCurtime[i];
    }
	//send_char(ucCurtime[i]);
 P1=0x20;
 P2=table[ucCurtime[3]&0x0f];
 delay_ms(1);

 P1=0x10;
 P2=table[(0xf0&ucCurtime[3])>>4];
 delay_ms(1);

 P1=0x08;
 P2=table[(0x0f&ucCurtime[4])];
 delay_ms(1);

 P1=0x04;
 P2=table[(0xf0&ucCurtime[4])>>4];
 delay_ms(1);
 
 P1=0x02;
 P2=table[0x0f&ucCurtime[6]];
 delay_ms(1);
 
 P1=0x01;
 P2=table[(0xf0&ucCurtime[6])>>4];
 delay_ms(1);

	
	}
}
/*//////////////////////////////////////////////////////////////////////*/

main()
{	

	uchar *point;
	uchar w1[7]={0x58,0x59,0x23,0x29,0x07,0x07,0x07};
	point=&w1;
	
	//com_set();
    Set1302(point); 
   
	while(1)
	{
	 Get1302();
	}
}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -