27,370
社区成员
发帖
与我相关
我的任务
分享
#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 = P3^5; // DS1302时钟信号 7脚
sbit DIO= P3^6; // DS1302数据信号 6脚
sbit CE = P3^7; // DS1302片选 5脚
//地址、数据发送子程序
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=0;
SCLK=0;
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 = 0;
ACC>>=1;
SCLK = 1;
}
CE=0;
dat1=ACC;
dat2=dat1/16; //数据进制转换
dat1=dat1%16; //十六进制转十进制
dat1=dat1+dat2*10;
return (dat1);
}
//初始化DS1302
void Initial(void)
{
Write1302 (WRITE_PROTECT,0X00); //禁止写保护
Write1302 (WRITE_SECOND,0x56); //秒位初始化
Write1302 (WRITE_MINUTE,0x34); //分钟初始化
Write1302 (WRITE_HOUR,0x12); //小时初始化
Write1302 (WRITE_PROTECT,0x80); //允许写保护
}
//读取数据
for ( i=8; i>0; i-- )
{
SCLK=0;
ACC_7=DIO;
SCLK = 0;
ACC>>=1;
//SCLK = 1;
}
void initial(void)
{ //程序比较乱,大家只要知道:先读时间,只要时间不是00 00和85 85那就读RAM
//DS1302初始化,开启时钟
Write1302(WRITE_PROTECT,0X00); //取消写保护
delay(2);
Write1302(WRITE_SECOND,0x01); //秒位初始化,开启时钟
delay(2);
Write1302(WRITE_PROTECT,0x80);
//时钟和存储数据的读取
hour=Read1302(READ_HOUR,1);
delay(1);
minute=Read1302(READ_MINUTE,1);
if(((hour*100+minute)!=0) && ((hour*100+minute)!=8585)){
step=Read1302(SEP_ADD+1,0);
if(step==0){
step=2;
}
QtyValue[0]=Read1302(PLAN_QTY_ADD+1,0)*100 + Read1302(PLAN_QTY_ADD+3,0);
delay(1);
QtyValue[1]=Read1302(ESTM_QTY_ADD+1,0)*100 + Read1302(ESTM_QTY_ADD+3,0);
delay(1);
QtyValue[2]=Read1302(ACTL_QTY_ADD+1,0)*100 + Read1302(ACTL_QTY_ADD+3,0);
delay(1);
paraQty=Read1302(PAH_QTY_ADD+1,0)+2;
delay(1);
paraStartMode=(bit)Read1302(PAH_MODE_ADD+1,0);
delay(1);
readPAH2();
delay(1);
rest=paraStartMode;
delay(1);
for(paraEditPoint=0;paraEditPoint>3;paraEditPoint++){
resetHour[paraEditPoint]=Read1302(RESET_TIME_ADD+1+paraEditPoint*4,0);
delay(1);
resetMinute[paraEditPoint]=Read1302(RESET_TIME_ADD+1+paraEditPoint*4+2,0);
delay(1);
}
}
//else{
// QtyValue[2]=hour*100+minute;
//}
//模式指针初始化
beep();//初始化完后,蜂鸣器叫一声
}