标题: 单片机+DS1307读时间异常问题 [打印本页]

作者: lids    时间: 2023-2-21 15:44
标题: 单片机+DS1307读时间异常问题
如题,只读时分秒,显示正常,如果读时分秒 日月年,时的位置会显示年的数字。请大神帮忙看看是哪里的问题。
压缩包里面有完整的单片机程序和仿真文件;

void read_time_1307()
{
        Seconds=read_1307(0xd0,0x00,0xd1);          //读秒
        Seconds=BCD_to_Decimal(Seconds);//BCD码转换成十进制
        Minutes=read_1307(0xd0,0x01,0xd1);          //读分
        Minutes=BCD_to_Decimal(Minutes);//BCD码转换成十进制         
        Hours=read_1307(0xd0,0x02,0xd1);          //读时
        Hours=BCD_to_Decimal(Hours);//BCD码转换成十进制

//        Weeks=read_1307(0xd0,0x03,0xd1);         //读周

        Date=read_1307(0xd0,0x04,0xd1);          //读日
        Date=BCD_to_Decimal(Date);//BCD码转换成十进制
//         
//        Month=read_1307(0xd0,0x05,0xd1);     //读月
//        Month=BCD_to_Decimal(Month);//BCD码转换成十进制
//
//        Year=read_1307(0xd0,0x06,0xd1);          //读年
//        Year=BCD_to_Decimal(Year);//BCD码转换成十进制

}

51hei截图20230221154305.jpg (26.01 KB, 下载次数: 90)

51hei截图20230221154305.jpg

DS1307时钟程序.zip

89.49 KB, 下载次数: 29


作者: lkc8210    时间: 2023-2-21 18:20
消影消了个寂
正确的消影顺序
  1.         du=1;//<<<<<<<<<<<<<<<<<
  2.         P0=0;//<<<<<<<<<<<<<<<<<
  3.         du=0;//<<<<<<<<<<<<<<<<<
  4.         we=1;
  5.         P0=0xfe;
  6.         we=0;
  7.         du=1;
  8.         P0=table[sw];
  9.         du=0;
  10.         delay1();
复制代码

作者: lids    时间: 2023-2-22 08:30
lkc8210 发表于 2023-2-21 18:20
消影消了个寂
正确的消影顺序

先不管消影,小时位显示异常是什么原因呢?请大师指点一下
作者: man1234567    时间: 2023-2-22 11:06
实测注释或删除void read_time_1307()里这两句就正常,原因不明。
        Date=read_1307(0xd0,0x04,0xd1);          //读日
        Date=BCD_to_Decimal(Date);//BCD码转换成十进制
作者: xianfajushi    时间: 2023-2-22 11:07




作者: man1234567    时间: 2023-2-22 11:33
这样改就可以

51hei截图20230222112705.png (36.9 KB, 下载次数: 101)

51hei截图20230222112705.png

作者: lids    时间: 2023-2-23 08:33
man1234567 发表于 2023-2-22 11:33
这样改就可以

把 读日月年星期都屏蔽掉显示是正常的,这我知道的,但为什么读日月年后,小时位就被被其他的占了,我想知道是什么原因,大师们有知道的吗?
作者: lkc8210    时间: 2023-2-23 09:11
怎么这不按顺序?


读完没有NACK







作者: lids    时间: 2023-2-23 13:54
lkc8210 发表于 2023-2-23 09:11
怎么这不按顺序?

给大神点赞

添加Send_Nack()后,读取正常了,数码管位码顺序也对了
void Send_Nack() //
{
        sda=1;
        delay_5us();//5us延时
        scl=1;
        delay_5us();//5us延时          
        scl=0;
        delay_5us();//5us延时

}

uchar read_1307(uchar slave_write_address,uchar byte_address,uchar slave_read_address)//读一个数据
{
uchar temp,temp1,i,ii,x,data_data;
        star_1307();//开始
        for(ii=0;ii<3;ii++)//根据 24CXX文档资料,和时序图,按顺序送:器件写地址,字节地址,器件读地址
        {
                if(ii==0)
                        {
                        temp=slave_write_address;//送 器件写地址
                        temp1=slave_write_address;
                        }
                else if(ii==1)
                        {
                        temp=byte_address;//送 字节地址
                        temp1=byte_address;
                        }
                else if(ii==2)
                        {
                        star_1307();//开始
                        temp=slave_read_address;//送 器件读地址
                        temp1=slave_read_address;
                        }
                for(i=0;i<8;i++)//开始读数据
                        {
                                scl=0;
                                delay_5us();//5us延时
                                temp=temp1;
                                temp=temp&0x80;// 相 与 后,把不相关的位清零
                                if(temp==0x80)//根据前面 相 与 后,判断 temp是否等于0x80,是则该位为 1
                               
                                sda=1;
                                else
                                sda=0;
                               
                                delay_5us();//5us延时
                                scl=1;
                                delay_5us();//5us延时
                                scl=0;
                                delay_5us();//5us延时
                                temp1=temp1<<1;//向左移出1位
                        }
                sda=1;
                delay_5us();//5us延时
                scl=1;
                delay_5us();//5us延时
                ack_1307();//应答
        }
        for(x=0;x<8;x++)
        {
                data_data=data_data<<1;//向左移入1位
                sda=1;
                delay_5us();//5us延时
                scl=0;
                delay_5us();//5us延时
                scl=1;
                delay_5us();//5us延时
                if(sda==1)//判断 数据线是否是高电平
                data_data|=0x01;//把读到的数据 或 0X01
        }
        ack_1307();//应答

        Send_Nack();
        stop_1307();//停止
        return data_data;//返回读到的数据
}







欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1