找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1135|回复: 9
打印 上一主题 下一主题
收起左侧

单片机+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, 下载次数: 53)

51hei截图20230221154305.jpg

DS1307时钟程序.zip

89.49 KB, 下载次数: 25

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
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();
复制代码
回复

使用道具 举报

板凳
ID:140489 发表于 2023-2-22 08:30 | 只看该作者
lkc8210 发表于 2023-2-21 18:20
消影消了个寂
正确的消影顺序

先不管消影,小时位显示异常是什么原因呢?请大师指点一下
回复

使用道具 举报

地板
ID:584814 发表于 2023-2-22 11:06 | 只看该作者
实测注释或删除void read_time_1307()里这两句就正常,原因不明。
        Date=read_1307(0xd0,0x04,0xd1);          //读日
        Date=BCD_to_Decimal(Date);//BCD码转换成十进制
回复

使用道具 举报

5#
ID:332444 发表于 2023-2-22 11:07 | 只看该作者



回复

使用道具 举报

6#
ID:584814 发表于 2023-2-22 11:33 | 只看该作者
这样改就可以

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

51hei截图20230222112705.png
回复

使用道具 举报

7#
ID:140489 发表于 2023-2-23 08:33 | 只看该作者

把 读日月年星期都屏蔽掉显示是正常的,这我知道的,但为什么读日月年后,小时位就被被其他的占了,我想知道是什么原因,大师们有知道的吗?
回复

使用道具 举报

8#
ID:161164 发表于 2023-2-23 09:11 | 只看该作者
怎么这不按顺序?


读完没有NACK






回复

使用道具 举报

9#
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;//返回读到的数据
}


回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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