找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索

单片机+DS1307读时间异常问题

查看数: 2647 | 评论数: 8 | 收藏 0
关灯 | 提示:支持键盘翻页<-左 右->
    组图打开中,请稍候......
发布时间: 2023-2-21 15:44

正文摘要:

如题,只读时分秒,显示正常,如果读时分秒 日月年,时的位置会显示年的数字。请大神帮忙看看是哪里的问题。 压缩包里面有完整的单片机程序和仿真文件; void read_time_1307() {       & ...

回复

ID:140489 发表于 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;//返回读到的数据
}


ID:161164 发表于 2023-2-23 09:11
怎么这不按顺序?


读完没有NACK






ID:140489 发表于 2023-2-23 08:33

把 读日月年星期都屏蔽掉显示是正常的,这我知道的,但为什么读日月年后,小时位就被被其他的占了,我想知道是什么原因,大师们有知道的吗?
ID:584814 发表于 2023-2-22 11:33
这样改就可以

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

51hei截图20230222112705.png
ID:332444 发表于 2023-2-22 11:07



ID:584814 发表于 2023-2-22 11:06
实测注释或删除void read_time_1307()里这两句就正常,原因不明。
        Date=read_1307(0xd0,0x04,0xd1);          //读日
        Date=BCD_to_Decimal(Date);//BCD码转换成十进制
ID:140489 发表于 2023-2-22 08:30
lkc8210 发表于 2023-2-21 18:20
消影消了个寂
正确的消影顺序

先不管消影,小时位显示异常是什么原因呢?请大师指点一下
ID:161164 发表于 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();
复制代码

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

Powered by 单片机教程网

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