ds1302读取只有三个能显示正确,怎么回事,实在检查不出问题所在

bencsj   2010-5-9 12:36 楼主
Write_Ds1302Byte(0x8f,0);
1。 sec = BCDToDEC(Read_DS1302Byte(SEC_READ));
      Delay(100);

2。 min = BCDToDEC(Read_DS1302Byte(MIN_READ));  
                Delay(100);

3。 hour = BCDToDEC(Read_DS1302Byte(HOUR_READ));
                Delay(100);

4。 day = BCDToDEC(Read_DS1302Byte(DATE_READ));
                Delay(100);

5。 month = BCDToDEC(Read_DS1302Byte(MON_READ));
                Delay(100);

6。 year = BCDToDEC(Read_DS1302Byte(YEAR_READ));
                Delay(100);

每次读取时候只有1,3,5能显示正确,2,4,6显示不正确。不管怎么改读取的顺序,比如先读年再月日等等,都是只有1,3,5位置的能正确显示,2,4,6的不能。我加了延时还是不行,是怎么回事啊?大侠棒棒忙啊。


前面的1,2,3,4,5,6只是代表位置,这样好讲一点。实际程序中是没有的这几个数字

回复评论 (5)

#define SEC_WRI 0x80
#define SEC_READ 0x81
#define MIN_WRI 0x82
#define MIN_READ 0x83
#define HOUR_WRI 0x84
#define HOUR_READ 0x85
#define DATE_WRI 0x86
#define DATE_READ 0x87
#define MON_WRI 0x88
#define MON_READ 0x89
#define WEEK_WRI 0x8A
#define WEEK_READ 0x8B
#define YEAR_WRI 0x8C
#define YEAR_READ 0x8D

定义没问题啊
点赞  2010-5-9 14:04
建议用“连续读取”的模式,这样比单个数据读取省时间。


  1. #ifndef _DS1302_H_
  2. #define _DS1302_H_
  3. #include "const.h"
  4. #include "chiptypedef.h"

  5. /**********************************************
  6. 仅实现多字节读取模式,单字节和RAM的没有实现
  7. 仅实现24小时制模式,12小时制没实现
  8. ***********************************************/

  9. //更改为合适的位
  10. #define RST_PIN P3_2
  11. #define SCLK_PIN P3_3
  12. #define IO_PIN P3_4



  13. typedef struct tagBCDDATETIME //注意:字节顺序必须和burst的传输顺序一致
  14. {
  15.         BYTE nSecond;
  16.         BYTE nMinute;
  17.         BYTE nHour;

  18.         BYTE nDay;
  19.         BYTE nMonth;
  20.         BYTE nDayOfWeek;

  21.         BYTE nYear;
  22.         BYTE WriteProtect;        // Before ANY write operation to the clock or RAM, bit 7 must be 0

  23. }BCDDATETIME;


  24. void InitDS1302();
  25. void SetDateTime(const BCDDATETIME* pBCDDateTime);
  26. void GetDateTime(BCDDATETIME* pBCDDateTime);


  27. ///////////////////////////////////////
  28. //

  29. typedef enum tagCOMMANDBYTE
  30. {
  31.         SECOND_WRITE = 0x80,
  32.            SECOND_READ,

  33.         MINUTE_WRITE,
  34.         MINUTE_READ,

  35.         HOUR_WRITE,
  36.         HOUR_READ,

  37.         DATE_WRITE,
  38.         DATE_READ,

  39.         MONTH_WRITE,
  40.         MONTH_READ,

  41.         DAY_WRITE,
  42.         DAY_READ,

  43.         YEAR_WRITE,
  44.         YEAR_READ,

  45.         CONTROL = 0x8e,        //控制寄存器
  46.         TRICKLE_CHARGE = 0x90,  //涓流充电设置

  47.         CLOCK_BURST_WRITE = 0xbe,    //burst模式传输字节
  48.         CLOCK_BURST_READ = 0xbf,


  49.         RAM_BURST_WRITE        = 0xfe,          //burst模式读写ram
  50.         RAM_BURST_READ        = 0xff,
  51. }COMMANDBYTE;



  52. static void WriteSingleCmdByte(COMMANDBYTE cmd, BYTE Data);
  53. static BYTE ReadSingleCmdByte(COMMANDBYTE cmd);

  54. static void WriteOneByte(BYTE byte);
  55. static BYTE ReadOneByte();



  56. #endif
点赞  2010-5-9 16:38
1302接了上拉电阻就好了
点赞  2010-5-11 16:42

  1. #include "ds1302.h"
  2. #include "stcdelay.h"

  3. #define CLOCK_HALT_MASK 0x80                  //1000 0000
  4. #define HALF_FULL_MODE_MASK 0x80    //1000 0000 12/24小时模式
  5. #define AM_PM_MASK 0x20                          //0010 0000


  6. #define DISABLE_WRITE_PROTECT 0x00  //允许写入
  7. #define ENABLE_WRITE_PROTECT 0x80        //禁止写入


  8. void InitDS1302()
  9. {
  10.         BYTE temp = 0;
  11.         /*********************************************************
  12.          At power-up,  RST  must be a logic 0 until VCC > 2.0V.  
  13.          Also SCLK must be at a logic 0 when  RST  is driven to
  14.          a logic 1 state.
  15.         *******************************************************/
  16.        
  17.         RST_PIN = 0;

  18.         DelayMS(10);


  19.         RST_PIN = 1;
  20.         SCLK_PIN = 0;

  21.                
  22.         WriteSingleCmdByte(CONTROL, DISABLE_WRITE_PROTECT);         //允许写
  23.         /********************************************************************************
  24.         In  order  to  prevent  accidental  enabling,  only  a pattern of 1010 will enable
  25.         the trickle charger(TCS),
  26.         有备用电池,涓流充电用处不大
  27.         *********************************************************************************/
  28.         WriteSingleCmdByte(TRICKLE_CHARGE, 0x00); //不使用充电功能  
  29.        
  30.         temp = ReadSingleCmdByte(SECOND_READ);//读出,然后再写入
  31.         RESET_STATE_FLAG(temp, CLOCK_HALT_MASK);//清CLOCK HALT FLAG,以便可以正常启动

  32.         WriteSingleCmdByte(SECOND_WRITE, temp);        
  33. }

  34. static void WriteSingleCmdByte(COMMANDBYTE cmd, BYTE Data)
  35. {
  36.         RST_PIN = 0;
  37.         SCLK_PIN = 0;
  38.           RST_PIN = 1;

  39.         WriteOneByte(cmd);
  40.         WriteOneByte(Data);

  41.         RST_PIN = 0;
  42. }

  43. static BYTE ReadSingleCmdByte(COMMANDBYTE cmd)
  44. {
  45.         BYTE Ret = 0;

  46.         RST_PIN = 0;
  47.         SCLK_PIN = 0;
  48.           RST_PIN = 1;

  49.         WriteOneByte(cmd);
  50.         Ret = ReadOneByte();

  51.        
  52.         RST_PIN = 0;

  53.         return Ret;
  54. }

  55. static void WriteOneByte(BYTE byte)
  56. {
  57.         BYTE i = 0;
  58.         for(i = 0; i < 8; i++)
  59.         {
  60.                 IO_PIN = TEST_BIT(byte, i);
  61.                 SCLK_PIN = 1;
  62.                 NOP();
  63.                 NOP();
  64.                 NOP();
  65.                 SCLK_PIN = 0;               
  66.         }
  67. }

  68. static BYTE ReadOneByte()
  69. {
  70.         BYTE i = 0;
  71.         BYTE Ret = 0;
  72.         /*******************************************************************
  73.         Note that the first data bit to be transmitted occurs on the first falling
  74.         edge after the last bit of the command byte is written.
  75.         所以进入循环后马上读取IO数据
  76.         *******************************************************************/
  77.         for(i = 0; i < 8; i++)
  78.         {
  79.                 if(IO_PIN)
  80.                 {
  81.                         SET_BIT(Ret, i);
  82.                 }


  83.                 SCLK_PIN = 1;
  84.                 NOP();
  85.                 NOP();
  86.                 NOP();
  87.                 SCLK_PIN = 0;
  88.                                
  89.         }

  90.         return Ret;
  91.        
  92. }

  93. void SetDateTime(const BCDDATETIME* pBCDDateTime)
  94. {
  95.         BYTE i = 0;

  96.         const BYTE* p = (BYTE*)pBCDDateTime;


  97.         RST_PIN = 0;
  98.         SCLK_PIN = 0;
  99.           RST_PIN = 1;

  100.         WriteOneByte(CLOCK_BURST_WRITE);

  101.        
  102.         for(i = 0; i < 8; i++)       
  103.         {
  104.                 WriteOneByte(*p);
  105.                 p++;       
  106.         }


  107.         RST_PIN = 0;
  108. }


  109. void GetDateTime(BCDDATETIME* pBCDDateTime)
  110. {
  111.         BYTE i = 0;
  112.         BYTE* p = (BYTE*)pBCDDateTime;

  113.         RST_PIN = 0;
  114.         SCLK_PIN = 0;
  115.           RST_PIN = 1;

  116.         WriteOneByte(CLOCK_BURST_READ);



  117.         /*******************************************************************
  118.         Note that the first data bit to be transmitted occurs on the first falling
  119.         edge after the last bit of the command byte is written.
  120.         所以进入循环后马上读取IO数据
  121.         *******************************************************************/
  122.         for(i = 0; i < 7; i++)                //最后一个字节是写保护字节,不需要读取
  123.         {
  124.                  *p = ReadOneByte();

  125.                 p++;
  126.         }

  127.        
  128.         RST_PIN = 0;
  129. }
点赞  2010-5-9 16:39
SEC_READ等的定义有问题,
1xxxxxx1 每个间隔为2,即从0x81起+2=0x83,+2=0x85,+2=0x87
到0x8D
点赞  2010-5-9 13:38
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复