Great88 发表于 2015-9-19 21:46 谢谢您 |
|
//********向1302写数据********* void Write1302(uchar dat) { uchar i; SCLK=0; //拉低SCLK,为脉冲上升沿写入数据做好准备 delay1(1); //稍微等待,使硬件做好准备 for(i=0;i<8;i++) //连续写8个二进制位数据 { IO=dat&0x01; //取出dat的第0位数据写入1302 delay(1); //稍微等待,使硬件做好准备 SCLK=1; //上升沿写入数据 delay1(1); //稍微等待,使硬件做好准备 SCLK=0; //重新拉低SCLK,形成脉冲 dat>>=1; //将dat的各数据位右移1位,准备写入下一个数据位 } } void WriteSet1302(uchar Cmd,uchar dat) { RST=0; //禁止数据传递 SCLK=0; //确保写数居前SCLK被拉低 RST=1; //启动数据传输 delay1(1); //稍微等待,使硬件做好准备 Write1302(Cmd); //写入命令字 Write1302(dat); //写数据 SCLK=1; //将时钟电平置于已知状态 RST=0; //禁止数据传递 } uchar Read1302(void) { uchar i,dat; delay(1); //稍微等待,使硬件做好准备 for(i=0;i<8;i++) //连续读8个二进制位数据 { dat>>=1; //将dat的各数据位右移1位,因为先读出的是字节的最低位 if(IO==1) //如果读出的数据是1 dat|=0x80; //将1取出,写在dat的最高位 SCLK=1; //将SCLK置于高电平,为下降沿读出 delay1(1); //稍微等待 SCLK=0; //拉低SCLK,形成脉冲下降沿 delay1(1); //稍微等待 } return dat; //将读出的数据返回 } uchar ReadSet1302(uchar Cmd) { uchar dat; RST=0; //拉低RST SCLK=0; //确保写数居前SCLK被拉低 RST=1; //启动数据传输 Write1302(Cmd); //写入命令字 dat=Read1302(); //读出数据 SCLK=1; //将时钟电平置于已知状态 RST=0; //禁止数据传递 return dat; //将读出的数据返回 } void Init_DS1302(void) { WriteSet1302(0x8E,0x00); //根据写状态寄存器命令字,写入不保护指令 WriteSet1302(0x80,((0/10)<<4|(0%10))); //根据写秒寄存器命令字,写入秒的初始值 WriteSet1302(0x82,((45/10)<<4|(45%10))); //根据写分寄存器命令字,写入分的初始值 WriteSet1302(0x84,((15/10)<<4|(15%10))); //根据写小时寄存器命令字,写入小时的初始值 WriteSet1302(0x86,((29/10)<<4|(29%10))); //根据写日寄存器命令字,写入日的初始值 WriteSet1302(0x88,((11/10)<<4|(11%10))); //根据写月寄存器命令字,写月的初始值 WriteSet1302(0x8c,((15/10)<<4|(15%10))); //.....年.....................年......... } |
本帖最后由 王朗的诱惑 于 2015-9-6 14:36 编辑 此者彼者 发表于 2015-9-6 11:47 数据不能是88吧……会不会是显示问题。数码管显示调好了么?话说这面包板……好眼熟呀……你也用面包板玩…… |
王朗的诱惑 发表于 2015-8-28 23:52 恩恩,已经可以了,真是太谢谢你啦~~~~~~ |
王朗的诱惑 发表于 2015-8-28 23:52 恩恩,可以了,真是太谢谢你啦~~~~~~ |
王朗的诱惑 发表于 2015-8-28 23:52 恩恩,搞定了,真是太谢谢你啦~~~ |
此者彼者 发表于 2015-8-28 19:43 搞定。~~不过我的电路不太一样,但是发现DS1302连到P3那几个口不好用,换到P2的就好了,估计是数码管开关的时候引脚控制牵连到DS1302了。现在DS1302通信和初始化都没问题了(接在P2的时候)。但是因为数码管电路不太一样,所以最后具体的还要你自己试试。要是还不行……可以再来找我。 |
30.11 KB, 下载次数: 43
王朗的诱惑 发表于 2015-8-28 17:25 按照您说的,还是不行,您有时间帮我看看我的程序吗??我使用keil4编写的,麻烦您了,我编译的结果是,无论初始值是什么,数码管显示的都是0,并且不动,麻烦您了。 |
26.35 KB, 下载次数: 18
此者彼者 发表于 2015-8-28 17:13 把ACC=ACC>>1;放到前面,就是进了for以后的第一句。 |
王朗的诱惑 发表于 2015-8-28 17:00 按照您的说法改正了,但还是不行 |
| ACC是累加器吗?如果是的话在计数变量 i 自加的时候,就是 i++ 运算,会用到累加器,之前存的数据就没了……正确的做法是for(i=8;i>0;i--) |