|
/*********************************************************************/ /* 實時時鐘模塊 時鐘芯片型號:DS1302 */ /* /*/ /*********************************************************************/ sbit T_CLK = P2^7; /*實時時鐘時鐘線引腳 */ sbit T_IO = P1^4; /*實時時鐘數(shù)據(jù)線引腳 */ sbit T_RST = P1^5; /*實時時鐘復(fù)位線引腳 */ /******************************************************************** * * 名稱: v_RTInputByte * 說明: * 功能: 往DS1302寫入1Byte數(shù)據(jù) * 調(diào)用: * 輸入: ucDa 寫入的數(shù)據(jù) * 返回值: 無 ***********************************************************************/ void v_RTInputByte(uchar ucDa) { uchar i; ACC = ucDa; for(i=8; i>0; i--) { T_IO = ACC0; /*相當(dāng)于匯編中的 RRC */ T_CLK = 1; T_CLK = 0; ACC = ACC >> 1; } } /******************************************************************** * * 名稱: uchar uc_RTOutputByte * 說明: * 功能: 從DS1302讀取1Byte數(shù)據(jù) * 調(diào)用: * 輸入: * 返回值: ACC ***********************************************************************/ uchar uc_RTOutputByte(void) { uchar i; for(i=8; i>0; i--) { ACC = ACC >>1; /*相當(dāng)于匯編中的 RRC */ ACC7 = T_IO; T_CLK = 1; T_CLK = 0; } return(ACC); } /******************************************************************** * * 名稱: v_W1302 * 說明: 先寫地址,后寫命令/數(shù)據(jù) * 功能: 往DS1302寫入數(shù)據(jù) * 調(diào)用: v_RTInputByte() * 輸入: ucAddr: DS1302地址, ucDa: 要寫的數(shù)據(jù) * 返回值: 無 ***********************************************************************/ void v_W1302(uchar ucAddr, uchar ucDa) { T_RST = 0; T_CLK = 0; T_RST = 1; v_RTInputByte(ucAddr); /* 地址,命令 */ v_RTInputByte(ucDa); /* 寫1Byte數(shù)據(jù)*/ T_CLK = 1; T_RST =0; } /******************************************************************** * * 名稱: uc_R1302 * 說明: 先寫地址,后讀命令/數(shù)據(jù) * 功能: 讀取DS1302某地址的數(shù)據(jù) * 調(diào)用: v_RTInputByte() , uc_RTOutputByte() * 輸入: ucAddr: DS1302地址 * 返回值: ucDa :讀取的數(shù)據(jù) ***********************************************************************/ uchar uc_R1302(uchar ucAddr) { uchar ucDa; T_RST = 0; T_CLK = 0; T_RST = 1; v_RTInputByte(ucAddr); /* 地址,命令 */ ucDa = uc_RTOutputByte(); /* 讀1Byte數(shù)據(jù) */ T_CLK = 1; T_RST =0; return(ucDa); } /******************************************************************** * * 名稱: v_BurstW1302T * 說明: 先寫地址,后寫數(shù)據(jù)(時鐘多字節(jié)方式) * 功能: 往DS1302寫入時鐘數(shù)據(jù)(多字節(jié)方式) * 調(diào)用: v_RTInputByte() * 輸入: pSecDa: 時鐘數(shù)據(jù)地址 格式為: 秒 分 時 日 月 星期 年 控制 * 8Byte (BCD碼) 1B 1B 1B 1B 1B 1B 1B 1B * 返回值: 無 ***********************************************************************/ void v_BurstW1302T(uchar *pSecDa) { uchar i; v_W1302(0x8e,0x00); /* 控制命令,WP=0,寫操作?*/ T_RST = 0; T_CLK = 0; T_RST = 1; v_RTInputByte(0xbe); /* 0xbe:時鐘多字節(jié)寫命令 */ for (i=8;i>0;i--) /*8Byte = 7Byte 時鐘數(shù)據(jù) + 1Byte 控制*/ { v_RTInputByte(*pSecDa);/* 寫1Byte數(shù)據(jù)*/ pSecDa++; } T_CLK = 1; T_RST =0; } /******************************************************************** * * 名稱: v_BurstR1302T * 說明: 先寫地址,后讀命令/數(shù)據(jù)(時鐘多字節(jié)方式) * 功能: 讀取DS1302時鐘數(shù)據(jù) * 調(diào)用: v_RTInputByte() , uc_RTOutputByte() * 輸入: pSecDa: 時鐘數(shù)據(jù)地址 格式為: 秒 分 時 日 月 星期 年 * 7Byte (BCD碼) 1B 1B 1B 1B 1B 1B 1B * 返回值: ucDa :讀取的數(shù)據(jù) ***********************************************************************/ void v_BurstR1302T(uchar *pSecDa) { uchar i; T_RST = 0; T_CLK = 0; T_RST = 1; v_RTInputByte(0xbf); /* 0xbf:時鐘多字節(jié)讀命令 */ for (i=8; i>0; i--) { *pSecDa = uc_RTOutputByte(); /* 讀1Byte數(shù)據(jù) */ pSecDa++; } T_CLK = 1; T_RST =0; } /******************************************************************** * * 名稱: v_BurstW1302R * 說明: 先寫地址,后寫數(shù)據(jù)(寄存器多字節(jié)方式) * 功能: 往DS1302寄存器數(shù)寫入數(shù)據(jù)(多字節(jié)方式) * 調(diào)用: v_RTInputByte() * 輸入: pReDa: 寄存器數(shù)據(jù)地址 * 返回值: 無 ***********************************************************************/ void v_BurstW1302R(uchar *pReDa) { uchar i; v_W1302(0x8e,0x00); /* 控制命令,WP=0,寫操作?*/ T_RST = 0; T_CLK = 0; T_RST = 1; v_RTInputByte(0xfe); /* 0xbe:時鐘多字節(jié)寫命令 */ for (i=31;i>0;i--) /*31Byte 寄存器數(shù)據(jù) */ { v_RTInputByte(*pReDa); /* 寫1Byte數(shù)據(jù)*/ pReDa++; } T_CLK = 1; T_RST =0; } /******************************************************************** * * 名稱: uc_BurstR1302R * 說明: 先寫地址,后讀命令/數(shù)據(jù)(寄存器多字節(jié)方式) * 功能: 讀取DS1302寄存器數(shù)據(jù) * 調(diào)用: v_RTInputByte() , uc_RTOutputByte() * 輸入: pReDa: 寄存器數(shù)據(jù)地址 * 返回值: 無 ***********************************************************************/ void v_BurstR1302R(uchar *pReDa) { uchar i; T_RST = 0; T_CLK = 0; T_RST = 1; v_RTInputByte(0xff); /* 0xbf:時鐘多字節(jié)讀命令 */ for (i=31; i>0; i--) /*31Byte 寄存器數(shù)據(jù) */ { *pReDa = uc_RTOutputByte(); /* 讀1Byte數(shù)據(jù) */ pReDa++; } T_CLK = 1; T_RST =0; } /******************************************************************** * * 名稱: v_Set1302 * 說明: * 功能: 設(shè)置初始時間 * 調(diào)用: v_W1302() * 輸入: pSecDa: 初始時間地址。初始時間格式為: 秒 分 時 日 月 星期 年 * 7Byte (BCD碼) 1B 1B 1B 1B 1B 1B 1B * 返回值: 無 ***********************************************************************/ void v_Set1302(uchar *pSecDa) { uchar i; uchar ucAddr = 0x80; v_W1302(0x8e,0x00); /* 控制命令,WP=0,寫操作?*/ for(i =7;i>0;i--) { v_W1302(ucAddr,*pSecDa); /* 秒 分 時 日 月 星期 年 */ pSecDa++; ucAddr +=2; } v_W1302(0x8e,0x80); /* 控制命令,WP=1,寫保護?*/ } /******************************************************************** * * 名稱: v_Get1302 * 說明: * 功能: 讀取DS1302當(dāng)前時間 * 調(diào)用: uc_R1302() * 輸入: ucCurtime: 保存當(dāng)前時間地址。當(dāng)前時間格式為: 秒 分 時 日 月 星期 年 * 7Byte (BCD碼) 1B 1B 1B 1B 1B 1B 1B * 返回值: 無 ***********************************************************************/ void v_Get1302(uchar ucCurtime[]) { uchar i; uchar ucAddr = 0x81; for (i=0;i<7;i++) { ucCurtime[i] = uc_R1302(ucAddr);/*格式為: 秒 分 時 日 月 星期 年 */ ucAddr += 2; } } |