機(jī)電之家資源網(wǎng)
單片機(jī)首頁|單片機(jī)基礎(chǔ)|單片機(jī)應(yīng)用|單片機(jī)開發(fā)|單片機(jī)文案|軟件資料下載|音響制作|電路圖下載 |嵌入式開發(fā)
培訓(xùn)信息
贊助商
DS1302驅(qū)動程序
DS1302驅(qū)動程序
 更新時(shí)間:2008-7-27 16:10:50  點(diǎn)擊數(shù):2
【字體: 字體顏色

//******DS1302驅(qū)動程序*************

sbit  DS1302_CLK = P1^6;              //實(shí)時(shí)時(shí)鐘時(shí)鐘線引腳
sbit  DS1302_IO  = P1^7;              //實(shí)時(shí)時(shí)鐘數(shù)據(jù)線引腳
sbit  DS1302_RST = P1^5;              //實(shí)時(shí)時(shí)鐘復(fù)位線引腳
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; //定義的時(shí)間類型

#define AM(X) X
#define PM(X) (X+12)               // 轉(zhuǎn)成24小時(shí)制
#define DS1302_SECOND 0x80
#define DS1302_MINUTE 0x82
#define DS1302_HOUR  0x84
#define DS1302_WEEK  0x8A
#define DS1302_DAY  0x86
#define DS1302_MONTH 0x88
#define DS1302_YEAR  0x8C
#define DS1302_RAM(X) (0xC0+(X)*2)    //用于計(jì)算 DS1302_RAM 地址的宏

void DS1302InputByte(unsigned char d)  //實(shí)時(shí)時(shí)鐘寫入一字節(jié)(內(nèi)部函數(shù))
{
    unsigned char i;
    ACC = d;
    for(i=8; i>0; i--)
    {
        DS1302_IO = ACC0;            //相當(dāng)于匯編中的 RRC
        DS1302_CLK = 1;
        DS1302_CLK = 0;
        ACC = ACC >> 1;
    }
}

unsigned char DS1302OutputByte(void)  //實(shí)時(shí)時(shí)鐘讀取一字節(jié)(內(nèi)部函數(shù))
{
    unsigned char i;
    for(i=8; i>0; i--)
    {
        ACC = ACC >>1;            //相當(dāng)于匯編中的 RC
        ACC7 = DS1302_IO;
        DS1302_CLK = 1;
        DS1302_CLK = 0;
    }
    return(ACC);
}

void Write1302(unsigned char ucAddr, unsigned char ucDa) //ucAddr: DS1302地址, ucData: 要寫的數(shù)據(jù)
{
    DS1302_RST = 0;
    DS1302_CLK = 0;
    DS1302_RST = 1;
    DS1302InputByte(ucAddr);        // 地址,命令
    DS1302InputByte(ucDa);        // 寫1Byte數(shù)據(jù)
    DS1302_CLK = 1;
    DS1302_RST = 0;
}

unsigned char Read1302(unsigned char ucAddr) //讀取DS1302某地址的數(shù)據(jù)
{
    unsigned char ucData;
    DS1302_RST = 0;
    DS1302_CLK = 0;
    DS1302_RST = 1;
    DS1302InputByte(ucAddr|0x01);        // 地址,命令
    ucData = DS1302OutputByte();         // 讀1Byte數(shù)據(jù)
    DS1302_CLK = 1;
    DS1302_RST = 0;
    return(ucData);
}

void DS1302_SetProtect(bit flag)        //是否寫保護(hù)
{
 if(flag)
  Write1302(0x8E,0x10);
 else
  Write1302(0x8E,0x00);
}

void DS1302_SetTime(unsigned char Address, unsigned char Value)        // 設(shè)置時(shí)間函數(shù)
{
 DS1302_SetProtect(0);
 Write1302(Address, ((Value/10)<<4 | (Value%10)));
}

void DS1302_GetTime(SYSTEMTIME *Time)
{
 unsigned char ReadValue;
 ReadValue = Read1302(DS1302_SECOND);
 Time->Second = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
 ReadValue = Read1302(DS1302_MINUTE);
 Time->Minute = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
 ReadValue = Read1302(DS1302_HOUR);
 Time->Hour = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
 ReadValue = Read1302(DS1302_DAY);
 Time->Day = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F); 
 ReadValue = Read1302(DS1302_WEEK);
 Time->Week = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
 ReadValue = Read1302(DS1302_MONTH);
 Time->Month = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
 ReadValue = Read1302(DS1302_YEAR);
 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] = '\0';
}

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] = '\0';
}

