EngineersGarage

  • Engineers Garage Main Site
  • Visit our active EE Forums
    • EDABoard.com
    • Electro-Tech-Online
  • Projects & Tutorials
    • Circuits
    • Electronic Projects
    • Tutorials
    • Components
  • Digi-Key Store
    • Cables, Wires
    • Connectors, Interconnect
    • Discrete
    • Electromechanical
    • Embedded Computers
    • Enclosures, Hardware, Office
    • Integrated Circuits (ICs)
    • Isolators
    • LED/Optoelectronics
    • Passive
    • Power, Circuit Protection
    • Programmers
    • RF, Wireless
    • Semiconductors
    • Sensors, Transducers
    • Test Products
    • Tools
  • Advertise
You are here: Home / Topics / Interfacing DS1302(RTC) with an 8051… The time display on Lcd can run but there are problems!! Need some help and guide.

Interfacing DS1302(RTC) with an 8051… The time display on Lcd can run but there are problems!! Need some help and guide.

|

Microcontroller › 8051 › Interfacing DS1302(RTC) with an 8051… The time display on Lcd can run but there are problems!! Need some help and guide.

  • This topic has 0 replies, 1 voice, and was last updated 14 years, 1 month ago by Ang wei qiang.
Viewing 1 post (of 1 total)
  • Author
    Posts
  • May 9, 2011 at 6:33 am #3843
    Ang wei qiang
    Participant

     


     
    For all the 1,3,5,7,9mins and so on…or maybe i should say is the odd 
     
    mins.
    It will display something like the patterns shown below for the 1 
     
    minute. 
     
    Here is a example of 85error that it display.
     
    The first 5 patterns of the "1 hr and 5min
    "01:85:00"
    "01:05:01"
    "01:85:02"
    "01:05:03"
    "01:85:04"
     

     
    As for all the 2,4,6,8,10mins and so on…or maybe i should say is the 
     
    even mins.
    It will display something like the patterns shown below for the first 
     
    59 second and the 1 hour.
     
     
     
     
    For the first 59 second,i show first five patterns of it.
    "00:85:00"
    "85:00:01"
    "00:85:02"
    "85:00:03"
    "00:85:04"
    .
    .
    .
    .
     
    "85:00:59"
     
     
    For the starting of 1 minute,i show first five patterns of it.
    "00:85:00"
    "00:01:01"
    "00:85:02"
    "00:01:03"
    "00:85:04"
    .
    .
    .
    .
     
     
     
    For the starting of 1 hour,i show first five patterns of it.
    "01:85:00"
    "85:00:01"
    "01:85:02"
    "85:00:03"
    "01:85:04"
    .
    .
    .
    .
     
     

     
     
    On top is the error that i face,im not sure how can i solve it.
     
    The DS1302 header file,i got on a website and i have modify it to make the time to run.
     
    What can be the problem that causing this??
     
    Let me know anything that i could try to solve this problem.
    Please,I need some guide and help with it.
     
    I will paste the header file. Let me know if you want to see my c code.  ~~ THx ~~
     
     
     
    Below is the modified header file code: (There are some part of it which i do not understand)
     
     
     /***************************************************************************/ 
    #ifndef _REAL_TIMER_DS1302_2003_7_21_ 
    #define _REAL_TIMER_DS1302_2003_7_21_ 
     
    #define  DS1302_CLK P1_7              //ʵʱʱÖÓʱÖÓÏßÒý½Å  
    #define  DS1302_IO P1_6              //ʵʱʱÖÓÊý¾ÝÏßÒý½Å  
    #define  DS1302_RST P1_5              //ʵʱʱÖÓ¸´Î»ÏßÒý½Å 
    sbit  ACC0  = ACC^0 ;
    sbit  ACC7  = ACC^7  ;
     
    typedef struct __SYSTEMTIME__ 
    { 
    unsigned char Second; 
    unsigned char Minute; 
    unsigned char Hour; 
    unsigned char Week; 
    unsigned char Day; 
    unsigned char Month; 
    unsigned char  Year; 
    unsigned char DateString[9]; 
    unsigned char TimeString[9]; 
    }SYSTEMTIME; //¶¨ÒåµÄʱ¼äÀàÐÍ 
     
    #define AM(X) X 
    #define PM(X) (X+12)              // ת³É24Ð¡Ê±ÖÆ 
    #define DS1302_SECOND 0x80
    #define DS1302_SECOND_READ 0x81 
    #define DS1302_MINUTE 0x82
    #define DS1302_MINUTE_READ 0x83 
    #define DS1302_HOUR 0x84
    #define DS1302_HOUR_READ 0x85  
    #define DS1302_WEEK 0x8A
    #define DS1302_WEEK_READ 0x8B
    #define DS1302_DAY 0x86 
    #define DS1302_DAY_READ 0x87 
    #define DS1302_MONTH 0x88 
    #define DS1302_MONTH_READ 0x89 
    #define DS1302_YEAR 0x8C 
    #define DS1302_YEAR_READ    0x8D 
    #define DS1302_RAM(X) (0xC0+(X)*2)   //ÓÃÓÚ¼ÆËã DS1302_RAM µØÖ·µÄºê
     
     
    void DS1302InputByte(unsigned char d) //ʵʱʱÖÓдÈëÒ»×Ö½Ú(ÄÚ²¿º¯Êý) 
    {  
        unsigned char i; 
        ACC = d; 
        for(i=8; i>0; i–) 
        { 
            DS1302_IO = ACC0;           //Ï൱ÓÚ»ã±àÖÐµÄ RRC 
            DS1302_CLK = 1; 
            DS1302_CLK = 0; 
            ACC = ACC >> 1;  
        }  
    } 
     
    unsigned char DS1302OutputByte(void) //ʵʱʱÖÓ¶Áȡһ×Ö½Ú(ÄÚ²¿º¯Êý) 
    {  
        unsigned char i; 
        for(i=8; i>0; i–) 
        { 
            ACC = ACC >>1;         //Ï൱ÓÚ»ã±àÖÐµÄ RRC  
            ACC7 = DS1302_IO; 
            DS1302_CLK = 1; 
            DS1302_CLK = 0; 
        }  
        return(ACC);  
    } 
     
    void Write1302(unsigned char ucAddr, unsigned char ucDa) //ucAddr: DS1302µØÖ·, ucData: ҪдµÄÊý¾Ý 
    {   
        DS1302_CLK = 0; 
        DS1302_RST = 1; 
        DS1302InputByte(ucAddr);       // µØÖ·£¬ÃüÁî  
        DS1302InputByte(ucDa);       // д1ByteÊý¾Ý
        DS1302_CLK = 1; 
        DS1302_RST = 0;   
    }  
     
    unsigned char Read1302(unsigned char ucAddr) //¶ÁÈ¡DS1302ijµØÖ·µÄÊý¾Ý 
    { 
        unsigned char ucData;  
        DS1302_CLK = 0; 
        DS1302_RST = 1; 
        DS1302InputByte(ucAddr);        // µØÖ·£¬ÃüÁî  
        ucData = DS1302OutputByte();         // ¶Á1ByteÊý¾Ý 
        DS1302_CLK = 1; 
        DS1302_RST = 0; 
        return(ucData); 
    } 
     
    void DS1302_SetProtect(bit flag)        //ÊÇ·ñд±£»¤ 
    { 
    if(flag) 
    Write1302(0x8E,0x80); 
    else 
    Write1302(0x8E,0x00); 
    } 
     
    void DS1302_SetTime(unsigned char Address, unsigned char Value)        // ÉèÖÃʱ¼äº¯Êý 
    { 
    DS1302_SetProtect(0);  
    Write1302(Address, ((Value/10)<<4 | (Value%10)));
    DS1302_SetProtect(1);
    } 
     
    void DS1302_GetTime(SYSTEMTIME *Time) 
    { 
    unsigned char ReadValue; 
    ReadValue = Read1302(DS1302_SECOND_READ); 
    Time->Second = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F); 
    ReadValue = Read1302(DS1302_MINUTE_READ); 
    Time->Minute = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F); 
    ReadValue = Read1302(DS1302_HOUR_READ); 
    Time->Hour = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F); 
    ReadValue = Read1302(DS1302_DAY_READ); 
    Time->Day = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
    ReadValue = Read1302(DS1302_WEEK_READ); 
    Time->Week = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F); 
    ReadValue = Read1302(DS1302_MONTH_READ); 
    Time->Month = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F); 
    ReadValue = Read1302(DS1302_YEAR_READ); 
    Time->Year = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
    } 
     
    void DateToStr(SYSTEMTIME *Time) 
    { 
    Time->DateString[0] = Time->Year/10 + '0'; 
    Time->DateString[1] = Time->Year%10 + '0'; 
    Time->DateString[2] = '-'; 
    Time->DateString[3] = Time->Month/10 + '0'; 
    Time->DateString[4] = Time->Month%10 + '0'; 
    Time->DateString[5] = '-'; 
    Time->DateString[6] = Time->Day/10 + '0'; 
    Time->DateString[7] = Time->Day%10 + '0'; 
    Time->DateString[8] = ''; 
    } 
     
    void TimeToStr(SYSTEMTIME *Time) 
    { 
    Time->TimeString[0] = Time->Hour/10 + '0'; 
    Time->TimeString[1] = Time->Hour%10 + '0'; 
    Time->TimeString[2] = ':'; 
    Time->TimeString[3] = Time->Minute/10 + '0'; 
    Time->TimeString[4] = Time->Minute%10 + '0'; 
    Time->TimeString[5] = ':'; 
    Time->TimeString[6] = Time->Second/10 + '0'; 
    Time->TimeString[7] = Time->Second%10 + '0'; 
    Time->DateString[8] = ''; 
    } 
     
    /*  
    void Initial_DS1302(void) 
    { 
    unsigned char Second=Read1302(DS1302_SECOND); 
    if(Second&0x80)   
    DS1302_SetTime(DS1302_SECOND,0); 
    } 
     
    void BurstWrite1302(unsigned char *pWClock) //ÍùDS1302дÈëʱÖÓÊý¾Ý(¶à×Ö½Ú·½Ê½) 
    { 
        unsigned char i; 
        Write1302(0x8e,0x00);         // ¿ØÖÆÃüÁî,WP=0,д²Ù×÷? 
        DS1302_RST = 0; 
        DS1302_CLK = 0; 
        DS1302_RST = 1; 
        DS1302InputByte(0xbe);         // 0xbe:ʱÖÓ¶à×Ö½ÚдÃüÁî 
        for (i = 8; i>0; i–)     //8Byte = 7Byte ʱÖÓÊý¾Ý + 1Byte ¿ØÖÆ 
        { 
            DS1302InputByte(*pWClock); // д1ByteÊý¾Ý 
            pWClock++; 
        } 
        DS1302_CLK = 1; 
        DS1302_RST = 0; 
    }*/
    /******************************************************************************** 
    void BurstRead1302(unsigned char *pRClock) //¶ÁÈ¡DS1302ʱÖÓÊý¾Ý(ʱÖÓ¶à×Ö½Ú·½Ê½) 
    { 
        unsigned char i; 
        DS1302_RST = 0; 
        DS1302_CLK = 0; 
        DS1302_RST = 1; 
        DS1302InputByte(0xbf);             // 0xbf:ʱÖÓ¶à×Ö½Ú¶ÁÃüÁî  
        for (i=8; i>0; i–)  
        { 
           *pRClock = DS1302OutputByte();   // ¶Á1ByteÊý¾Ý  
           pRClock++; 
        } 
        DS1302_CLK = 1; 
        DS1302_RST = 0; 
    } 
     
    */
     
    void DS1302_TimeStop(bit flag)           // ÊÇ·ñ½«Ê±ÖÓÍ£Ö¹ 
    { 
    unsigned char Data; 
    Data=Read1302(DS1302_SECOND_READ); 
    DS1302_SetProtect(0); 
    if(flag) 
    Write1302(DS1302_SECOND, Data|0x80); 
    else 
    Write1302(DS1302_SECOND, Data&0x7F); 
    DS1302_SetProtect(1);
    } 
     
    #endif
     
     
     
  • Author
    Posts
