DS1302最基本连接方式,电池用的RS2032(3V),如果程序初值设定(或程序中改写)的话运行正常。掉电后屏蔽初始设置的重新烧片的话,再上电显示就是2000年1月1日 00:00:00 。
void WDS1302(uchar ucAddr,uchar ucDar);此函数为写命令
以下是初值设置
WDS1302(0x8e,0x00);
WDS1302(YEAR,sys.cYear);
WDS1302(MONTH,sys.cMon&0x1f);
WDS1302(DAY,sys.cDay&0x3f);
WDS1302(HOUR,sys.cHour&0xbf);
WDS1302(MINUTE,sys.cMin&0x7f);
WDS1302(SECOND,sys.cSec&0x7f);
WDS1302(WEEK,sys.cWeek&0x07);
WDS1302(0x8e,0x80);
以下是屏蔽后的初始化
WDS1302(SECOND,0x00);
我的联系方式是QQ441664178,高手加我QQ详谈。谢谢。
问题找到了,希望以后大家有用吧。是电池的地的问题,电池的地必须与芯片直接连接,不能通过电源地接入芯片,不然会产生干扰而不能记录时间。
DS1302掉电数据清空
答案:2 悬赏:30 手机版
解决时间 2021-02-23 13:45
- 提问者网友:嗝是迷路的屁
- 2021-02-23 08:28
最佳答案
- 五星知识达人网友:神也偏爱
- 2021-02-23 09:35
如果是正宗的芯片
怕工作不稳定
怕工作不稳定
全部回答
- 1楼网友:長槍戰八方
- 2021-02-23 10:02
这里给你一个我自己的proteus亲自调试通过的程序,若要求全部调试程序请发站内信,uchar du(uchar addr)
{
uchar i;
uchar dd,du,du1,du2;
dsres=0;
dssclk=0;
dsres=1;
for(i = 0; i < 8; i++)
{
dssclk=0;
dsio=0;
if(addr & 0x01)
dsio= 1;
dssclk = 1;
addr >>= 1;
}---------以上发送一个字节地址
dsio=1; -----ds1302通信io口
for(i = 0; i < 8; i++)
{
acc=acc>>1;
dssclk=0;
if(dsio==0)
acc_7=0;
else
acc_7=1;
dssclk=1;
}--------------以上读取一个字节数据
dsres=0;
dd=acc;
du1=dd/16;
du2=dd%16;
du=du1*10+du2;---------以上进行十六进制到十进制转化
return du;
}
你的程序我大致看了,问题主要有二个,你的时序可能还没弄清楚,要严格按照时序,具体的资料你手头应该也有,读写数据的时候你都应该按照上升沿进行数据传输,第二个问题就51在作为通信口读数据的问题了,一定要记住51作为数据通信口的时候一定要先拉高端口电平也就是我上面注释的dsio=1;为什么这样做具体你可以查阅51io口的结构图,vcc接上拉电阻再接一个mos管,电阻和mos管之间是io口,只有端口写1的时候,mos管工作在截至状态,此时读引脚和vcc连接,这时候若io是高电平则直接读出高电平1,若io口是低电平则外部芯片的吸电把端口电平拉低,读引脚读出低电平0,要区分读引脚和读端口寄存器的区别!还有其他问题的话 站内信 呵呵 ,望你能弄懂最后别忘了给分 谢谢 !!!
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