void Initial_DS1302(void)
{
 unsigned char Second="Read1302"(DS1302_SECOND);
 if(Second&0x80)   
  DS1302_SetTime(DS1302_SECOND,0);
}

/********************************************************************************/
void BurstWrite1302(unsigned char *pWClock) //往DS1302寫入時(shí)鐘數(shù)據(jù)(多字節(jié)方式)
{
    unsigned char i;
    Write1302(0x8e,0x00);          // 控制命令,WP=0,寫操作?
    DS1302_RST = 0;
    DS1302_CLK = 0;
    DS1302_RST = 1;
    DS1302InputByte(0xbe);         // 0xbe:時(shí)鐘多字節(jié)寫命令
    for (i = 8; i>0; i--)       //8Byte = 7Byte 時(shí)鐘數(shù)據(jù) + 1Byte 控制
    {
        DS1302InputByte(*pWClock);  // 寫1Byte數(shù)據(jù)
        pWClock++;
    }
    DS1302_CLK = 1;
    DS1302_RST = 0;
}

void BurstRead1302(unsigned char *pRClock) //讀取DS1302時(shí)鐘數(shù)據(jù)(時(shí)鐘多字節(jié)方式)
{
    unsigned char i;
    DS1302_RST = 0;
    DS1302_CLK = 0;
    DS1302_RST = 1;
    DS1302InputByte(0xbf);              // 0xbf:時(shí)鐘多字節(jié)讀命令
    for (i=8; i>0; i--)
    {
       *pRClock = DS1302OutputByte();   // 讀1Byte數(shù)據(jù)
       pRClock++;
    }
    DS1302_CLK = 1;
    DS1302_RST = 0;
}

void DS1302_TimeStop(bit flag)           // 是否將時(shí)鐘停止
{
 unsigned char Data;
 Data=Read1302(DS1302_SECOND);
 DS1302_SetProtect(0);
 if(flag)
  Write1302(DS1302_SECOND, Data|0x80);
 else
  Write1302(DS1302_SECOND, Data&0x7F);
}

  • 上一篇: I2C 總線協(xié)議時(shí)序編程
  • 下一篇: LCD OCMC2X16A驅(qū)動模塊
  • 發(fā)表評論   告訴好友   打印此文  收藏此頁  關(guān)閉窗口  返回頂部
    熱點(diǎn)文章
     
    推薦文章
     
    相關(guān)文章
    網(wǎng)友評論:(只顯示最新5條。)
    關(guān)于我們 | 聯(lián)系我們 | 廣告合作 | 付款方式 | 使用幫助 | 機(jī)電之家 | 會員助手 | 免費(fèi)鏈接

    點(diǎn)擊這里給我發(fā)消息66821730(技術(shù)支持)點(diǎn)擊這里給我發(fā)消息66821730(廣告投放) 點(diǎn)擊這里給我發(fā)消息41031197(編輯) 點(diǎn)擊這里給我發(fā)消息58733127(審核)
    本站提供的機(jī)電設(shè)備,機(jī)電供求等信息由機(jī)電企業(yè)自行提供,該企業(yè)負(fù)責(zé)信息內(nèi)容的真實(shí)性、準(zhǔn)確性和合法性。
    機(jī)電之家對此不承擔(dān)任何保證責(zé)任,有侵犯您利益的地方請聯(lián)系機(jī)電之家,機(jī)電之家將及時(shí)作出處理。
    Copyright 2007 機(jī)電之家 Inc All Rights Reserved.機(jī)電之家-由機(jī)電一體化網(wǎng)更名-聲明
    電話:0571-87774297 傳真:0571-87774298
    杭州濱興科技有限公司提供技術(shù)支持

    主辦:杭州市高新區(qū)(濱江)機(jī)電一體化學(xué)會
    中國行業(yè)電子商務(wù)100強(qiáng)網(wǎng)站

    網(wǎng)站經(jīng)營許可證:浙B2-20080178-1