|
/*********************************************************************/ /* ds1302實(shí)時(shí)時(shí)鐘C程序 */ /*51hei.com會(huì)員經(jīng)典作品已經(jīng)測試成功/
#include < reg52.h> #include <intrins.h>
#define uchar unsigned char
sbit T_CLK = P3^4; /*實(shí)時(shí)時(shí)鐘時(shí)鐘線引腳 */ sbit T_IO = P3^3; /*實(shí)時(shí)時(shí)鐘數(shù)據(jù)線引腳 */ sbit T_RST = P3^2; /*實(shí)時(shí)時(shí)鐘復(fù)位線引腳 */ //sbit OE=P3^6; sbit ACC0=ACC^0; sbit ACC7=ACC^7;
uchar time[8]=" : : "; uchar min,hou,day,mon,yea;
void Init1302(void); void v_W1302(uchar ucAddr, uchar ucDa); uchar uc_R1302(uchar ucAddr); void v_BurstW1302T(uchar *pSecDa); void v_BurstR1302T(uchar *pSecDa); void v_BurstW1302R(uchar *pReDa); void v_BurstR1302R(uchar *pReDa); void v_Set1302(uchar *pSecDa); void v_Get1302(uchar ucCurtime[]); void donetime(void); void bcd_int(uchar i); void bcdtoInt(void); void SetTime(void); /******************************************************************** * * 名稱: v_RTInputByte * 說明: * 功能: 往DS1302寫入1Byte數(shù)據(jù) * 調(diào)用: * 輸入: ucDa 寫入的數(shù)據(jù) * 返回值: 無 ***********************************************************************/ void v_WTInputByte(uchar ucDa) { uchar i; //OE=0; ACC= ucDa; for(i=8; i>0; i--) { T_IO = ACC0; //*相當(dāng)于匯編中的 RRC T_CLK = 1; T_CLK = 0; ACC =ACC>> 1; } // OE=1; } /******************************************************************** * * 名稱: uchar uc_RTOutputByte * 說明: * 功能: 從DS1302讀取1Byte數(shù)據(jù) * 調(diào)用: * 輸入: * 返回值: ACC ***********************************************************************/ uchar uc_RTOutputByte(void) { uchar i; //OE=0; for(i=8; i>0; i--) { ACC = ACC>>1; //*相當(dāng)于匯編中的 RRC ACC7 = T_IO; T_CLK = 1; T_CLK = 0; } //OE=1; 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) { //OE=0; T_RST = 0; T_CLK = 0; T_RST = 1; v_WTInputByte(ucAddr); /* 地址,命令 */ v_WTInputByte(ucDa); /* 寫1Byte數(shù)據(jù)*/ T_CLK = 1; T_RST =0; //OE=1; } /******************************************************************** * * 名稱: 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; //OE=0; T_RST = 0; T_CLK = 0; T_RST = 1; v_WTInputByte(ucAddr); /* 地址,命令 */ ucDa = uc_RTOutputByte(); /* 讀1Byte數(shù)據(jù) */ T_CLK = 1; T_RST =0; // OE=1; return(ucDa); } /******************************************************************** * * 名稱: v_BurstW1302T * 說明: 先寫地址,后寫數(shù)據(jù)(時(shí)鐘多字節(jié)方式) * 功能: 往DS1302寫入時(shí)鐘數(shù)據(jù)(多字節(jié)方式) * 調(diào)用: v_RTInputByte() * 輸入: pSecDa: 時(shí)鐘數(shù)據(jù)地址 格式為: 秒 分 時(shí) 日 月 星期 年 控制 * 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_WTInputByte(0xbe); //* 0xbe:時(shí)鐘多字節(jié)寫命令 for (i=8;i>0;i--) //*8Byte = 7Byte 時(shí)鐘數(shù)據(jù) + 1Byte 控制 { v_WTInputByte(*pSecDa);//* 寫1Byte數(shù)據(jù) pSecDa++; } T_CLK = 1; T_RST =0; } */ /******************************************************************** * * 名稱: v_BurstR1302T * 說明: 先寫地址,后讀命令/數(shù)據(jù)(時(shí)鐘多字節(jié)方式) * 功能: 讀取DS1302時(shí)鐘數(shù)據(jù) * 調(diào)用: v_RTInputByte() , uc_RTOutputByte() * 輸入: pSecDa: 時(shí)鐘數(shù)據(jù)地址 格式為: 秒 分 時(shí) 日 月 星期 年 * 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_WTInputByte(0xbf); //* 0xbf:時(shí)鐘多字節(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_WTInputByte(0xfe); //* 0xbe:時(shí)鐘多字節(jié)寫命令 for (i=31;i>0;i--) //*31Byte 寄存器數(shù)據(jù) { v_WTInputByte(*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_WTInputByte(0xff); //* 0xbf:時(shí)鐘多字節(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è)置初始時(shí)間 * 調(diào)用: v_W1302() * 輸入: pSecDa: 初始時(shí)間地址。初始時(shí)間格式為: 秒 分 時(shí) 日 月 星期 年 * 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); //秒 分 時(shí) 日 月 星期 年 pSecDa++; ucAddr +=2; } v_W1302(0x8e,0x80); // 控制命令,WP=1,寫保護(hù)? } */ /******************************************************************** * * 名稱: v_Get1302 * 說明: * 功能: 讀取DS1302當(dāng)前時(shí)間 * 調(diào)用: uc_R1302() * 輸入: ucCurtime: 保存當(dāng)前時(shí)間地址。當(dāng)前時(shí)間格式為: 秒 分 時(shí) 日 月 星期 年 * 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);//*格式為: 秒 分 時(shí) 日 月 星期 年 ucAddr += 2; } } */ /*********************************************************************** * 名稱: Init1302 * 說明: * 功能: 初始化DS1302 * 調(diào)用: * 輸入: * 返回值: 無 *****************************************************************************/ void Init1302(void) { v_W1302(0x8e,0x00); //控制寫入WP=0 v_W1302(0x90,0xa5); v_W1302(0x80,0x00); //秒 v_W1302(0x82,0x59); //分 v_W1302(0x84,0x10); //時(shí) v_W1302(0x86,0x01); //日 v_W1302(0x88,0x08); //月 v_W1302(0x8a,0x03); //星期 v_W1302(0x8c,0x07); //年 */ v_W1302(0x8e,0x80); } /************************************************************************** * 名稱: donetime * 說明: * 功能: 時(shí)間處理 * 調(diào)用: * 輸入: * 返回值: 無 *****************************************************************************/ void donetime(void) { uchar d; d=uc_R1302(0x81); time[6]=d/16+48; time[7]=d%16+48; d=uc_R1302(0x83); time[3]=d/16+48; time[4]=d%16+48; d=uc_R1302(0x85); time[0]=d/16+48; time[1]=d%16+48; //bcd_int(d); }
// /*void bcd_int(uchar i) { uchar j; time[0]=(i&0x0f)+48; j=i>>4; time[1]=(j&0x0f)+48; } */ // /*void bcdtoInt(void) { uchar i; for(i=0;i<7;i++) bcd_int(ucCurtm[i]); } */ // void SetTime(void) { v_W1302(0x8e,0x00); v_W1302(0x80,0x80); v_W1302(0x82,min); v_W1302(0x84,hou); v_W1302(0x86,day); v_W1302(0x88,mon); v_W1302(0x8c,yea); v_W1302(0x80,0x00); v_W1302(0x8e,0x80); } |