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

2019-07-16 04:43发布

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

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


**************************************************************************************************/
#include<reg52.h>
#include<1602.h>
#define uint unsigned int
#define uchar unsigned char
sbit sclk=P1^0;
sbit IO=P1^1;
sbit 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];               
/sbit  ACC0 = ACC^0;
sbit  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条回答
huhaomcu
2019-07-16 12:51
Lovedanpianji 发表于 2012-9-7 13:38
w_ds1302(addr,table);
这句改成w_ds1302(addr,table);

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

一周热门 更多>