单片机/MCUwilliam hill官网
直播中

胡浩

12年用户 149经验值
擅长:控制/MCU
私信 关注
[问答]

不知道程序错在那,可是ds1302总没反应

本帖最后由 huhaomcu 于 2012-9-7 11:51 编辑

/*************************************************************************************************
程序功能:DS1302组成的万年历


**************************************************************************************************/
#include
#include<1602.h>
#define uint unsigned int
#define uchar unsigned char
***it sclk=P1^0;
***it IO=P1^1;
***it rst=P2^0;
uchar code table[]={15,25,35};                        //初始时间值,秒,分 时
uchar code array[]={'0','1','2','3','4','5','6','7','8','9'};
uchar  sheet[3];               
/***it  ACC0 = ACC^0;
***it  ACC7 = ACC^7;
/*************************************************************************************************
* 名称:write_byte
* 说明
* 功能:往DS1302中写入1BYTE的数据
* 调用:
* 输入:写入的数据
* 返回值:无
*************************************************************************************************/
void wriet_byte(uchar temp)
{
        uchar i;
        ACC=temp;
        for(i=8;i>0;i--)
                {
                        IO=ACC0;
                        sclk=1;
                        sclk=0;
                        ACC=ACC>>1;
                }
}
/************************************************************************************************
*
* 名称:read_byte
* 说明:
* 功能:从DS1302中读出1BYTE的数据
* 调用:
* 输入:
* 返回值:        ACC
*************************************************************************************************/
uchar read_byte()
{
        uchar i;
        for(i=8;i>0;i--)
                {
                        ACC=ACC>>1;
                        ACC7=IO;
                        sclk=1;
                        sclk=0;
                }
return (ACC);
}
/*************************************************************************************************
*
* 名称:w_ds1302
* 功能:先写地址,再写数据
*
*************************************************************************************************/
void w_ds1302(uchar addr,uchar date)
{
        rst=0;
        sclk=0;
        sclk=1;
        wriet_byte(addr);                //写地址
        wriet_byte(date);                //写数据
        sclk=1;
        rst=0;
}
/***********************************************************************************************
* 名称:r_ds1302
* 功能:先写地址,在读数据
***********************************************************************************************/
uchar r_ds1302(uchar addr)
{
        uchar sum;
        rst=0;
        sclk=0;
        rst=1;
        wriet_byte(addr);                //写地址
        sum=read_byte();                //读数据
        sclk=1;
        rst=0;
        sum=((sum&0x70)>>4)*10+(sum&0x0f);        //BCD码转16进制
        return (sum);
}
/***********************************************************************************************
* 名称:w_init
* 功能:将初始值写入到ds1302中
************************************************************************************************/
void w_init()                //ds1302初始化操作
{
        uchar i;
        uchar addr=0x80;
        w_ds1302(0x8e,0x00);
        for(i=0;i<3;i++)
                {
                        w_ds1302(addr,table);
                        addr=addr+2;
                }
        w_ds1302(0x8e,0x80);
}
/************************************************************************************************
* 名称:r_end
* 功能:读ds1302当前的值
*************************************************************************************************/
void r_end()
{
        uchar i;
        uchar add=0x81;
        for(i=0;i<3;i++)
                {
                        sheet= r_ds1302(add);
                        add=add+2;
                }
}
/********************ds1302的操作结束*************************************************************/
void main()
{
                init1602();
                w_init();
                while(1)
                        {
                                r_end();
                                write_com(0x80+0x0a);
                                write_data(array[(sheet[0]%10)]);
                                write_data(array[(sheet[0]/10)]);
                                write_data(':');
                                write_data(array[(sheet[1]%10)]);
                                write_data(array[(sheet[1]/10)]);
                                write_data(':');
                                write_data(array[(sheet[2]%10)]);
                                write_data(array[(sheet[2]/10)]);
                        }
}

回帖(5)

郭建颖

2012-9-7 13:36:31
void w_ds1302(uchar addr,uchar date)
{
        rst=0;
        sclk=0;
        sclk=1;
        wriet_byte(addr);                //写地址
        wriet_byte(date);                //写数据
        sclk=1;
        rst=0;
}
里面的slk=1;改为rst=1;
另外在初始化函数里再加个slk=0;试试看
举报

郭建颖

2012-9-7 13:38:55
w_ds1302(addr,table);
这句改成w_ds1302(addr,table[i]);
举报

胡浩

2012-9-7 13:45:55
引用: Lovedanpianji 发表于 2012-9-7 13:38
w_ds1302(addr,table);
这句改成w_ds1302(addr,table);

还是不行,之前自己写了一个ds1302操作的程序,但也没反应,所以 这个程序关于ds1302的操作是我照书上写的,只有主程序是我自己写的,关于好个table是我复制掉了,原程序是写的table,我想是不是主程序的逻辑有问题啊!!!!!!
举报

朱海生

2012-9-7 14:13:48
我没用过DS1302,但是写芯片驱动,我还是有点小心得的。

1,您的时钟电平宽度是否足够。
2,MCU向DS1302发送数据时,改变数据是在时钟高电平还是低电平期间?
    您的代码里既有时钟高电平时改变数据,又有时钟低电平是改变数据。
3,当您启动发送时,您是否考虑到应先让所有信号线无效这一情况?看您的代码,似乎没有处理啊。
4,DS1302的CS变高到时钟变高或变低的延时您是否考虑到了。

5,说一下代码风格的问题,每个函数有注释,很好的习惯,但是没说明白入口参数的意义,合法值;
    出口参数的意义哦。
举报

胡浩

2012-9-7 14:31:01
引用: 3htech 发表于 2012-9-7 14:13
我没用过DS1302,但是写芯片驱动,我还是有点小心得的。

1,您的时钟电平宽度是否足够。

谢谢您!我一直对写一些有时序问题的程序时总是喜欢出错,看其它写的程序,感觉一个人一个样,有时甚至发现他们写的和时序图上的还对不上,可就能操作,而我自己写时,对着时序图一点一点的写,可就是没反应,您有一些关于看时序图的经验吗?
举报

更多回帖

×
20
完善资料,
赚取积分