久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 7736|回復: 1
打印 上一主題 下一主題
收起左側

[求助]DS1302問題

[復制鏈接]
跳轉到指定樓層
樓主
ID:8108 發表于 2009-1-27 15:27 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
今天看了1個關于ds1302的日期代碼,看不出它是如何得到電腦的系統時間的,不知道是不是protues讓它自動獲得,不需要編程,小弟是新手,請哪位高手幫忙解答一下.以下是頭文件.謝謝

***************************************************************************/
#ifndef _REAL_TIMER_DS1302_2003_7_21_
#define _REAL_TIMER_DS1302_2003_7_21_

sbit  DS1302_CLK = P1^6;              //實時時鐘時鐘線引腳
sbit  DS1302_IO  = P1^7;              //實時時鐘數據線引腳
sbit  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_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)    //用于計算 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_RST = 0;
    DS1302_CLK = 0;
    DS1302_RST = 1;
    DS1302InputByte(ucAddr);        // 地址,命令
    DS1302InputByte(ucDa);        // 寫1Byte數據
    DS1302_CLK = 1;
    DS1302_RST = 0;
}

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

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

void DS1302_SetTime(unsigned char Address, unsigned char Value)        // 設置時間函數
{
 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);
}

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:8838 發表于 2009-2-26 11:37 | 只看該作者

在protues中,如果程序沒有對DS1302進行寫操作,那么Protues會默認把電腦時間寫入DS1302
所以,如果你的驅動程序沒有正確的對DS1302寫入時間,Protues里就會顯示電腦當前的時間

回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲一页 | 欧美a级成人淫片免费看 | 91色啪| 午夜小视频在线播放 | www免费视频 | 欧美激情在线观看一区二区三区 | 成人福利电影 | 中文字幕不卡在线观看 | 日韩精品视频在线播放 | 久久综合伊人 | 精品一区二区三 | 一区二区三区视频在线观看 | 欧美在线视频二区 | 黄网免费看| 欧美久久久久 | 亚洲精品区| 亚洲一区二区中文字幕在线观看 | 91精品国产91久久久久久 | 午夜丰满寂寞少妇精品 | 成人网在线 | 黄色一级免费看 | 欧美一级一区 | 色资源在线视频 | 日韩在线一区二区三区 | 国产乱码一区 | 男人天堂999 | 亚洲免费网址 | 久久久国产一区 | 久久一视频 | av av在线| 色婷婷av99xx | 日韩欧美视频 | 精品福利在线视频 | 精品久久国产 | 欧美在线一区二区三区四区 | 欧美精品电影一区 | 欧美a级成人淫片免费看 | 亚洲国产成人精品女人久久久 | 男女午夜免费视频 | 久久久久久免费毛片精品 | 成人午夜网站 |