📄 1302
字号:
/************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 + -