📄 ds1302.c
字号:
//*******************************************************************
//***此程序为调试通过的源程序
//***由南京赛博电子有限公司提供
//***文件名:sy0606.C***//
//***是51系例单片机的最小系统
//***有AT89S51/52的在线下载功能
//***IIC总线芯片为24C02,记存密码
//*******************************************************************
#include"reg52.h"
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define nop _nop_() /* 定义空操作指令 */
sbit clk=P1^3; /*时钟芯片DS1302时钟输入端*/
sbit DINOUT=P1^4; /*DS1302时钟芯片数据输入输出端*/
sbit RST=P1^5; /*DS1302芯片复位起始端*/
sbit en =P1^7; /*DTLED-6显示芯片使能端*/
sbit dout=P1^6; /*DTLED-6显示芯片数据读入端*/
sbit ts_clk=P1^3;
uchar dispbuf[9]; /*显示值存放阵列*/
uchar clocktmp[3]; /*显示值存放阵列*/
uchar clockbak;
void tsled(void); /*串行发送到DTLED-6副程式*/
void Rd1302st(void); /*读时钟芯片DS1302*/
void Rd1302(void); /*读时钟芯片DS1302*/
void Wr1302(void); /*写时钟芯片DS1302*/
/***********************************************************************/
void delay (unsigned int value) /*延时副程式*/
{
while (value!=0) value--; /*10US延时*/
}
/***********************************************************************/
void main(void) /*主程式*/
{
dispbuf[0]=0x03; /*小数点位*/
dispbuf[7]=0x01; /*ID号码*/
Wr1302(); /*写时钟芯片DS1302*/
delay(10);
Rd1302st(); /*启动时钟芯片振荡器*/
delay(10);
while(1)
{
Rd1302(); /*读时钟芯片DS1302*/
if(dispbuf[1]!=clockbak) /*秒加一*/
{
clockbak=dispbuf[1];
tsled(); /*串行发送到DTLED-6副程式*/
}
}
}
/*********************************************************************/
//串行发送DTLED-6显示
void tsled(void) /*串行发送DTLED-6显示副程式*/
{ char ts0,i,j;
ts_clk=0;
en=0;
delay(10);
for(j=0;j<9;j++)
{ ts0=dispbuf[j];
for(i=0;i<4;i++) /*发小数点码8,4,2,1*/
{
ts_clk=1;
ts0=ts0<<1;
if(AC==1)
dout=1;
else dout=0;
ts_clk=0;
nop;
delay(3);
}
}
en=1;
} /*返回主程式*/
//======================================================================
void Wr1302(void) /*写时钟芯片DS1302*/
{char i,j,ts0,conb,conbyt;
conb=0x80;
ts0=conb;
//
for(j=0;j<3;j++) /*写秒,分,时三次循环*/
{clk=RST=0; /*DS1302系统初始化*/
nop;nop;
RST=1;
for(i=0;i<8;i++) /*写控制字到DS1302*/
{clk=0; /*清时钟*/
if(conb&0x01)
DINOUT=1;
else DINOUT=0;
clk=1; /*时钟上升沿,发送数据有效*/
conb=conb>>1;
nop;
}
clk=0; /*清时钟*/
conb=ts0+2+j*2;
conbyt=clocktmp[j]&0x7f;
for(i=0;i<8;i++) /*写设定值到DS1302*/
{clk=0; /*清时钟*/
if(conbyt&0x01)
DINOUT=1;
else DINOUT=0;
clk=1; /*时钟上升沿,发送数据有效*/
conbyt=conbyt>>1;
nop;
}
delay(5);
RST=0;
nop;
}
}
/*返回主程式*/
/******************************************************/
void Rd1302st() /*启动时钟芯片振荡器*/
{
char i,ts0,conb,conbyt;
Rd1302();
conbyt=clocktmp[0]&0x7f;
conb=0x80;
ts0=conb;
clk=RST=0; /*DS1302系统初始化*/
nop;nop;
RST=1;
for(i=0;i<8;i++) /*写控制字到DS1302*/
{ clk=0; /*清时钟*/
if(conb&0x01)
DINOUT=1;
else DINOUT=0;
clk=1; /*时钟上升沿,发送数据有效*/
conb=conb>>1;
nop;
}
clk=0; /*清时钟*/
for(i=0;i<8;i++) /*写控制字到DS1302*/
{ clk=0; /*清时钟*/
if(conbyt&0x01)
DINOUT=1;
else DINOUT=0;
clk=1; /*时钟上升沿,发送数据有效*/
conbyt=conbyt>>1;
nop;
}
delay(5);
RST=0;
nop;
} /*返回主程式*/
/******************************************************/
void Rd1302() /*读时钟芯片DS1302*/
{char i,j,ts0,conb;
conb=0x81;
clocktmp[0]=0;
clocktmp[1]=0;
clocktmp[2]=0;
ts0=conb;
for(j=0;j<3;j++)
{clk=RST=0; /*DS1302系统初始化*/
nop;nop;
RST=1;
for(i=0;i<8;i++) /*写控制字到DS1302*/
{
clk=0; /*清时钟*/
if(conb&0x01)
DINOUT=1;
else DINOUT=0;
clk=1; /*时钟上升沿,发送数据有效*/
conb=conb>>1;
nop;
}
conb=ts0=ts0+2;
clk=0;
for(i=0;i<7;i++) /*读时钟芯片的时分秒单元*/
{
if(DINOUT==1)
clocktmp[j]=clocktmp[j]|0x80;
else clocktmp[j]=clocktmp[j]&0x7f;
clk=1;
clocktmp[j]=clocktmp[j]>>1; /*接收暂存单元*/
nop;
clk=0; /*时钟下降沿,接收数据有效*/
}
delay(5);
RST=0;
delay(10);
}
dispbuf[1]=clocktmp[0]&0x0f; /*转换秒分时显示单元*/
dispbuf[2]=clocktmp[0]>>4&0x07;
dispbuf[3]=clocktmp[1]&0x0f;
dispbuf[4]=clocktmp[1]>>4&0x07;
dispbuf[5]=clocktmp[2]&0x0f;
dispbuf[6]=clocktmp[2]>>4&0x03;
} /*返回主程式*/
//**************************************************************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -