4813|18

28

帖子

1

TA的资源

一粒金砂(中级)

楼主
 

DS1302相关,各位大大帮帮忙看看啊··· [复制链接]

以下代码在串口调试助手上显示:

                                                      ······(省略)

                                                  11-12-17 00:35:57
                                                  11-12-17 00:35:57
                                                  11-12-17 00:35:58
                                                  11-12-17 00:35:58
                                                  11-12-17 00:35:58

                                                     ······(省略)

                                                以上是正确的读出数据

但是,假如下面那行红色的代码去掉,就会变成:

                                                      ······(省略)

                                                  11-12-?? 00:??:02
                                                  11-12-?? 00:??:02
                                                  11-12-?? 00:??:02
                                                  11-12-?? 00:??:02
                                                  11-12-?? 00:??:02
                                                  11-12-?? 00:??:02
                                                  11-12-?? 00:??:02
                                                  11-12-?? 00:??:02
                                                  11-12-17 ??:00:03
                                                  11-12-17 ??:00:03
                                                  11-12-17 ??:00:03
                                                  11-12-17 ??:00:03
                                                  11-12-17 ??:00:03

                                                    ······(省略)

                                            该显示部分居然出现问号

请大神帮帮忙解决下,就一句代码不理解,3Q,代码如下:

# include <reg52.h>

# define WRITE_ADDRESS 0x80
# define READ_ADDRESS  0x81

typedef unsigned char uint8;
typedef unsigned int uint16;

sbit SDA = P3^4;
sbit SCK = P3^5;
sbit RST = P1^7;

 

uint8 Time[] = {0,0,0,17,12,7,11};        //设置DS1302的初始值,分别为:秒,分,时,日,月,周,年

void delay(uint16 counter)
{
     while(--counter);
}

void DS1302_Initial()
{
     RST = 0;
     SCK = 0;
     RST = 1; 
}

void DS1302_InputByte(uint8 BYTE)                          //写一个字节
{
     uint8 i;

     for(i = 0;i < 8;i++)
     {
          BYTE >>= 1;
          SDA = CY;
          SCK = 1;
          SCK = 0; 

     }

}

void Write_DS1302(uint8 ADDRESS,uint8 BYTE)
{
     DS1302_Initial();
     DS1302_InputByte(ADDRESS);
     DS1302_InputByte(BYTE);
     RST = 0;                                                           //该句前面不用对SDA进行处理,不懂!!
}

uint8 DS1302_OutputByte()                                     //读一个字节
{
     uint8 i;
 
     for(i = 0;i < 8;i++)
     {
          ACC >>= 1;
          if(SDA)
              ACC |= 0x80;
          SCK = 1;
          SCK = 0;
     }

     return ACC;
}

uint8 Read_DS1302(ADDRESS)                  //读时间子函数
{
     DS1302_Initial();
     DS1302_InputByte(ADDRESS);
     ACC = DS1302_OutputByte();
     SDA = 0;                                               //罪魁祸首,就这句如果删了就出现错误了,大大们看看为什么?
     RST = 0;
     return ACC;
}

void Read_Time()                                        //读时间
{
     uint8 i,addr;
     addr = READ_ADDRESS;
     for(i = 0;i < 7;i++)                                  //读7次,存入Time数组
     {
          Time = Read_DS1302(addr);
          addr += 2;
     }
}

void DS1302_If_Protece(bit Flag)                  //设置写保护或者清写保护
{
     if(Flag)
     {
          Write_DS1302(0x8e,0x80);
     }
     else
     {
          Write_DS1302(0x8e,0); 
     }
}

void DS1302_SetTime()                                     //设置初始时间
{
     uint8 i,temp;

     for(i = 0;i < 7;i++)                                        //转换成BCD码
     {
          temp = Time/10;
          Time = Time%10;
          Time = Time + temp * 16;
     }

     temp = WRITE_ADDRESS;
     DS1302_If_Protece(0);

     for(i = 0;i < 7;i++)                                         //写入DS1302
     {
          Write_DS1302(temp,Time);
          temp += 2;
     }

     DS1302_If_Protece(1);
}

void Serial_Initial()                                          //串口初始化
{
     TMOD = 0x20;
     SCON = 0x40;
     TH1  = 0xfd;
     TL1  = TH1;
     TR1  = 1;
}

void Serial_OutputByte(uint8 Byte)
{
     SBUF = Byte;
     while(!TI);
     TI = 0;
}

void Serial_OutputTime(uint8 Data)
{
     Serial_OutputByte(Data/16+'0');              //读回来的数据转换成字符送调试助手显示
     Serial_OutputByte(Data%16+'0');
}

void main()
{
     Serial_Initial();
     DS1302_SetTime();
 
     while(1)
     {
          Read_Time();
          Serial_OutputTime(Time[6]);
          Serial_OutputByte('-');
          Serial_OutputTime(Time[4]);
          Serial_OutputByte('-');
          Serial_OutputTime(Time[3]);
          Serial_OutputByte(' ');
          Serial_OutputTime(Time[2]);
          Serial_OutputByte(':');
          Serial_OutputTime(Time[1]);
          Serial_OutputByte(':');
          Serial_OutputTime(Time[0]);
          Serial_OutputByte('\r');
          Serial_OutputByte('\n');
          delay(10000);
         }
}

 

[ 本帖最后由 lhlonng 于 2011-12-19 10:45 编辑 ]
此帖出自51单片机论坛

最新回复

广告都吸引过来了。。。。  详情 回复 发表于 2011-12-21 12:24
点赞 关注
 

回复
举报

28

帖子

1

TA的资源

一粒金砂(中级)

沙发
 
米人啊
怎么出现两种字体,晕死···
此帖出自51单片机论坛
 
 
 

回复

3404

帖子

6

TA的资源

裸片初长成(初级)

板凳
 
出现问号肯定是有的字节读取错误了,有可能读的太快了吧。你把底层的读写函数里面加一个NOP试试。或者先把SDA = 0换成NOP试试。
此帖出自51单片机论坛
 
 
 

回复

7219

帖子

192

TA的资源

五彩晶圆(高级)

4
 

回复 板凳 jishuaihu 的帖子

我一般都是参照别人的 比较好的程序修改
此帖出自51单片机论坛
 
 
 

回复

28

帖子

1

TA的资源

一粒金砂(中级)

5
 

回复 板凳 jishuaihu 的帖子

我试过了在底层函数加nop没用,把sda=0换成nop也不行,我在想,是不是单片机在读完DS1302以后必须把SDA置0,但是时序图上也没这么表示吧,而且为什么只有读的时候要置零,而在写的时候不用?
闷··················
此帖出自51单片机论坛
 
 
 

回复

315

帖子

0

TA的资源

五彩晶圆(初级)

6
 
SDA=0?为什么不是SDA=1呢···
此帖出自51单片机论坛
 
 
 

回复

315

帖子

0

TA的资源

五彩晶圆(初级)

7
 
给LZ提个醒,以后程序最好附件上传,直接发出来,有些地方会不显示,例如[ i ]
此帖出自51单片机论坛
 
 
 

回复

28

帖子

1

TA的资源

一粒金砂(中级)

8
 

回复 6楼 孤獨の快樂 的帖子

换成SDA = 1不行的,昨天就试过了,怎么就没人能解决嘞····
此帖出自51单片机论坛
 
 
 

回复

315

帖子

0

TA的资源

五彩晶圆(初级)

9
 
原帖由 lhlonng 于 2011-12-19 12:31 发表 换成SDA = 1不行的,昨天就试过了,怎么就没人能解决嘞····
经试验,把SDA=0删了,没出错,不知道你是怎么出错的 [ 本帖最后由 孤獨の快樂 于 2011-12-19 12:48 编辑 ]
此帖出自51单片机论坛
 
 
 

回复

28

帖子

1

TA的资源

一粒金砂(中级)

10
 

原帖由 孤獨の快樂 于 2011-12-19 12:45 发表 经试验,把SDA=0删了,没出错,不知道你是怎么出错的

 

 不是吧,那我换个MCU试试···

此帖出自51单片机论坛
 
 
 

回复

28

帖子

1

TA的资源

一粒金砂(中级)

11
 

原帖由 孤獨の快樂 于 2011-12-19 12:45 发表 经试验,把SDA=0删了,没出错,不知道你是怎么出错的

 

 换了也没用,你的板子是自己做的还是什么学习板?

此帖出自51单片机论坛
 
 
 

回复

315

帖子

0

TA的资源

五彩晶圆(初级)

12
 
原帖由 lhlonng 于 2011-12-19 13:32 发表    换了也没用,你的板子是自己做的还是什么学习板?
普中科技的板
此帖出自51单片机论坛
 
 
 

回复

315

帖子

0

TA的资源

五彩晶圆(初级)

13
 
这个现象还真不知道为什么,难不成是DS1302的问题吧 [ 本帖最后由 孤獨の快樂 于 2011-12-19 13:39 编辑 ]
此帖出自51单片机论坛
 
 
 

回复

28

帖子

1

TA的资源

一粒金砂(中级)

14
 

原帖由 孤獨の快樂 于 2011-12-19 13:37 发表 这个现象还真不知道为什么,难不成是DS1302的问题吧

不管了,知道我写的程序没问题就好,到时候再用proteus来仿真看看!

我的那快板的1602也时常诈死,娘的···

有Q么,加来以后交流交流···

此帖出自51单片机论坛
 
 
 

回复

315

帖子

0

TA的资源

五彩晶圆(初级)

15
 
原帖由 lhlonng 于 2011-12-19 13:43 发表 不管了,知道我写的程序没问题就好,到时候再用proteus来仿真看看! 我的那快板的1602也时常诈死,娘的··· 有Q么,加来以后交流交流···
仿真过,也没出问题····· 1582558752 [ 本帖最后由 孤獨の快樂 于 2011-12-19 13:47 编辑 ]
此帖出自51单片机论坛
 
 
 

回复

28

帖子

1

TA的资源

一粒金砂(中级)

16
 

原帖由 孤獨の快樂 于 2011-12-19 13:46 发表 仿真过,也没出问题····· 1582558752

 

加了!!!

此帖出自51单片机论坛
 
 
 

回复

7219

帖子

192

TA的资源

五彩晶圆(高级)

17
 
给你个资料 DS1302.doc (31 KB, 下载次数: 2)
此帖出自51单片机论坛
 
 
 

回复

2

帖子

0

TA的资源

一粒金砂(中级)

18
 
问题解决了吗?没解决的话可以加我QQ:451806294帮你解决。
我是做1302应用的。购买我们公司1302产品的客户,他们出现的一些大大小小的问题都是我和我的团队负责解决的 欢迎大家多交流沟通:)
此帖出自51单片机论坛
 
 
 

回复

7219

帖子

192

TA的资源

五彩晶圆(高级)

19
 

回复 18楼 gsliu 的帖子

广告都吸引过来了。。。。
此帖出自51单片机论坛
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表