Viewing 1 post (of 1 total)
  • You must be logged in to reply to this topic.
Log In

RSS Recent Posts

  • Can I make two inputs from one?? June 21, 2025
  • Beats Solo 4 June 21, 2025
  • Behlke swich June 21, 2025
  • Is AI making embedded software developers more productive? June 21, 2025
  • Simple LED Analog Clock Idea June 21, 2025

Stay Up To Date

Newsletter Signup
EngineersGarage

Copyright © 2025 WTWH Media LLC. All Rights Reserved. The material on this site may not be reproduced, distributed, transmitted, cached or otherwise used, except with the prior written permission of WTWH Media
Privacy Policy | Advertising | About Us

Search Engineers Garage

  • Engineers Garage Main Site
  • Visit our active EE Forums
    • EDABoard.com
    • Electro-Tech-Online
  • Projects & Tutorials
    • Circuits
    • Electronic Projects
    • Tutorials
    • Components
  • Digi-Key Store
    • Cables, Wires
    • Connectors, Interconnect
    • Discrete
    • Electromechanical
    • Embedded Computers
    • Enclosures, Hardware, Office
    • Integrated Circuits (ICs)
    • Isolators
    • LED/Optoelectronics
    • Passive
    • Power, Circuit Protection
    • Programmers
    • RF, Wireless
    • Semiconductors
    • Sensors, Transducers
    • Test Products
    • Tools
  • Advertise