📄 ds1302_code.txt
字号:
//---程序说明---//
/*--------------------------------------------------------------------
程序名 DS1302时钟驱动函数
作者 杜洋
创建日 2007-3-15
使用说明 直接调用各函数
系统要求 CPU MCS-51 12MHZ
DoYoung.net 创造独立资源
--------------------------------------------------------------------*/
/****************************************************************************/
//头文件
#include <AT89X52.h>
/*****************************************************************************/
//定义DS1302时钟接口
sbit clock_clk = P3 ^ 5;//ds1302_clk(时钟线)
sbit clock_dat = P3 ^ 4;//ds1302_dat(数据线)
sbit clock_Rst = P3 ^ 3;//ds1302_Rst(复位线)
/****************************************************************************/
//定义全局变量
unsigned char yy,mo,dd,xq,hh,mm,ss;//定义时间映射全局变量(专用寄存器)
bit w = 0; //调时标志位
/*****************************************************************************/
//常用时钟数据读取
void read_clockS(void){
ss = read_clock(0x81);//读取秒数据
mm = read_clock(0x83);//读取分钟数据
hh = read_clock(0x85);//小时
dd = read_clock(0x87);//日
mo = read_clock(0x89);//月
xq = read_clock(0x8b);//星期
yy = read_clock(0x8d);//年
}
/*****************************************************************************/
//调时用加1程序(上层应用)
void Set_time(unsigned char sel){ //根据选择调整的相应项目加1并写入DS1302
signed char address,item;
signed char max,mini;
lcm_w_test(0,0x9a);
lcm_w_word("调整");
//if(sel==6) {address=0x80; max=0;mini=0;} //秒7
if(sel==5) {address=0x82; max=59;mini=0;} //分钟6
if(sel==4) {address=0x84; max=23;mini=0;} //小时5
if(sel==3) {address=0x8a; max=7;mini=1;} //星期4
if(sel==2) {address=0x86; max=31;mini=1;} //日3
if(sel==1) {address=0x88; max=12;mini=1;} //月2
if(sel==0) {address=0x8c; max=99; mini=0;} //年1
//读取1302某地址上的数值转换成10进制赋给item
item=((read_clock(address+1))/16)*10 + (read_clock(address+1))%16;
if(KEY_2 == 0){
item++;//数加 1
}
if(KEY_4 == 0){
item--;//数减 1
}
if(item>max) item=mini;//查看数值有效范围
if(item<mini) item=max;
write_clock(0x8e,0x00);//允许写操作
write_clock(address,(item/10)*16+item%10);//转换成16进制写入1302
write_clock(0x8e,0x80);//写保护,禁止写操作
updata (); //刷新数据
lcm_w_mm();//刷新 分
}
/*****************************************************************************/
//设置1302的初始时间
void Init_1302(void){//(2008年1月1日00时00分00秒星期二)
write_clock(0x8e,0x00);//允许写操作
write_clock(0x8c,0x08);//年
write_clock(0x8a,0x02);//星期
write_clock(0x88,0x01);//月
write_clock(0x86,0x01);//日
write_clock(0x84,0x00);//小时
write_clock(0x82,0x00);//分钟
write_clock(0x80,0x00);//秒
write_clock(0x90,0xa5);//充电
write_clock(0x8e,0x80);//禁止写操作
}
/*****************************************************************************/
//DS1302写数据(底层协议)
void write_clock(unsigned char ord, unsigned char dd){
clock_clk=0;
clock_Rst=0;
clock_Rst=1;
clock_out(ord);
clock_out(dd);
clock_Rst=0;
clock_clk=1;
}
/*****************************************************************************/
//1302驱动程序(底层协议)
void clock_out(unsigned char dd){
ACC=dd;
clock_dat=a0; clock_clk=1; clock_clk=0;
clock_dat=a1; clock_clk=1; clock_clk=0;
clock_dat=a2; clock_clk=1; clock_clk=0;
clock_dat=a3; clock_clk=1; clock_clk=0;
clock_dat=a4; clock_clk=1; clock_clk=0;
clock_dat=a5; clock_clk=1; clock_clk=0;
clock_dat=a6; clock_clk=1; clock_clk=0;
clock_dat=a7; clock_clk=1; clock_clk=0;
}
/*****************************************************************************/
//DS1302写入字节(底层协议)
unsigned char clock_in(void){
clock_dat=1;
a0=clock_dat;
clock_clk=1; clock_clk=0; a1=clock_dat;
clock_clk=1; clock_clk=0; a2=clock_dat;
clock_clk=1; clock_clk=0; a3=clock_dat;
clock_clk=1; clock_clk=0; a4=clock_dat;
clock_clk=1; clock_clk=0; a5=clock_dat;
clock_clk=1; clock_clk=0; a6=clock_dat;
clock_clk=1; clock_clk=0; a7=clock_dat;
return(ACC);
}
/*****************************************************************************/
//DS1302读数据(底层协议)
unsigned char read_clock(unsigned char ord){
unsigned char dd=0;
clock_clk=0;
clock_Rst=0;
clock_Rst=1;
clock_out(ord);
dd=clock_in();
clock_Rst=0;
clock_clk=1;
return(dd);
}
/*****************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -