我是初学者,看DS1302的资料也很多了,也看了别人的程序,怎么自己动手就这么难呢~~~~
还是希望有高人给我指点一下~~~这个账号新注册的,没有分啊~给不了大家分数了~~~
下面是我的程序,我现在手上还没有足够的器材,我想先学会使用DS1302,所以,没有显示相关的部分
我就是想看看自己对DS1302的操作是否正确~~~
在定义了对DS1302的读写操作之后,我在MAIN中只是进行了把0x0a写进DS1302的秒寄存器,然后马上再读出秒寄存器~~
然后我是写了个闪烁的小循环,我的本意是,读出来的是10(因为我写进的是0x0a),然后灯应该闪烁10下就停了,结果却是闪烁了很多~~~请高手帮忙看看啊~~~
#include
#include
#define uint unsigned int
#define uchar unsigned char
#define nop() _nop_()
//Define some port for DS1302 use
sbit DS1302_CLK=P1^4;
sbit DS1302_IO=P1^5;
sbit DS1302_RST=P2^2;
sbit ACC0=ACC^0; //因为ACC寄存器可以进行位寻址,所以为后面的一些需要取到位值的时候使用,一般是在对DS1302写入数据时用到,因为从低位写入,所以用到该位
sbit ACC7=ACC^7; //因为ACC寄存器可以进行位寻址,所以为后面的一些需要取到位值的时候使用,一般是在对DS1302读出数据时用到,因为从低位读入,所以用到该位
sbit DS1302_EN_PORT=P3^7;
sbit TEST_LIGHT=P0^0;
sbit TEST_LIGHT1=P0^1;
//写入一个字节到DS1302
void Write_DS1302(uchar z)
{
uchar i;
ACC=z;
DS1302_RST=1;
DS1302_CLK=0;
for(i=8;i>0;i--)
{
DS1302_IO=ACC0;
ACC=ACC>>1;
DS1302_CLK=1;
DS1302_CLK=0;
}
DS1302_RST=0;
DS1302_CLK=0;
}
//从DS1302读出一个字节
uchar Read_DS1302(void)
{
// ACC=0; //initialize
unsigned char t;
DS1302_RST=1;
DS1302_CLK=1;
for(t=8;t>0;t--)
{
ACC7=DS1302_IO;
ACC=ACC>>1;
DS1302_CLK=0;
DS1302_CLK=1;
}
DS1302_RST=0;
DS1302_CLK=0;
return (ACC); //别人的例子是return (AAC),先这样写,看看可不可以
}
//对DS1302指定地址写入指定数据
void Write_Appoint_DS1302(uchar address,uchar content)
{
Write_DS1302(address);
Write_DS1302(content);
}
//指定地址读出DS1302内容
uchar Read_Appoint_DS1302(uchar address)
{
uchar rt;
Write_DS1302(address);
rt=Read_DS1302();
return (rt);
}
void main()
{
while(1)
{
uchar ad=0;
uint i;
TEST_LIGHT=0;
DS1302_EN_PORT=1;
Write_Appoint_DS1302(0x80,0x0a);
ad=Read_Appoint_DS1302(0x81);
//ad=10;
while(ad--)
{
for(i=20000;i>0;i--)
{
TEST_LIGHT1=0;
}
for(i=20000;i>0;i--)
{
TEST_LIGHT1=1;
}
}
while(1)
{}
}
}
本文来自: 电子工程师之家http://www.eehome.cn
实话说,代码我没看。 在keil里不是有调试吗? 单步运行看看每个寄存器是否都是你想要的值。
上网也是涂个放松,大家一般也不会上班看程序 下班上网还想看程序,你提出问题点,给意见的话大家应该都不会拒绝
把 uchar ad=0;
uint i;
TEST_LIGHT=0;
DS1302_EN_PORT=1;
放到while(1){}外边去,
去掉后面的while(1){}
哪里有一个main()函数的。
哪里有一个main()函数使用两个while(1)的。
我也没怎么看程序,不知道你是不是把1302的BCD码弄错了
10->0x10->16