找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4930|回复: 5
收起左侧

求好心的大神看看我的ds1302掉电初始化检测哪儿不对

[复制链接]
ID:47184 发表于 2013-8-26 16:14 | 显示全部楼层 |阅读模式
如题,做了个时钟,一直不能实现掉电跳过初始化,下面是初始化程序,是用在1302ram中写一个标志
//读标志
uchar read1302_flag(uchar address)
{
        uchar i,temp;
        ce=0;
        sclk=0;
        ce=1;
                for(i=8;i>0;i--)
                {
                        sclk=0;
                        temp=address;
                        io=(bit)(temp%0x01);
                        address>>=1;
                        sclk=1;
                  }
                for(i=8;i>0;i--)
                {
                        ACC_7=io;
                        sclk=1;
                        ACC>>=1;
                        sclk=0;
                }
        ce=0;
        dat3=ACC;
        dat3=dat3&0x80;
        return(dat3);
}
//初始化1302
void init()
{       
        read1302_flag(0xc1);
        if(dat3!=0xff)
        {
        write1302(0x8e,0x00);
        write1302(0xc0,0xff);
        write1302(0x90,0x06);
        write1302(0x80,0x56);
        write1302(0x82,0x46);
        write1302(0x84,0x19);
        write1302(0x8e,0x80);
        }
}

回复

使用道具 举报

ID:7485 发表于 2013-8-26 17:33 | 显示全部楼层
{
                        ACC_7=io;
                        sclk=1;
                        ACC>>=1;
                        sclk=0;
                }
有红色的那一句,acc_7 就是0,所以返回值就是0x7f。
读完最后一位后,跳过这一句即可。
或者把这一句移到前面去,先位移,后读IO.

你的程序不完整,想调试一下都难,难怪别人帮不了你。

我只能给你提个思路,你自己调试吧。
回复

使用道具 举报

ID:7485 发表于 2013-8-26 17:33 | 显示全部楼层
{
                        ACC_7=io;
                        sclk=1;
                        ACC>>=1;
                        sclk=0;
                }
有红色的那一句,acc_7 就是0,所以返回值就是0x7f。
读完最后一位后,跳过这一句即可。
或者把这一句移到前面去,先位移,后读IO.

你的程序不完整,想调试一下都难,难怪别人帮不了你。

我只能给你提个思路,你自己调试吧。
回复

使用道具 举报

