关于DS1302的问题,大家帮帮忙啊!!!

qddianzi   2009-11-15 23:50 楼主
我是初学者,看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

回复评论 (6)

实话说,代码我没看。 在keil里不是有调试吗? 单步运行看看每个寄存器是否都是你想要的值。
点赞  2009-11-20 17:04
上网也是涂个放松,大家一般也不会上班看程序 下班上网还想看程序,你提出问题点,给意见的话大家应该都不会拒绝
点赞  2009-11-20 17:07
程序太长,如果出钱请人知道,还有人可能看下去。
点赞  2009-11-20 19:07
把   uchar ad=0;
    uint i;
    TEST_LIGHT=0;

    DS1302_EN_PORT=1;
放到while(1){}外边去,
去掉后面的while(1){}
哪里有一个main()函数的。
点赞  2009-11-22 22:38
哪里有一个main()函数使用两个while(1)的。
点赞  2009-11-22 22:39
我也没怎么看程序,不知道你是不是把1302的BCD码弄错了
10->0x10->16
点赞  2009-11-24 14:09
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复