#include"ds1302.h"http://---DS1302寫入和讀取時分秒的地址命令---////---秒分時日月周年 最低位讀寫位;-------//uchar code READ_RTC_ADDR[7] = {0x81, 0x83, 0x85, 0x87, 0x89, 0x8b, 0x8d}; uchar code WRITE_RTC_ADDR[7] = {0x80, 0x82, 0x84, 0x86, 0x88, 0x8a, 0x8c};//---DS1302時鐘初始化2013年1月1日星期二12點00分00秒。---////---存儲順序是秒分時日月周年,存儲格式是用BCD碼---//uchar TIME[7] = {0, 0, 0x12, 0x01, 0x01, 0x02, 0x13};/******************************************************************************** 函 數 名 : Ds1302Write* 函數功能 : 向DS1302命令(地址+數據)* 輸 入 : addr,dat* 輸 出 : 無*******************************************************************************/void Ds1302Write(uchar addr, uchar dat){ uchar n; RST = 0; _nop_(); SCLK = 0;//先將SCLK置低電平。 _nop_(); RST = 1; //然后將RST(CE)置高電平。 _nop_(); for (n=0; n<8; n++)//開始傳送八位地址命令 { DSIO = addr & 0x01;//數據從低位開始傳送 addr >>= 1; SCLK = 1;//數據在上升沿時,DS1302讀取數據 _nop_(); SCLK = 0; _nop_(); } for (n=0; n<8; n++)//寫入8位數據 { DSIO = dat & 0x01; dat >>= 1; SCLK = 1;//數據在上升沿時,DS1302讀取數據 _nop_(); SCLK = 0; _nop_(); } RST = 0;//傳送數據結束 _nop_();}/******************************************************************************** 函 數 名 : Ds1302Read* 函數功能 : 讀取一個地址的數據* 輸 入 : addr* 輸 出 : dat*******************************************************************************/uchar Ds1302Read(uchar addr){ uchar n,dat,dat1; RST = 0; _nop_(); SCLK = 0;//先將SCLK置低電平。 _nop_(); RST = 1;//然后將RST(CE)置高電平。 _nop_(); for(n=0; n<8; n++)//開始傳送八位地址命令 { DSIO = addr & 0x01;//數據從低位開始傳送 addr >>= 1; SCLK = 1;//數據在上升沿時,DS1302讀取數據 _nop_(); SCLK = 0;//DS1302下降沿時,放置數據 _nop_(); } _nop_(); for(n=0; n<8; n++)//讀取8位數據 { dat1 = DSIO;//從最低位開始接收 dat = (dat>>1) | (dat1<<7); SCLK = 1; _nop_(); SCLK = 0;//DS1302下降沿時,放置數據 _nop_(); } RST = 0; _nop_(); //以下為DS1302復位的穩定時間,必須的。 SCLK = 1; _nop_(); DSIO = 0; _nop_(); DSIO = 1; _nop_(); return dat; }/******************************************************************************** 函 數 名 : Ds1302Init* 函數功能 : 初始化DS1302.* 輸 入 : 無* 輸 出 : 無*******************************************************************************/void Ds1302Init(){ uchar n; Ds1302Write(0x8E,0X00); //禁止寫保護,就是關閉寫保護功能 for (n=0; n<7; n++)//寫入7個字節的時鐘信號:分秒時日月周年 { Ds1302Write(WRITE_RTC_ADDR[n],TIME[n]); } Ds1302Write(0x8E,0x80); //打開寫保護功能}/******************************************************************************** 函 數 名 : Ds1302ReadTime* 函數功能 : 讀取時鐘信息* 輸 入 : 無* 輸 出 : 無*******************************************************************************/void Ds1302ReadTime(){ uchar n; for (n=0; n<7; n++)//讀取7個字節的時鐘信號:分秒時日月周年 { TIME[n] = Ds1302Read(READ_RTC_ADDR[n]); }}