📄 1302.c
字号:
#include <reg52.h>
#define uchar unsigned char
sbit clock_clk =P1^5; //与硬件相关的连线 clk为DS1302的时钟信号线
sbit clock_dat=P1^6; //DAT为DS1302的I/O数据线
sbit clock_Rst =P1^7; //RST为DS1302的RST信号线
sbit a0 = ACC ^ 0;
sbit a1 = ACC ^ 1;
sbit a2 = ACC ^ 2;
sbit a3 = ACC ^ 3;
sbit a4 = ACC ^ 4;
sbit a5 = ACC ^ 5;
sbit a6 = ACC ^ 6;
sbit a7 = ACC ^ 7;
sbit key1=P1^2;
sbit key2=P1^3;
sbit key4=P1^5;
uchar set;
uchar j0,j1,j2,j3,j4,j5,j6,j7,k0,k1,k2,k3,k4,k5,k6,k7;
uchar code time[] = {0x00,0x10,0x7,0x1,0x1,0x01,0x07};
uchar year,month,day,week,hour,min,sec;
/****************************函数定义**************************************/
/******************************************************************/
/* 函数名:write(address);
/* 参 数:地址/数据字节
/* 功 能:用于向DS1302输入地址或数据信息
/******************************************************************/
void clock_out(unsigned char dd){ //write ds1302
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;
}
/*****************************************************************************/
unsigned char clock_in(void){ //read ds1302
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);
}
/*****************************************************************************/
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);
}
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;
}
void Init_1302(void){ //(2000年1月1日00时00分00秒星期一)
uchar i;
write_clock(0x8e,0x00);//允许写操作
for(i=0;i<7;i++){
write_clock(0x80+i+i,time[i]);
}
write_clock(0x90,0xa5);//充电
write_clock(0x8e,0x80);//禁止写操作
}
void delay0(uchar x){
uchar i,j;
for(i=0;i<x;i++)
for(j=0;j<125;j++);
}
uchar DeToBCD(uchar DE){
return (DE/10)*16+DE%10;
}
time_set(){
if(!key1){
delay0(20);
if(!key1){
set++;
if(set == 8){
set = 0;
}
}while(!key1);
}
if(set == 1){//秒
write_clock(0x8e,0x00);
if(!key2){
delay0(20);
if(!key2){
j0++;
if(j0==59){
j0=0;
}
}
while(!key2);
}
k0 = DeToBCD(j0);
write_clock(0x80,0+k1);
write_clock(0x8e,0x80);
}
if(set == 2){//分
write_clock(0x8e,0x00);
if(!key2){
delay0(20);
if(!key2){
j1++;
if(j1==59){
j1=0;
}
}
while(!key2);
}
k1 = DeToBCD(j1);
write_clock(0x82,0+k1);
write_clock(0x8e,0x80);
}
if(set == 3){//时
write_clock(0x8e,0x00);
if(!key2){
delay0(20);
if(!key2){
j2++;
if(j2==24){
j2=1;
}
}
while(!key2);
}
k2= DeToBCD(j2);
write_clock(0x84,0+k2);
write_clock(0x8e,0x80);
}
if(set == 4){//日
write_clock(0x8e,0x00);
if(!key2){
delay0(20);
if(!key2){
j3++;
if(j3==31){
j3=1;
}
}
while(!key2);
}
k3 = DeToBCD(j3);
write_clock(0x86,0+k3);
write_clock(0x8e,0x80);
}
if(set == 5){//月
write_clock(0x8e,0x00);
if(!key2){
delay0(20);
if(!key2){
j4++;
if(j4==12){
j4=1;
}
}
while(!key2);
}
k4 = DeToBCD(j4);
write_clock(0x88,0+k4);
write_clock(0x8e,0x80);
}
if(set == 6){//周
write_clock(0x8e,0x00);
if(!key2){
delay0(20);
if(!key2){
j5++;
if(j5==7){
j5=1;
}
}
while(!key2);
}
k5 = DeToBCD(j5);
write_clock(0x8a,0+k5);
write_clock(0x8e,0x80);
}
if(set == 7){//年
write_clock(0x8e,0x00);
if(!key2){
delay0(20);
if(!key2){
j6++;
if(j6==99){
j6=0;
}
}
while(!key2);
}
k6 = DeToBCD(j6);
write_clock(0x8c,0+k6);
write_clock(0x8e,0x80);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -