10606|16

76

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

DS1302 输出的全是0xff 请问这是怎么回事呢 [复制链接]

DS1302 输出的全是0xff 请问这是怎么回事呢我的源程序如下
#include
typedef unsigned char uchar;
typedef unsigned int  uint;

/**************宏定义***************/
#define DS_RST  BIT7        //DS_RST = P2.7
#define DS_SCL  BIT5        //DS_SCL = P2.5
#define DS_SDA  BIT6       //DS_SDA = P2.6
#define DS_RST_IN P2DIR &= ~DS_RST
#define DS_RST_OUT P2DIR |= DS_RST
#define DS_RST0 P2OUT &= ~DS_RST
#define DS_RST1 P2OUT |= DS_RST
#define DS_SCL_IN P2DIR &= ~DS_SCL
#define DS_SCL_OUT P2DIR |= DS_SCL
#define DS_SCL0 P2OUT &= ~DS_SCL
#define DS_SCL1 P2OUT |= DS_SCL
#define DS_SDA_IN P2DIR &= ~DS_SDA
#define DS_SDA_OUT P2DIR |= DS_SDA
#define DS_SDA0 P2OUT &= ~DS_SDA
#define DS_SDA1 P2OUT |= DS_SDA
#define DS_SDA_BIT P2IN & DS_SDA

/*******************************************
函数名称:delay
功    能:延时一段时间
参    数:time--延时长度
返回值  :无
********************************************/
void delay(uint time)
{
    uint i;
    for(i = 0;i < time;i++)     _NOP();
}
/*******************************************
函数名称:Reset_DS1302
功    能:对DS1302进行复位操作
参    数:无
返回值  :无
********************************************/
void Reset_DS1302(void)
{
    DS_RST_OUT;  //RST对应的IO设置为输出状态
    DS_SCL_OUT;  //SCLK对应的IO设置为输出状态
    DS_SCL0;     //SCLK=0
    DS_RST0;     //RST=0
    delay(10);
    DS_SCL1;    //SCLK=1
}
/*******************************************
函数名称:Write1Byte
功    能:对DS1302写入1个字节的数据
参    数:wdata--写入的数据
返回值  :无
********************************************/
void Write1Byte(uchar wdata)
{
    uchar i;

    DS_SDA_OUT;     //SDA对应的IO设置为输出状态
    DS_RST1;        //REST=1;

    for(i = 8; i > 0; i--)
    {
        if(wdata&0x01)  DS_SDA1;
        else            DS_SDA0;
        DS_SCL0;
        delay(10);
        DS_SCL1;
        delay(10);
        wdata >>= 1;
    }
}
/*******************************************
函数名称:Read1Byte
功    能:从DS1302读出1个字节的数据
参    数:无
返回值  :读出的一个字节数据
********************************************/
uchar Read1Byte(void)
{
    uchar i;
    uchar rdata = 0X00;

    DS_SDA_IN;  //SDA对应的IO设置为输入状态
    DS_RST1;    //REST=1;

    for(i = 8; i > 0; i--)
    {
        DS_SCL1;
        //DS_SCL0;
        delay(10);
        //DS_SCL1;
        DS_SCL0;
        delay(10);
        rdata >>= 1;
        if(DS_SDA_BIT)  rdata |= 0x80;
    }
   
    return(rdata);
}
/*******************************************
函数名称:W_Data
功    能:向某个寄存器写入一个字节数据
参    数:addr--寄存器地址
          wdata--写入的数据
返回值  :无
********************************************/
void W_Data(uchar addr, uchar wdata)
{
    DS_RST0;
    DS_SCL0;   
    _NOP();
    DS_RST1;
    Write1Byte(addr);   //写入地址
    Write1Byte(wdata);  //写入数据
    DS_SCL1;
    DS_RST0;
}
/*******************************************
函数名称:R_Data
功    能:从某个寄存器读出一个字节数据
参    数:addr--寄存器地址
返回值  :读出的数据
********************************************/
uchar R_Data(uchar addr)
{
    uchar rdata;
   
    DS_RST0;
    DS_SCL0;
    _NOP();
    DS_RST1;
    Write1Byte(addr);    //写入地址
    rdata = Read1Byte();  //读出数据
    DS_SCL1;
    DS_RST0;
   
    return(rdata);
}
/*******************************************
函数名称:BurstWrite1302
功    能:以burst方式向DS1302写入批量时间数据
参    数:ptr--指向时间数据存放地址的指针
返回值  :读出的数据
说    明:时间数据的存放格式是:
          秒,分,时,日,月,星期,年,控制
            【7个数据(BCD格式)+1个控制】
********************************************/
void BurstWrite1302(uchar *ptr)
{
    uchar i;
   
    W_Data(0x8e,0x00);      //允许写入     
    DS_RST0;
    DS_SCL0;
    _NOP();
    DS_RST1;
    Write1Byte(0xbe);       // 0xbe:时钟多字节写入命令
    for (i = 8; i > 0; i--)
    {
        Write1Byte(*ptr++);
    }
    DS_SCL1;
    DS_RST0;
    W_Data(0x8e,0x80);      // 禁止写入
}
/*******************************************
函数名称:BurstRead1302
功    能:以burst方式从DS1302读出批量时间数据
参    数:ptr--指向存放时间数据地址的指针
返回值  :无
说    明:时间数据的存放格式是:
          秒,分,时,日,月,星期,年,控制
            【7个数据(BCD格式)+1个控制】
********************************************/
void BurstRead1302(uchar *ptr)
{
    uchar i;
  
    DS_RST0;
    DS_SCL0;
    _NOP();
    DS_RST1;
    Write1Byte(0xbf);             //0xbf:时钟多字节读命令
    for (i = 8; i > 0; i--)
    {
       *ptr++ = Read1Byte();
    }
    DS_SCL1;
    DS_RST0;
}
/*******************************************
函数名称:BurstWriteRAM
功    能:以burst方式向DS1302的RAM中写入批量数据
参    数:ptr--指向存放数据地址的指针
返回值  :无
说明    :共写入31个字节的数据
********************************************/
void BurstWriteRAM(uchar *ptr)
{
    uchar i;
   
    W_Data(0x8e,0x00);         //允许写入
    DS_RST0;
    DS_SCL0;
    _NOP();
    DS_RST1;
    Write1Byte(0xfe);          //0xfe:RAM多字节写命令
    for (i = 31; i>0; i--)     //RAM共有31个字节
    {
        Write1Byte(*ptr++);
    }
    DS_SCL1;
    DS_RST0;
    W_Data(0x8e,0x80);          //禁止写入
}
/*******************************************
函数名称:BurstReadRAM
功    能:以burst方式从DS1302的RAM中读出批量数据
参    数:ptr--指向数据存放地址的指针
返回值  :无
说明    :共读出31个字节的数据
********************************************/
void BurstReadRAM(uchar *ptr)
{
    uchar i;
  
    DS_RST0;
    DS_SCL0;
    _NOP();
    DS_RST1;
    Write1Byte(0xff);             //0xff:RAM的多字节读命令
    for (i = 31; i > 0; i--)
    {
       *ptr++ = Read1Byte();   
    }
    DS_SCL1;
    DS_RST0;
}
/*******************************************
函数名称:Set_DS1302
功    能:设置DS1302内部的时间
参    数:ptr--指向存放数据地址的指针
返回值  :无
说明    :写入数据的格式:
            秒 分 时 日 月 星期 年  【共7个字节】
********************************************/
void Set_DS1302(uchar *ptr)
{
    uchar i;
    uchar addr = 0x80;
   
    W_Data(0x8e,0x00);    //允许写入
   
    for(i = 7;i > 0;i--)
    {
        W_Data(addr,*ptr++);
        addr += 2;
    }
    W_Data(0x8e,0x80);      //禁止
}
/********************************************************************
*
* 名称: Get_DS1302
* 说明:
* 功能: 读取DS1302当前时间
* 调用: R_Data(uchar addr)
* 输入: ucCurtime: 保存当前时间地址。当前时间格式为: 秒 分 时 日 月 星期 年
* 7Byte (BCD码) 1B 1B 1B 1B 1B 1B 1B
* 返回值: 无
***********************************************************************/
/*******************************************
函数名称:Get_DS1302
功    能:读取DS1302内部的时间
参    数:ptr--指向数据存放地址的指针
返回值  :无
说明    :读出数据的格式:
            秒 分 时 日 月 星期 年  【共7个字节】
********************************************/
void Get_DS1302(uchar *ptr)
{
    uchar i;
    uchar addr = 0x81;
   
    for(i = 0;i < 7;i++)
    {
        ptr = R_Data(addr);
        addr += 2;
    }
}







void MCLK_SELECT(void)
{
   unsigned int i;
  BCSCTL1&=~XT2OFF;       //XT2振荡器启动
    //等待转换时间
    do
    {
        IFG1&=~OFIFG;
        for(i=0xff;i>0;i--);

    }
    while((IFG1&OFIFG)!=0);
    BCSCTL2|=SELM1;    //选择xt2为主时钟振荡器
}



void main(void)
{
        //uchar disptemp[8];

        WDTCTL = WDTPW + WDTHOLD;   //关闭看门狗
        void MCLK_SELECT();
        //disptemp[2]=0x3a;   // ":"对应的编码
        //disptemp[5]=0x3a;
        Reset_DS1302();



        /*****测试更改和读出时间*****/
        Set_DS1302(wdata);
        Get_DS1302(rdata);

        _NOP();         //在此处设置断点,观察rdata是否与wdata一致

        /*****测试连续读写时间寄存器*****/
        BurstWrite1302(bwdata);
        BurstRead1302(brdata);

        _NOP();         //在此处设置断点,观察brdata是否与bwdata一致

        /*****测试连续读写RAM*****/
        BurstWriteRAM(rwdata);
        BurstReadRAM(rrdata);

        _NOP();         //在此处设置断点,观察rrdata是否与rwdata一致
}

最新回复

各位大虾需要 用“单片机实现液晶显示”的话,可以跟我索取资料。dwin99@live.cn  详情 回复 发表于 2009-8-29 19:56
点赞 关注

回复
举报

80

帖子

0

TA的资源

一粒金砂(初级)

沙发
 

  1. void MCLK_SELECT(); // 函数定义?
  2. //改为
  3. MCLK_SELECT();
复制代码
 
 

回复

85

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
给一个以前能用的你参考一下
  1. #include
  2. #include

  3. #define MULTI_ROM_EN 0

  4. sbit TIMERST =P1^2;
  5. sbit TIMECLK =P1^1;
  6. sbit TIMEIO  =P1^0;


  7. //打开DS1302
  8. void TimeSpiOpen(void)
  9. {
  10.   TIMECLK = 0;
  11.   TIMERST = 0;//禁止DS1302
  12.   TIMEIO  = 1;//释放数据总线
  13.   TIMERST = 1;//使能DS1302
  14. }

  15. //关闭DS1302
  16. void TimeSpiClose(void)
  17. {
  18.   TIMERST = 0;//禁止DS1302
  19.   TIMEIO  = 1;//释放数据总线
  20.   TIMECLK = 1;
  21. }
  22. //读写DS1302
  23. unsigned char TimeSpiReadWrite(unsigned char val)
  24. {
  25.   extern void _rrca(void);
  26.   unsigned char i;
  27.   ACC = val;//取8位数据
  28.   for (i = 8;i > 0; i--)
  29.   {
  30.     TIMECLK = 0;//时钟下降沿输入数据(DS1302读)
  31.     _nop_();//延时
  32.     CY = TIMEIO;//接收串行数据到CY
  33.    #pragma asm
  34.      RRC A      //右移一位数据到CY(先存后取)
  35.    #pragma endasm
  36.     TIMEIO = CY;//发送串行数据
  37.     TIMECLK = 1;//时钟上升沿打入数据(DS1302写)
  38.     TIMEIO  = 1;//释放数据总线
  39.   }
  40.   val = ACC;
  41.   return val;
  42. }

  43. //读DS1302字节
  44. unsigned char TimeByteRead(unsigned char address)
  45. {
  46.   TimeSpiOpen();//打开DS1302
  47.   TimeSpiReadWrite(address);//写入DS1302命令
  48.   address = TimeSpiReadWrite(0xff);//读入DS1302数据
  49.   TimeSpiClose();//关闭DS1302
  50.   return address;//返回数据
  51. }

  52. //读DS1302RAM字节
  53. #if MULTI_ROM_EN > 0
  54. unsigned char TimeRamByteRead(unsigned char address)
  55. {
  56.   TimeSpiOpen();//打开DS1302
  57.   TimeSpiReadWrite((address << 1) | 0xc1);//写入DS1302命令
  58.   address = TimeSpiReadWrite(0xff);//读入DS1302数据
  59.   TimeSpiClose();//关闭DS1302
  60.   return address;//返回数据
  61. }
  62. #endif

  63. //写DS1302字节
  64. void TimeByteWrite(unsigned char address, unsigned char val)
  65. {
  66.   TimeSpiOpen();//打开DS1302
  67.   TimeSpiReadWrite(address);//写地址
  68.   TimeSpiReadWrite(val);//写数据
  69.   TimeSpiClose();//关闭DS1302
  70. }

  71. //写DS1302RAM字节
  72. #if MULTI_ROM_EN > 0
  73. void TimeRamByteWrite(unsigned char address, unsigned char val)
  74. {
  75.   TimeSpiOpen();//打开DS1302
  76.   TimeSpiReadWrite((address << 1) | 0xc0);//写地址
  77.   TimeSpiReadWrite(val);//写数据
  78.   TimeSpiClose();//关闭DS1302
  79. }
  80. #endif

  81. //使能DS1302写保护
  82. void TimeWriteEnable(void)
  83. {
  84.   TimeByteWrite(0x8e,0x80);//使能DS1302写保护
  85. }

  86. //开放DS1302写保护
  87. void TimeWrieDisbale(void)
  88. {
  89.   TimeByteWrite(0x8e,0);//开放DS1302写保护
  90. }

  91. //DS1302工作开始
  92. void TimeWorkStart(void)
  93. {
  94.   unsigned char val;
  95.   TimeWrieDisbale();//开放DS1302写保护
  96.   TimeByteWrite(0x8c, 0x00);   //清零年,月,日,时,分,秒
  97.   TimeByteWrite(0x8a, 0x00);
  98.   TimeByteWrite(0x88, 0x00);
  99.   TimeByteWrite(0x86, 0x00);
  100.   TimeByteWrite(0x84, 0x00);
  101.   TimeByteWrite(0x82, 0x00);
  102.   TimeByteWrite(0x80, 0x00);
  103.   val = TimeByteRead(0x81);//读秒寄存器数据
  104.   val &= 0x7f;//打开振荡器
  105.   TimeByteWrite(0x80, val);//打开振荡器  
  106.   TimeByteWrite(0x90, 0xa5);//打开充电二极管
  107.   val = TimeByteRead(0x85);//读时寄存器数据
  108.   val &= 0x3f;//24小时制
  109.   TimeByteWrite(0x84, val);//24小时制
  110.   TimeWriteEnable();//使能DS1302写保护
  111. }
