|
程序用数码管显示是没问题的,调整分的时候小时会变成0,然后又恢复正常了,分钟调整是没问题的
#include <REGX52.H>
#define WRITE_SECOND 0x80
#define WRITE_MINUTE 0x82
#define WRITE_HOUR 0x84
#define READ_SECOND 0x81
#define READ_MINUTE 0x83
#define READ_HOUR 0x85
#define WRITE_PROTECT 0x8E
sbit ACC_7=ACC^7;//位寻址寄存器定义
sbit SCLK=P2^0; // DS1302时钟信号 7脚
sbit DIO=P2^1; // DS1302数据信号 6脚
sbit CE=P2^2; // DS1302片选 5脚
unsigned char Hour_10_bit,Hour_0_bit,Min_10_bit,Min_0_bit,Sec_10_bit,Sec_0_bit,g_bSystemTime2Ms,Hour,Min,Sec;
void Write1302 ( unsigned char addr,dat ) //地址、数据发送子程序
{
unsigned char i,temp;
CE=0; //CE引脚为低,数据传送中止
SCLK=0; //清零时钟总线
CE = 1; //CE引脚为高,逻辑控制有效//发送地址
for ( i=8; i>0; i-- ) //循环8次移位
{
SCLK=0;//上升沿准备
temp=addr;
DIO=(bit)(temp&0x01);//每次传输低字节
addr>>= 1;//右移一位
SCLK=1;//形成上升沿
}
for ( i=8; i>0; i-- )
{
SCLK=0;//上升沿准备
temp=dat;
DIO=(bit)(temp&0x01);
dat>>=1;
SCLK=1;//形成上升沿
}
CE=0;
}
unsigned char Read1302 (unsigned char addr )//数据读取子程序
{
unsigned char i,temp,dat1,dat2;
CE=1;
for ( i=8; i>0; i-- ) //发送地址 //循环8次移位
{
SCLK=0;//上升沿准备
temp=addr;
DIO=(bit)(temp&0x01);//每次传输低字节
addr>>=1;//右移一位
SCLK=1; //形成上升沿
}
for ( i=8;i>0;i--)
{
ACC_7=DIO;
SCLK=1;//下降沿准备
ACC>>=1;
SCLK=0;//形成下降沿
}
CE=0;
dat1=ACC;
dat2=dat1/16; //数据进制转换
dat1=dat1%16; //十六进制转十进制
dat1=dat1+dat2*10;
return (dat1);
}
void Initial_DS1302( )//初始化DS1302
{
Write1302(WRITE_PROTECT,0X00); //关写保护
Write1302(WRITE_SECOND,0x40); //秒位初始化
Write1302(WRITE_MINUTE,0x59); //分钟初始化
Write1302(WRITE_HOUR,0x02); //小时初始化
Write1302(WRITE_PROTECT,0x80); //开写保护
}
void Read_1302( )
{
if(g_bSystemTime2Ms>30)
{
TR0=0;
g_bSystemTime2Ms=0;
TR0=1;
Hour=Read1302(READ_HOUR);//读取时
Min=Read1302(READ_MINUTE);//读取分
Sec=Read1302(READ_SECOND);//读取秒
Hour_10_bit=Hour/10;
Hour_0_bit=Hour%10;
Min_10_bit=Min/10;
Min_0_bit=Min%10;
Sec_10_bit=Sec/10;
Sec_0_bit=Sec%10;
}
} |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
|