找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2027|回复: 0
打印 上一主题 下一主题
收起左侧

DS1302实时时钟显示PC

[复制链接]
跳转到指定楼层
楼主

#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned  int
sbit DS1302_CLK=P3^2;
sbit DS1302_IO=P3^3;
sbit DS1302_RST=P3^4;
sbit ACC0=ACC^0;
sbit ACC7=ACC^7;
sbit Tiaoshi=P3^7;
sbit Inck=P3^6;
uint count;
uchar temp,clsclk;
an=0x90;
Inck_flag=0x20;
typedef struct
{
uchar Second;
uchar Minute;
uchar Hour;
uchar TimeStr[6];
}
SYSTEMTIME;
SYSTEMTIME CurrentTime;
#define DS1302_SECONE 0x80
#define DS1302_MINUTE 0x82
#define DS1302_HOUR 0x84
void mdelay(uint count)
{
uchar i,j;
for(i=0;i<count;i++)
{
for(j=0;j<106;j++);
}
}
void DS1302InputByte(uchar d)
{
uchar i;
ACC=d;
for(i=8;i>0;i--)
{
DS1302_IO=ACC0;
DS1302_CLK=1;
DS1302_CLK=0;
ACC=ACC>>1;
}
}
uchar DS1302OutputByte(void)
{
uchar i;
for(i=8;i>0;i--)
{
ACC=ACC>>1;
ACC7=DS1302_IO;
DS1302_CLK=1;
DS1302_CLK=0;
}
return(ACC);
}
void Write1302(uchar ucAddr,uchar ucDa)
{
DS1302_RST=0;
DS1302_CLK=0;
DS1302_RST=1;
DS1302InputByte(ucAddr);
DS1302InputByte(ucDa);
}
uchar Read1302(ucAddr)
{
uchar ucData;
DS1302_RST=0;
DS1302_CLK=0;
DS1302_RST=1;
DS1302InputByte(ucAddr|0x01);
ucData=DS1302OutputByte();
DS1302_CLK=1;
DS1302_RST=0;
return(ucData);
}
void DS1302_SetTime(uchar Address,uchar Value)
{
Write1302(0x8E,0x00);
Write1302(Address,((Value/10)<<4|(Value%10)));
}
void DS1302_GetTime(SYSTEMTIME*Time)
{
uchar ReadValue;
ReadValue=Read1302(DS1302_SECONE);
Time->Second=((ReadValue&0x70)>>4)*10+(ReadValue&0x0F);
ReadValue=Read1302(DS1302_MINUTE);
Time->Minute=((ReadValue&0x70)>>4)*10+(ReadValue&0x0F);
ReadValue=Read1302(DS1302_HOUR);
Time->Hour=((ReadValue&0x70)>>4)*10+(ReadValue&0x0F);
}
void TimeToStr(SYSTEMTIME*Time)
{
Time->TimeStr[0]=Time->Hour/10;
Time->TimeStr[1]=Time->Hour%10;

Time->TimeStr[2]=Time->Minute/10;
Time->TimeStr[3]=Time->Minute%10;

Time->TimeStr[4]=Time->Second/10;
Time->TimeStr[5]=Time->Second%10;
}
void Dis(SYSTEMTIME*Time)
{
uchar disbit,shifb;
DS1302_GetTime(Time);
TimeToStr(Time);
disbit=1;
switch(count)
{
case 0:for(shifb=0;shifb<6;shifb++)
{
_nop_();_nop_();
P1=Time->TimeStr[shifb];
P2=_crol_(disbit,shifb);
mdelay(6);
P2=0;
}
break;

case 1:for(shifb=0;shifb<2;shifb++)
{
_nop_();_nop_();
P1=Time->TimeStr[shifb];
P2=_crol_(disbit,shifb);
mdelay(6);
P2=0;
}
break;
case 2:for(shifb=2;shifb<4;shifb++)
{
_nop_();_nop_();
P1=Time->TimeStr[shifb];
P2=_crol_(disbit,shifb);
mdelay(6);
P2=0;
}
break;
case 3:for(shifb=4;shifb<6;shifb++)
{
_nop_();_nop_();
P1=Time->TimeStr[shifb];
P2=_crol_(disbit,shifb);
mdelay(6);
P2=0;
}
break;
case 4:count=0;break;
default:count=0;
break;
}
}
void Setkey()
{
if(Tiaoshi==0)
{
mdelay(8);
count=count+1;
if(count==4)
count=0;
while(Tiaoshi==0);
}
}
void Inckey()
{
if(Inck==0)
{
mdelay(8);
switch(count)
{
case 1:temp=Read1302(DS1302_HOUR);
temp=((temp&0x70)>>4)*10+(temp&0x0F);
temp=temp+1;
if(temp>=24)
temp=0;
Inck_flag=1;
break;

case 2:         temp=Read1302(DS1302_MINUTE);
temp=((temp&0x70)>>4)*10+(temp&0x0F);
temp=temp+1;
Inck_flag=1;
if(temp>=60)
temp=0;
break;

case 3:         temp=Read1302(DS1302_SECONE);
temp=((temp&0x70)>>4)*10+(temp&0x0F);
temp=temp+1;
Inck_flag=1;
if(temp>=60)
temp=0;
break;
default :Inck_flag=0;break;
}
while(Inck==0);
}
}
void Keydone()
{
uchar clsclk;
if(count!=0)
{
Write1302(0x8e,0x00);
clsclk=Read1302(0x80);
Write1302(0x80,clsclk|0x80);
Write1302(0x8e,0x80);
}
Setkey();
switch(count)
{
case 1:do
{
Inckey();
if(Inck_flag==1)
{
temp=(temp/10)<<4|temp%10;
Write1302(0x8e,0x00);
Write1302(0x84,temp);
Write1302(0x8e,0x80);
Inck_flag=0;
}
Dis(&CurrentTime);
}
while(count==2);break;

case 2:do
{
Inckey();
if(Inck_flag==1)
{
temp=(temp/10)<<4|temp%10;
Write1302(0x8e,0x00);
Write1302(0x82,temp);
Write1302(0x8e,0x80);
Inck_flag=0;
}
Dis(&CurrentTime);
}
while(count==3);break;

case 3:do
{
Inckey();
if(Inck_flag==1)
{
temp=(temp/10)<<4|temp%10;
Write1302(0x8e,0x00);
Write1302(0x80,temp|0x80);
Write1302(0x8e,0x80);
Inck_flag=0;
}
Dis(&CurrentTime);
}
while(count==4);break;
case 4:count=0;
break;
default:break;
}
}

void main()
{
Inck_flag=0;
while(1)
{
Dis(&CurrentTime);
Setkey();
if(count!=0)
Keydone();
if(count==0)
{
clsclk=Read1302(0x80);
Write1302(0x80,clsclk&0x7f);
}
}
}


36.zip

123.67 KB, 下载次数: 9, 下载积分: 黑币 -5

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表