前辈,请教一个问题,我的DS12C887+,用STC89C52RC以外部总线方式读取时间,在跨天的时候从23:59变成24:00而不是0:00,然后天数还没增加,这是为什么?我会附上相关截图和代码,谢谢各位!
- #include
- #include "ds12c887.h"
- //ds12c887驱动程序
- void DS12C887_Peri_Write(unsigned char offset,unsigned char dat)
- {
- XBYTE[0x7f00 + offset] = dat;
- }
- unsigned char DS12C887_Peri_Read(unsigned char offset)
- {
- return (XBYTE[0x7f00 + offset]);
- }
- void Settime(PTIME time)
- {
- unsigned char ctrl = 0;
- Set_Bit(ctrl,7); //????SETλ?????????
- DS12C887_Peri_Write(CR_B,ctrl);
- DS12C887_Peri_Write(SEC,time->second);
- DS12C887_Peri_Write(MIN,time->minute);
- DS12C887_Peri_Write(HOUR,time->hour);
- DS12C887_Peri_Write(WEEKDAY,time->weekday);
- DS12C887_Peri_Write(DAY,time->day);
- DS12C887_Peri_Write(MONTH,time->month);
- DS12C887_Peri_Write(YEAR,time->year);
- Clr_Bit(ctrl,7);//????SETλ?????????
- DS12C887_Peri_Write(CR_B,ctrl);
- }
- void GetTime(PTIME time)
- {
- while(DS12C887_Peri_Read(CR_A) & 0x80 != 0);
- time->second = DS12C887_Peri_Read(SEC);
- while(DS12C887_Peri_Read(CR_A) & 0x80 != 0);
- time->minute = DS12C887_Peri_Read(MIN);
- while(DS12C887_Peri_Read(CR_A) & 0x80 != 0);
- time->hour = DS12C887_Peri_Read(HOUR);
- while(DS12C887_Peri_Read(CR_A) & 0x80 != 0);
- time->weekday = DS12C887_Peri_Read(WEEKDAY);
- while(DS12C887_Peri_Read(CR_A) & 0x80 != 0);
- time->day = DS12C887_Peri_Read(DAY);
- while(DS12C887_Peri_Read(CR_A) & 0x80 != 0);
- time->month = DS12C887_Peri_Read(MONTH);
- while(DS12C887_Peri_Read(CR_A) & 0x80 != 0);
- time->year = DS12C887_Peri_Read(YEAR);
- }
- unsigned char DS12C887_Is_LowPower(void)
- {
- if (DS12C887_Peri_Read(CR_D) & 0x80 == 0)
- return LOW_POWER;
- return 0;
- }
- void Alarm(PTIME time)
- {
- unsigned char ctrl = 0;
- DS12C887_Peri_Write(SEC_ALARM,time->second);
- DS12C887_Peri_Write(MIN_ALARM,time->minute);
- DS12C887_Peri_Write(HOUR_ALARM,time->hour);
- Set_Bit(ctrl,5); //????AIEλ,????
- DS12C887_Peri_Write(CR_B,ctrl);
- }
- void Init_DS12C887(void)
- {
- unsigned char ctrl = 0;
- Clr_Bit(ctrl,2); //BCD???
- Set_Bit(ctrl,1); //24***???
- DS12C887_Peri_Write(CR_B,ctrl);
- DS12C887_Peri_Write(CR_A,OSCILLATOR_OPEN);
- }
- unsigned char bcd2dec(unsigned char dat)
- {
- unsigned char temp;
- temp = ((dat >> 4) * 10 + (dat & 0x0f));
- return temp;
- }
- #ifdef SQW_OUTPUT
- void Sqw_Output(unsigned char freq)
- {
- unsigned char ctrl = 0;
- Set_Bit(ctrl,6);
- Set_Bit(ctrl,3);
- DS12C887_Peri_Write(CR_B,ctrl);
- DS12C887_Peri_Write(CR_A,freq);
- }
- void Sqw_Output_NoIrq(unsigned char freq)
- {
- unsigned char ctrl = 0;
- Clr_Bit(ctrl,6);
- Set_Bit(ctrl,3);
- DS12C887_Peri_Write(CR_B,ctrl);
- DS12C887_Peri_Write(CR_A,freq);
- }
- #endif
//置位与清零
- #define Set_Bit(x,n) x |= 1 << n
- #define Clr_Bit(x,n) x &= ~(1 << n)
复制代码
0
已退回1积分
|
|
1个回答
|
|
|
|