ID:47184 发表于 2013-8-26 21:42 | 显示全部楼层
ahshmj 发表于 2013-8-26 17:33
{
                        ACC_7=io;
                        sclk=1;

又研究了一晚,实在搞不出来了,不是上电初始化,就是不初始化1302不走时

#include<reg52.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
uchar temp[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

sbit ce=P2^0;//ds1302
sbit sclk=P1^0;//时钟
sbit io=P1^1;//数据口

//定义摁键
sbit key1=P3^2;//小时+
sbit key2=P3^4;//小时-
sbit key3=P3^6;//分钟+
sbit key4=P3^7;//分钟-

//定义蜂鸣器
sbit beep=P2^2;


//定义段位
sbit duan=P2^6;
sbit wei=P2^7;


//位寻址寄存器定义
sbit ACC_7=ACC^7;
uchar num,dat1,dat2,dat3;



//地址数据发送子程序
void write1302(unsigned char addr,dat)
{
        uchar i,temp;
        ce=0;
        sclk=0;
        ce=1;
        for(i=8;i>0;i--)
        {
                sclk=0;
                temp=addr;
                io=(bit)(temp&0x01);
                addr>>=1;
                sclk=1;       
        }
        for(i=8;i>0;i--)
        {
                sclk=0;
                temp=dat;
                io=(bit)(temp&0x01);
                dat>>=1;
                sclk=1;
        }
        ce=0;
}
//数据获取子程序
uchar read1302(uchar addr)
{
        uchar i,temp;
        ce=0;
        sclk=0;
        ce=1;
        for(i=8;i>0;i--)
        {
                sclk=0;
                temp=addr;
                io=(bit)(temp&0x01);
                addr>>=1;
                sclk=1;
        }
        for(i=8;i>0;i--)
        {
                ACC_7=io;
                sclk=1;
                ACC>>=1;
                sclk=0;
        }
        ce=0;
        dat1=ACC;
        dat2=dat1/16;
        dat1=dat1%16;
        dat1=dat1+dat2*10;
        return(dat1);
}
//读出秒值
uchar read1302_flag(uchar address)
{
        uchar i,temp;
        ce=0;
        sclk=0;
        ce=1;
                for(i=8;i>0;i--)
                {
                        sclk=0;
                        temp=address;
                        io=(bit)(temp&0x01);
                        address>>=1;
                        sclk=1;
                  }
                for(i=7;i>0;i--)
                {

                        ACC_7=io;
                        sclk=1;
                        ACC>>=1;
                        sclk=0;
                }
                        ACC_7=io;
                        sclk=1;
                        sclk=0;
        ce=0;
        dat3=ACC;
        return(dat3);
}
//初始化1302
void init()
{       
        read1302_flag(0xc1);
        if(dat3!=0xff)
        {
        write1302(0x8e,0x00);
//        write1302(0x90,0x06);
        write1302(0x80,0x56);
        write1302(0x82,0x46);
        write1302(0x84,0x19);
        write1302(0xc0,0xff);
        write1302(0x8e,0x80);
        }
}
//简单延时
void delay(uint z)
{
        uint x,y;
        for(x=z;x>0;x--)
                for(y=110;y>0;y--);
}
//把1302读取到的数据显示到数码管上
void xianshi(uchar wela1,wela2)
{       
        uchar shi,ge;
        shi=dat1/10;
        ge=dat1%10;

        wei=1;
        P0=wela1;
        wei=0;
        duan=1;
        P0=temp[shi];
        duan=0;
        delay(5);
       

        wei=1;
        P0=wela2;
        wei=0;
        duan=1;
        P0=temp[ge];
        duan=0;       
        delay(5);       
}
//蜂鸣器发声程序
void di()
{
        beep=0;
        delay(50);
        beep=1;
}
//摁键检测
void key_check()
{

                                                if(key1==0)
                                                {
                                                        delay(1);
                                                        if(key1==0)
                                                        {
                                                                di();
                                                                while(!key1);
                                                                write1302(0x8e,0x00);
                                                                read1302(0x85);
                                                                dat1=dat1++;
                                                                if(dat1==24)
                                                                dat1=0;
                                                                dat1=dat1%10+dat1/10*16;
                                                                write1302(0x84,dat1);
                                                                write1302(0x8e,0x80);
                                                        }
                                                }
                                                if(key3==0)
                                                {
                                                        delay(1);
                                                        if(key3==0)
                                                        {
                                                                di();
                                                                while(!key3);
                                                                write1302(0x8e,0x00);
                                                                read1302(0x83);
                                                                dat1=dat1++;
                                                                if(dat1==60)
                                                                dat1=0;
                                                                dat1=dat1%10+dat1/10*16;
                                                                write1302(0x82,dat1);
                                                                write1302(0x8e,0x80);
                                                        }
                                                }
                                                if(key2==0)
                                                {
                                                        delay(1);
                                                        if(key2==0)
                                                        {
                                                                di();
                                                                while(!key2);
                                                                write1302(0x8e,0x00);
                                                                read1302(0x85);
                                                                dat1=dat1--;
                                                                if(dat1==0)
                                                                dat1=23;
                                                                dat1=dat1%10+dat1/10*16;
                                                                write1302(0x84,dat1);
                                                                write1302(0x8e,0x80);
                                                        }
                                                }
                                                if(key4==0)
                                                {
                                                        delay(1);
                                                        if(key4==0)
                                                        {
                                                                di();
                                                                while(!key4);
                                                                write1302(0x8e,0x00);
                                                                read1302(0x83);
                                                                dat1=dat1--;
                                                                if(dat1==0)
                                                                dat1=59;
                                                                dat1=dat1%10+dat1/10*16;
                                                                write1302(0x82,dat1);
                                                                write1302(0x8e,0x80);
                                                        }
                                                }                                                       
}
//主程序
void main()
{       
        init();
        while(1)
        {               

                key_check();//键盘检测
                        read1302(0x83);//读分钟
                        xianshi(0xdf,0xef);        //显示分钟
               
                        read1302(0x85);//读小时
                        xianshi(0x7f,0xbf);//显示小时


        }       
}
回复

使用道具 举报

ID:27916 发表于 2013-8-27 09:18 | 显示全部楼层
先说明没用过C,,,

    for(i=8;i>0;i--)
                {
                        ACC_7=io;
                        sclk=1;
                        ACC>>=1;
                        sclk=0;
                }
        ce=0;
        dat3=ACC;
        dat3=dat3&0x80;  
        return(dat3);
}
//初始化1302
void init()


红色部分去掉
回复

使用道具 举报

ID:7485 发表于 2013-8-28 08:12 | 显示全部楼层
本帖最后由 ahshmj 于 2013-8-28 08:15 编辑

读1302时按这样:
    for(i=8; i>0; i--)
    {
        ACC = ACC >>1;    //这一句放前面来。                        
        ACC7 = io;
        sclk = 1;
        sclk= 0;
    }
       ce=0;
        dat3=ACC;
        return(dat3);


如果仅仅就你说的这么多问题,上面的改动应该能解决问题
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表