使用同样的读写程序和其他硬件进行更换计时芯片做了如下实验
sbit DS1302_CLK = P2^5; //实时时钟时钟线引脚7
sbit DS1302_IO = P2^6; //实时时钟数据线引脚6
sbit DS1302_RST = P2^7; //实时时钟复位线引脚5
//定义累加器A中的各位
sbit a0 = ACC^0;
sbit a1 = ACC^1;
sbit a2 = ACC^2;
sbit a3 = ACC^3;
sbit a4 = ACC^4;
sbit a5 = ACC^5;
sbit a6 = ACC^6;
sbit a7 = ACC^7;
unsigned char DS1302_ReadByte(void)//-DS1302写入字节(底层协议)
{
DS1302_IO = 1;
a0 = DS1302_IO;
DS1302_CLK = 1;
_nop_();
DS1302_CLK = 0;
_nop_();
a1 = DS1302_IO;
DS1302_CLK = 1;
_nop_();
DS1302_CLK = 0;
_nop_();
a2 = DS1302_IO;
DS1302_CLK = 1;
_nop_();
DS1302_CLK = 0;
_nop_();
a3 = DS1302_IO;
DS1302_CLK = 1;
_nop_();
DS1302_CLK = 0;
_nop_();
a4 = DS1302_IO;
DS1302_CLK = 1;
_nop_();
DS1302_CLK = 0;
_nop_();
a5 = DS1302_IO;
DS1302_CLK = 1;
_nop_();
DS1302_CLK = 0;
_nop_();
a6 = DS1302_IO;
DS1302_CLK = 1;
_nop_();
DS1302_CLK = 0;
_nop_();
a7 = DS1302_IO;
return(ACC);
}
/****************************************************************************************************************/
void write_time_byte(unsigned char dd)//向DS1302写1字节数据
{ //-1302驱动程序(底层协议)
ACC = dd;
DS1302_IO = a0;
_nop_();
DS1302_CLK = 1;
_nop_();
DS1302_CLK = 0;
DS1302_IO = a1;
_nop_();
DS1302_CLK = 1;
_nop_();
DS1302_CLK = 0;
DS1302_IO = a2;
_nop_();
DS1302_CLK = 1;
_nop_();
DS1302_CLK = 0;
DS1302_IO = a3;
_nop_();
DS1302_CLK = 1;
_nop_();
DS1302_CLK = 0;
DS1302_IO = a4;
_nop_();
DS1302_CLK = 1;
_nop_();
DS1302_CLK = 0;
DS1302_IO = a5;
_nop_();
DS1302_CLK = 1;
_nop_();
DS1302_CLK = 0;
DS1302_IO = a6;
_nop_();
DS1302_CLK = 1;
_nop_();
DS1302_CLK = 0;
DS1302_IO = a7;
_nop_();
DS1302_CLK = 1;
_nop_();
DS1302_CLK = 0;
}
/****************************************************************************************************************
函数名:常用时钟数据写
调 用:write_clock();
参 数:无
返回值:无
结 果:
备 注:适用于DS1302芯片+32.768KHz6pF晶体
/****************************************************************************************************************/
void v_W1302(uchar add,uchar dat) //-DS1302写数据(底层协议)
{
DS1302_RST = 0;
_nop_();
DS1302_CLK = 0;
_nop_();
DS1302_RST = 1;
_nop_();
write_time_byte(add);
_nop_();
write_time_byte(dat);
_nop_();
DS1302_RST = 0;
_nop_();
DS1302_CLK = 1;
}
/****************************************************************************************************************
函数名:常用时钟数据读取
调 用:read_clock();
参 数:无
返回值:无
结 果:
备 注:适用于DS1302芯片+32.768KHz6pF晶体
/****************************************************************************************************************/
uchar uc_R1302(uchar add)//-DS1302读数据(底层协议)
{
unsigned char dat;
DS1302_RST = 0;
_nop_();
DS1302_CLK = 0;
_nop_();
DS1302_RST = 1;
_nop_();
write_time_byte(add | 0x01);//地址,命令
_nop_();
dat = DS1302_ReadByte();//读1Byte数据
_nop_();
DS1302_RST = 0;
_nop_();
DS1302_CLK = 1;
_nop_();
return(dat);
}
使用DIP-8封装 X B价¥ 0.45
正面丝印为:
DS1302
1308A4
.+102BN
运行1小时后快4秒
今天 5月29日用DELL台式电脑的USB供电用视波器测下IC的 3脚出现了怪问题
F0000TEK-DIP8未与MCU通信时
F0000TEK-DIP8未与MCU通信时
F0001TEK-DIP8与MCU=4Mhz通信时
F0001TEK-DIP8与MCU=4Mhz通信时
F0002TEK-DIP8与MCU=8Mhz通信时
F0002TEK-DIP8与MCU=8Mhz通信时
F0003TEK-DIP8与MCU=12Mhz通信时
F0003TEK-DIP8与MCU=12Mhz通信时
F0004TEK-DIP8与MCU=22.1184Mhz通信时
F0004TEK-DIP8与MCU=22.1184Mhz通信时
MCU=22.1184主程序就一直读DS1302的其中一个寄存器时
MCU=22.1184主程序就一直读DS1302的其中一个寄存器时
使用SOP-8封装 非自己购买不知何价,但看上去跟0.73元一片的差不多
正面丝印为:
DS1032Z
+1234YR
628AC
今天 5月29日用DELL台式电脑的USB供电用视波器测下IC的 3脚出现了怪问题
幅度明显比上一个低很多!
F0000TEK-SOP8+1234未与MCU通信时
F0000TEK-SOP8+1234未与MCU通信时
F0001TEK-SOP8+1234与MCU=4Mhz通信时
F0001TEK-SOP8+1234与MCU=4Mhz通信时
F0002TEK-SOP8+1234与MCU=8Mhz通信时
F0002TEK-SOP8+1234与MCU=8Mhz通信时
F0003TEK-SOP8+1234与MCU=12Mhz通信时
F0003TEK-SOP8+1234与MCU=12Mhz通信时
F0004TEK-SOP8+1234与MCU=22.1184Mhz通信时
F0004TEK-SOP8+1234与MCU=22.1184Mhz通信时
谁知道这是为什么?谢谢!
|