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

📄 ds1302.c

📁 基于AT89S52单片机的时钟温度显示程序
💻 C
字号:
/*********************************************************************************************************                  
*                                     		DS1302 drivers
*                                       	QZhao,2007
*                                       	All Rights Reserved  
* File : ds1302.c
* By   : QZhao
* Contact : zq1987731@163.com
*********************************************************************************************************/

/*★★★可调用函数:v_Set1302()->初始时间设定	v_Get1302()->时间读取	
					DIS_D_Z()->时间类型数据转ASC存入缓冲区*/

/********************************************************************************************************* 
* 
*	       	    							DS1302数据写入子函数
*     	入口参数: dat 写入的数据   
*		返回值:成功则返回TRUE
*		功能: 往DS1302 写入1Byte 数据
*
*********************************************************************************************************/

	static bool v_RTInputByte(uchar ucdat)
	{
		uchar i;
		for(i=8;i>0;i--)
		{
			DS1302_IO=(bit)(ucdat & 0x01); //RRC
			DS1302_SCLK=1;
			_nop_();
			DS1302_SCLK=0;
			ucdat>>=1;
		}
		return TRUE;
	}

/*********************************************************************************************************
 * 
*	       	    							DS1302数据读取子函数
*     	入口参数:无  
*		返回值:成功则返回TRUE
*		功能:从DS1302读取1Byte 数据
*
*********************************************************************************************************/

	static uchar uc_RTOutputByte(void)
	{
		uchar i;
		uchar ucdat=0;
		for(i=8;i>0;i--)
		{
			DS1302_IO=1;
			ucdat>>=1; 				//RRC
			if(DS1302_IO)ucdat|=0x80;
			DS1302_SCLK = 1;
			_nop_();
			DS1302_SCLK = 0;
		}
		return ucdat;
	}

/*********************************************************************************************************  
*
*	       	    							DS1302数据按地址写子函数
*     	入口参数:(address: DS1302地址, dat: 要写的数据) 
*		返回值:成功则返回TRUE
*		功能:往DS1302 写入数据
*
*********************************************************************************************************/

	static bool v_W1302(uchar address,uchar ucdat)
	{
		W_8255(0x02,1);			//PC1置0
		DS1302_SCLK=0;
		W_8255(0x03,1);			//PC1置1
		v_RTInputByte(address); /* 地址,命令 */
		v_RTInputByte(ucdat); /* 写1Byte 数据*/
		DS1302_SCLK=1;
		W_8255(0x02,1);
		return TRUE;
	}

/*********************************************************************************************************  
*
*	       	    							DS1302数据按地址读子函数
*     	入口参数:相关地址
*		返回值:成功则返回TRUE
*		功能:从DS1302 读出数据
*
*********************************************************************************************************/

	static uchar uc_R1302(uchar address)
	{
		uchar ucdat;
		W_8255(0x02,1);			//PC1置0
		DS1302_SCLK=0;
		W_8255(0x03,1);			//PC1置1
		v_RTInputByte(address); /* 地址,命令 */
		ucdat = uc_RTOutputByte(); /* 读1Byte 数据 */
		DS1302_SCLK=1;
		W_8255(0x02,1);
		return ucdat;
	}

/********************************************************************************************************* 
* 
*	       	    							DS1302初始时间设定子函数
*     	入口参数:(初始时间设定)
*		返回值:成功则返回TRUE
*		功能:DS1302初始时间设定(BCD)
*
*********************************************************************************************************/

	bool v_Set1302(void)
	{
		v_W1302(DS1302_CON_WR,0x00); // 控制命令,WP=0,写操作

		v_W1302(DS1302_SEC_WR,	TIME.SEC	);	// 秒 分 时 日 月 星期 年
		v_W1302(DS1302_MIN_WR,	TIME.MIN	);	
		v_W1302(DS1302_HR_WR,	TIME.HR	);
		v_W1302(DS1302_DATE_WR,	TIME.DATE	);
		v_W1302(DS1302_MONTH_WR,TIME.MONTH	);
		v_W1302(DS1302_DAY_WR,	TIME.DAY	);
		v_W1302(DS1302_YEAR_WR,	TIME.YEAR	);

		v_W1302(DS1302_CON_WR,0x80); /* 控制命令,WP=1,写保护*/

		return TRUE;
	}

/*********************************************************************************************************  
*
*	       	    							DS1302当前时间读取子函数
*     	入口参数:(用于时间存放的结构体变量)
*		返回值:将读取到的时间存入给定的存放单元中
*		功能:读取DS1302当前时间并存入指定结构体变量内(BCD)
*
*********************************************************************************************************/

	bool v_Get1302(void)
	{
		TIME.SEC	= uc_R1302(DS1302_SEC_RD	);
		TIME.MIN	= uc_R1302(DS1302_MIN_RD	);
		TIME.HR		= uc_R1302(DS1302_HR_RD		);
		TIME.DATE	= uc_R1302(DS1302_DATE_RD	);
		TIME.MONTH	= uc_R1302(DS1302_MONTH_RD	);
		TIME.DAY	= uc_R1302(DS1302_DAY_RD	);
		TIME.YEAR	= uc_R1302(DS1302_YEAR_RD	);

		return TRUE;
	}

/********************************************************************************************************* 
*
*	       	    							初始化 DS1302
*
*********************************************************************************************************/

	bool DS1302_initial(void)
	{
		DS1302_SCLK=0;
		W_8255(0x02,1);
		v_W1302(DS1302_CON_WR,0x00);
		v_W1302(0x90,0x00);
		return TRUE;
	}

/********************************************************************************************************* 
*
*	       	    							结构体成员-数值转换
*
*********************************************************************************************************/

	bool DIS_D_Z(void)
	{
		uchar a,b;
		
		a=TIME.YEAR>>4;
		b=TIME.YEAR&0x0F;
		DIS_BUF_D[0][0]=a+0x30;
		DIS_BUF_D[0][1]=b+0x30;
		
		a=TIME.MONTH>>4;
		b=TIME.MONTH&0x0F;
		DIS_BUF_D[1][0]=a+0x30;
		DIS_BUF_D[1][1]=b+0x30;

		a=TIME.DATE>>4;
		b=TIME.DATE&0x0F;
		DIS_BUF_D[2][0]=a+0x30;
		DIS_BUF_D[2][1]=b+0x30;

		a=TIME.DAY>>4;
		b=TIME.DAY&0x0F;
		DIS_BUF_D[3][0]=a+0x30;
		DIS_BUF_D[3][1]=b+0x30;

		a=TIME.HR>>4;
		b=TIME.HR&0x0F;
		DIS_BUF_D[4][0]=a+0x30;
		DIS_BUF_D[4][1]=b+0x30;

		a=TIME.MIN>>4;
		b=TIME.MIN&0x0F;
		DIS_BUF_D[5][0]=a+0x30;
		DIS_BUF_D[5][1]=b+0x30;

		a=TIME.SEC>>4;
		b=TIME.SEC&0x0F;
		DIS_BUF_D[6][0]=a+0x30;
		DIS_BUF_D[6][1]=b+0x30;

		return TRUE;
	}

⌨️ 快捷键说明

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