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

📄 1302

📁 ds1302与数码管时间可调
💻
字号:
/************DS1302时序****************/
#define uchar unsigned char   	//宏定义
/****端口定义*****/
sbit T_CLK = P3^6;   		//设置实时时钟时钟线引脚 //
sbit T_IO = P3^4;     		//设置实时时钟数据线引脚 //
sbit T_RST = P3^5;    		//设置实时时钟复位线引脚 //
/*****************/
sbit ACC0=ACC^0;   		//定义ACC的位,利用ACC操作速度最快
sbit ACC7=ACC^7;
uchar time1[8];//数码管段选高位到低位
uchar  counter[3]; //液晶段选高位到低位
/*********时分秒定义变量定义************/                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                
uchar sec,min,hou,day,mon,yea;//定义变量
/****************************************/
/****************************************/
void Init1302(void);//DS1302初始化
void v_WTInputByte(uchar ucDa);//写数据
uchar uc_RTOutputByte(void);//读数据
void v_W1302(uchar ucAddr, uchar ucDa);//先写地址,后写数据
uchar uc_R1302(uchar ucAddr);//先读地址,后读数据
void get_time(void);//取出时间,在数码管显示
void set_time(void);
/****************************************/
/****************************************/
/*********往DS1302写入1Byte数据**************/ 
void v_WTInputByte(uchar ucDa) 
{ 
	uchar i;	  // 定义yi变量
	ACC= ucDa;
	for(i=8; i>0; i--)
 {
		T_IO = ACC0; //*相当于汇编中的 RRC 
		T_CLK = 1; 	//时钟线置一
		T_CLK = 0;	//关闭时钟线
		ACC =ACC>> 1; 
	}
}
/**********从DS1302读取1Byte数据********************/

uchar uc_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); 
}
/***往DS1302写入数据,先写地址,后写命令/数据*******/
void v_W1302(uchar ucAddr, uchar ucDa)
{
	T_RST = 0;
	T_CLK = 0;
	T_RST = 1;
	v_WTInputByte(ucAddr); /* 地址,命令 */
	v_WTInputByte(ucDa); /* 写1Byte数据*/
	T_CLK = 1;
	T_RST =0;
}
/*****读取DS1302某地址的数据,先写地址,后读命令/数据*********/
uchar uc_R1302(uchar ucAddr)
{
	uchar ucDa;
	T_RST = 0;
	T_CLK = 0;
	T_RST = 1;
	v_WTInputByte(ucAddr); /* 地址,命令 */
	ucDa = uc_RTOutputByte(); /* 读1Byte数据 */
	T_CLK = 1;
	T_RST = 0;
	return(ucDa);
}
/***************初始化DS1302*******************/
void init1302(void)
{
	v_W1302(0x8e,0x00); //控制写入WP=0
	v_W1302(0x90,0xa5);
	v_W1302(0x80,0x56); //秒
	v_W1302(0x82,0x42); //分
	v_W1302(0x84,0x13); //时
	v_W1302(0x86,0x00); //日
	v_W1302(0x88,0x00); //月
	v_W1302(0x8a,0x00); //星期
	v_W1302(0x8c,0x00); //年 
	v_W1302(0x8e,0x80);
}
/*******取出时间并处理,以便送数码管显示*********/ 
void get_time(void)
{
	uchar d;
	d=uc_R1302(0x81);
	counter[0]=d/16*10+d%16;  //十六进制转换为BCD码
	time1[7]=d&0x0f;
	time1[6]=(d>>4)&0x0f;
	time1[5]=10;
	d=uc_R1302(0x83);
	counter[1]=d/16*10+d%16;  //十六进制转换为BCD码
	time1[4]=d&0x0f;
	time1[3]=(d>>4)&0x0f;
	time1[2]=10;
	d=uc_R1302(0x85);
	counter[2]=d/16*10+d%16;  //十六进制转换为BCD码
	time1[1]=d&0x0f;
	time1[0]=(d>>4)&0x0f;//显示十位
}
void set_time(void)
{
	v_W1302(0x8e,0x00);
	v_W1302(0x80,sec);
	v_W1302(0x82,min);
	v_W1302(0x84,hou);
	v_W1302(0x86,day);
	v_W1302(0x88,mon);
	v_W1302(0x8c,yea);
	v_W1302(0x80,0x00);
	v_W1302(0x8e,0x80);
}

⌨️ 快捷键说明

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