复制代码
 
 
 

回复

42

帖子

0

TA的资源

一粒金砂(初级)

4
 
输出OXFF 先把时钟降下来,看;
再对输入指令进行检查,输出FF极有可能根本没有输出
 
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

5
 
在执行程序的时候 执行前是0x00,执行之后就变成0xff了,这会是没有输出吗?把时钟降下来是什么意思啊?
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

6
 
有可能是DS1302根本没有响应....
不能排除硬件的问题....
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

7
 
引用 5 楼 great_bug 的回复:
有可能是DS1302根本没有响应....
不能排除硬件的问题....

很有可能DS1302根本就没工作,
看下DS1302的晶振对不对,不能太高,然后再检查DS1302的电源
再检查下口线的上拉电阻,最好用上拉电阻
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

8
 
感觉像是被上拉全都拉高了

LZ你有把芯片接上吗?
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

9
 
接上拉电阻也没有用 我确实接上了  但是发现芯片不供电出来的结果也是0xff
正是没有写进去 但这是什么原因呢
 
 
 

回复

84

帖子

0

TA的资源

一粒金砂(初级)

10
 
接上拉电阻也没有用 我确实接上了  但是发现芯片不供电出来的结果也是0xff
正是没有写进去 但这是什么原因呢
 
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

11
 
确认你的1302是否正品。国产的1302中,ram一般是不能使用的,只有dallas的原装芯片才有!

#define DS_RST_IN P2DIR &= ~DS_RST
#define DS_RST_OUT P2DIR |= DS_RST
#define DS_RST0 P2OUT &= ~DS_RST
#define DS_RST1 P2OUT |= DS_RST
改成
#define DS_RST_IN P2DIR &= ~(1< #define DS_RST_OUT P2DIR |= (1< #define DS_RST0 P2OUT &= ~(1< #define DS_RST1 P2OUT |= (1< 试试
其他两个管脚同上!
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

12
 
谢谢各位的回答 < <这个符号在这里是什么意思呢  没见过 试过了还是不行
我也不知道芯片是不是国产的 但确定不是dallas原装的 我也怀疑是芯片的问题
 
 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

13
 
<< 左移.....LZ没学过C语言?
 
 
 

回复

62

帖子

0

TA的资源

一粒金砂(初级)

14
 
可是在这里左移?我不是太明白。请问这怎么解释啊
 
 
 

回复

88

帖子

0

TA的资源

一粒金砂(初级)

15
 
我遇到过和楼主一样的问题,做18b20是也遇到过,刨去器件问题,都是上拉电阻有问题。1302的sda和scl要正确连接一个上拉!
 
 
 

回复

52

帖子

0

TA的资源

一粒金砂(初级)

16
 
引用 13 楼 ruby19840306 的回复:
可是在这里左移?我不是太明白。请问这怎么解释啊

数据发送是一位一位的发送的,所以接到一位就应该马上移动到正确的位置
例如对面先发高再发低,x=0;你X|=对面的数据(1或者0)然后左移,这样接到8位后就是正确的数据了
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

17
 
各位大虾需要 用“单片机实现液晶显示”的话,可以跟我索取资料。dwin99@live.cn
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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

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

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

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