3098|6

77

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

关于DS1302的问题,大家帮帮忙啊!!! [复制链接]

我是初学者,看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

最新回复

我也没怎么看程序,不知道你是不是把1302的BCD码弄错了 10->0x10->16  详情 回复 发表于 2009-11-24 14:09
点赞 关注

回复
举报

73

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
实话说,代码我没看。 在keil里不是有调试吗? 单步运行看看每个寄存器是否都是你想要的值。
 
 

回复

86

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
上网也是涂个放松,大家一般也不会上班看程序 下班上网还想看程序,你提出问题点,给意见的话大家应该都不会拒绝
 
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

4
 
程序太长,如果出钱请人知道,还有人可能看下去。
 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

5
 
把   uchar ad=0;
    uint i;
    TEST_LIGHT=0;

    DS1302_EN_PORT=1;
放到while(1){}外边去,
去掉后面的while(1){}
哪里有一个main()函数的。
 
 
 

回复

77

帖子

0

TA的资源

宇宙尘埃

6
 
哪里有一个main()函数使用两个while(1)的。
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

7
 
我也没怎么看程序,不知道你是不是把1302的BCD码弄错了
10->0x10->16
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表