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

📄 ds1302.c

📁 51单片机驱动的LED点阵万年历显示
💻 C
字号:
#include<reg52.h>
#include<rtx51tny.h>
#include"inc/define.h"
#include"inc/ds1302.h"

sbit rtc_rst=P1^5;
sbit rtc_clk=P1^6;
sbit rtc_io=P1^7;
sbit ACC_0=ACC^0;
sbit ACC_7=ACC^7;

extern vu8 idata for_showh[6];	
extern vu8 idata for_showl[6];									
extern vu8 idata week_tempert[8];


vu8 nowTime[7][2];


/*********************************************************
*将获取的当前时间、日期设置为待显示数据
*函数名称:setTimeShowData()
*说明:这是一个RTX51任务,os_create_task(2)之后开始运行
*********************************************************/
void setTimeShowData(void ) _task_ 3	
{
	

	while(1)
	{
		getTime(nowTime);
	
		for_showh[0]=nowTime[6][1];		//设置年
		for_showh[1]=nowTime[6][0];
		for_showh[2]=nowTime[4][1];		//设置月
		for_showh[3]=nowTime[4][0];
		for_showh[4]=nowTime[3][1];		//设置日
		for_showh[5]=nowTime[3][0];
		
		if(!(nowTime[2][1] & 0x08))		//24时制
			for_showl[0]=(nowTime[2][1] & 0x03);	//设置时
		else							//12时制
			for_showl[0]=(nowTime[2][1] & 0x01);	//设置时
		for_showl[1]=nowTime[2][0];
		for_showl[2]=nowTime[1][1];		//设置分
		for_showl[3]=nowTime[1][0];
		for_showl[4]=nowTime[0][1];		//设置秒
		for_showl[5]=nowTime[0][0];
			
		week_tempert[2]=nowTime[5][0];	//设置周 		
		os_wait(K_TMO,4,0);
	}
}



/*********************************************************************
*向DS1302输入一个字节
*函数名称:DS1302_inputByte()
*说明:从低位开始传输
**********************************************************************/
void DS1302_inputByte(u8 byte)
{
	u8 i;
	ACC=byte;

	for(i=8;i>0;i--)
	{
		rtc_io=ACC_0;
		rtc_clk=1;	//上升沿写入一位数据
		rtc_clk=0;
		ACC=ACC>>1;
	}
}


/*********************************************************************
*从DS1302读出一个字节
*函数名称:DS1302_output()
*说明:从地位开始传输
**********************************************************************/
u8 DS1302_outputByte()
{
	u8 i;

	for(i=8;i>0;i--)
	{
	//	rtc_io=1;	//P1为准双向口,作为输入前先置高电平

		ACC=ACC>>1;	
		rtc_clk=0;	//下降沿读出一位数据
		ACC_7=rtc_io;	//???读一次读不到,应该是proteus设置的问题
		ACC_7=rtc_io;
		rtc_clk=1;
	}
	return ACC;
}


/***************************************************************
*写一个字节的时间数据到DS1302的时间寄存器
*函数名称:wr_1302()
*说明:
****************************************************************/
void wr_1302(u8 cmdw,u8 byte)
{
	rtc_rst=0;	//复位终止当前数据传输,准备新的数据传输
	rtc_clk=0;	//SCLK置低为~RST置高做准备
	rtc_rst=1;	//启动数据传送
	DS1302_inputByte(cmdw);
	DS1302_inputByte(byte);
	rtc_rst=0;	
}


/****************************************************************
*从DS1302的时间寄存器读一个字节的时间数据出来
*函数名称:rd_1302()
*说明:
*****************************************************************/
u8 rd_1302(u8 cmdw)
{
	u8 byte;

	rtc_rst=0;	//复位终止当前数据传输,准备新的数据传输
	rtc_clk=0;	//SCLK置低为~RST置高做准备
	rtc_rst=1;	//启动数据传送
	DS1302_inputByte(cmdw);
	byte=DS1302_outputByte();
	rtc_rst=0;

	return byte;
}


/*****************************************************************
*将给定时间设定为当前时间
*函数名称:setTime()
*说明:
******************************************************************/
void setTime(u8 newTime[7][2])
{
	u8 i;
	u8 cmdw=0x80;			//
	u8 sect;
	wr_1302(0x8e,0x00);		//关闭写保护
	for(i=0;i<7;i++)
	{
		if(i==5)	//星期不设置,由芯片自动设置
			;
		else
		{
			sect=newTime[i][1]<<4;
			sect+=newTime[i][0];
			wr_1302(cmdw,sect);
		}

		cmdw+=2;
	}
	wr_1302(0x8e,0x80);		//开启写保护
}


/****************************************************************
*从DS1302读取当前时间
*函数名称:getTime()
*说明:
*****************************************************************/
void getTime(u8 nowTime[7][2])
{
	u8 i;
	u8 cmdw=0x81;
	u8 sect;
	for(i=0;i<7;i++)
	{
		sect=rd_1302(cmdw);
		nowTime[i][0]=sect & 0x0F;
		nowTime[i][1]=(sect>>4) & 0x0F;

		cmdw+=2;
	}
}

⌨️ 快捷键说明

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