打印

DS1302的困惑

[复制链接]
2017|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
dubai|  楼主 | 2011-4-27 20:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
void DS1302InputByte(unsigned char d)     //实时时钟写入一字节(内部函数)
{
    unsigned char i;
    ACC = d;
    for(i=8; i>0; i--)   //相当于汇编中的 RRC
    {
        DS1302_IO = ACC0;               
        DS1302_CLK = 1;   
        DS1302_CLK = 0;         ACC = ACC >> 1;
    }
}
unsigned char DS1302OutputByte(void)     //实时时钟读取一字节(内部函数)
{
    unsigned char i;
    for(i=8; i>0; i--)  //相当于汇编中的 RRC
    {
        ACC = ACC >>1;                     
        ACC7 = DS1302_IO;
        DS1302_CLK = 1;
        DS1302_CLK = 0;
    }
    return(ACC);
}

相关帖子

沙发
lackan| | 2011-4-27 21:09 | 只看该作者
有啥困惑的?

使用特权

评论回复
板凳
dubai|  楼主 | 2011-4-27 22:52 | 只看该作者
本帖最后由 dubai 于 2011-4-27 22:54 编辑

读写都改成    DS1302_CLK = 0;  DS1302_CLK=1;    就无法读取数据了,为什么呢?不解.这样不也是会产生上升沿和下降沿吗。

使用特权

评论回复
地板
来与君| | 2011-4-28 17:38 | 只看该作者
这个DS1302的例子程序搞了多少人啊

用C语言就不要使用类似ACC这样和硬件有关的变量吧

使用特权

评论回复
5
joyme| | 2011-4-28 18:09 | 只看该作者
CLK下降沿开始变化数据,CLK上升沿后开始读取数据,否则可能读不到数据(或不稳定),感觉你的程序有点问题,况且程序里没有一点延时。不要盲目追求代码简化,稳定才是压倒一切的。

使用特权

评论回复
6
万山21| | 2011-7-27 11:20 | 只看该作者
用C语言就不要使用类似ACC这样和硬件有关的变量吧
来与君 发表于 2011-4-28 17:38

为什么?

使用特权

评论回复
7
老鱼探戈| | 2011-7-27 11:52 | 只看该作者
本帖最后由 老鱼探戈 于 2011-7-27 14:52 编辑

C语言中最好不要用ACC做局部变量用,因为你不知道编译器会怎么做,不要控制。如果是汇编的话是比较好控制的 。
你的时序也不对。。。。

//========================================
//函数名称:void singlebyte_write(uchar date)
//输入参数:uchar date
//输出参数:无
//函数功能:8位数据传送
//========================================
void singlebyte_write(uchar date)
{
uchar i;

T_RST=1; //启动数据传送
for(i=0;i<8;i++) //循环8次写入数据
{
T_SCLK=0;
if(date&0x01) //从低位开始写
T_IO=1;
else
T_IO=0;
T_SCLK=1; //在时钟线的上升沿写入一位数据
date=date>>1; //将高1位数据移至ACC^0
// delayns();
}
}
//========================================
//函数名称:uchar singlebyte_read(void)
//输入参数:无
//输出参数:uchar ACC
//函数功能:从DS1302读取1Byte数据
//========================================
uchar singlebyte_read(void) //从DS1302读取1Byte数据
{
uchar i,temp; //启动数据传送
for(i=0; i<8; i++) //读出8位数据
{
T_SCLK = 0;
temp = temp>>1;
if(T_IO==1)
temp+=0x80;
T_IO=1; //P1口输入前置1
T_SCLK = 1; //时钟线上升沿读出1位数据
// delayns();
}
return(temp);
}
//========================================
//函数名称: void write_ds1302(uchar add,uchar date)
//输入参数:uchar add,uchar date
//输出参数:无
//函数功能:往DS1302写入数据
//========================================
void write_ds1302(uchar add,uchar date) //往DS1302写入数据
{
// T_RST = 0;
T_RST = 1;
// delayns();
singlebyte_write(add); //地址,命令
singlebyte_write(date); //写1Byte数据
T_SCLK = 1;
T_RST =0;
}
//========================================
//函数名称:uchar read_ds1302(uchar add)
//输入参数:uchar add
//输出参数:uchar date
//函数功能:从DS1302读取数据
//========================================
uchar read_ds1302(uchar add) //从DS1302读取数据
{
uchar date;
T_SCLK=0;
T_RST=1;

singlebyte_write(add);
date=singlebyte_read();
T_SCLK=1;
T_RST=0;
return(date);
}

使用特权

评论回复
8
ningling_21| | 2011-7-27 15:12 | 只看该作者
楼上正解...

使用特权

评论回复
9
goto0514| | 2011-8-19 13:49 | 只看该作者
同意七楼的,写程序就象写**一样,好的**读起来朗朗上口,意思容易让人明白。不好的**读起来费劲,而且容易让你误解。现在你的程序就是第二种,读你代码的是计算机,可惜它没读明白!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

2

帖子

0

粉丝