不錯,51黑有你更精彩!。。。
下面是樓主的源碼:
- #include <STC12C5A60S2.h>
- //#include <STC12C5410AD.h>
- //#include <STC90C58RD.h>
- //#include <REG52.H>
- //extern void delay1(unsigned int time);
- #define uchar unsigned char
- #define uint unsigned int
- //this is for 1632
- sbit T_CLK = P3^5; /*實時時鐘時鐘線引腳7 */
- sbit T_IO = P3^6; /*實時時鐘數據線引腳6 */
- sbit T_RST = P3^7; /*實時時鐘復位線引腳5 */
- sbit ACC0=ACC^0;
- sbit ACC1=ACC^1;
- sbit ACC2=ACC^2;
- sbit ACC3=ACC^3;
- sbit ACC4=ACC^4;
- sbit ACC5=ACC^5;
- sbit ACC6=ACC^6;
- sbit ACC7=ACC^7;
- /*******************************************************************
- *
- * 名稱: v_RTInputByte
- * 說明:
- * 功能: 往DS1302寫入1Byte數據
- * 調用:
- * 輸入: ucDa 寫入的數據
- * 返回值: 無
- ***********************************************************************/
- void v_RTInputByte(uchar ucDa)
- {
- uchar i;
- ACC = ucDa;
- for(i=8; i>0; i--)
- {
- T_IO = ACC0; /*相當于匯編中的 RRC */
- // delay(20);
- T_CLK = 1;
- // delay(20);
- T_CLK = 0;
- // delay(20);
- ACC = ACC >> 1;
- }
- }
- /********************************************************************
- *
- * 名稱: uchar uc_RTOutputByte
- * 說明:
- * 功能: 從DS1302讀取1Byte數據
- * 調用:
- * 輸入:
- * 返回值: ACC
- ***********************************************************************/
- uchar uc_RTOutputByte(void)
- {
- uchar i;
- for(i=8; i>0; i--)
- {
- ACC = ACC >>1; /*相當于匯編中的 RRC */
- ACC7 = T_IO;
- // delay(20);
- T_CLK = 1;
- // delay(20);
- T_CLK = 0;
- // delay(20);
- }
- return(ACC);
- }
- /********************************************************************
- *
- * 名稱: v_W1302
- * 說明: 先寫地址,后寫命令/數據
- * 功能: 往DS1302寫入數據
- * 調用: v_RTInputByte()
- * 輸入: ucAddr: DS1302地址, ucDa: 要寫的數據
- * 返回值: 無
- ***********************************************************************/
- void v_W1302(uchar ucAddr, uchar ucDa)
- {
- T_RST = 0;
- // delay(20);
- T_CLK = 0;
- // delay(20);
- T_RST = 1;
- // delay(20);
- v_RTInputByte(ucAddr); /* 地址,命令 */
- v_RTInputByte(ucDa); /* 寫1Byte數據*/
- T_CLK = 1;
- // delay(20);
- T_RST =0;
- // delay(20);
- }
- /********************************************************************
- *
- * 名稱: uc_R1302
- * 說明: 先寫地址,后讀命令/數據
- * 功能: 讀取DS1302某地址的數據
- * 調用: v_RTInputByte() , uc_RTOutputByte()
- * 輸入: ucAddr: DS1302地址
- * 返回值: ucDa :讀取的數據
- ***********************************************************************/
- uchar uc_R1302(uchar ucAddr)
- {
- uchar ucDa;
- T_RST = 0;
- // delay(20);
- T_CLK = 0;
- // delay(20);
- T_RST = 1;
- // delay(20);
- v_RTInputByte(ucAddr); /* 地址,命令 */
- ucDa = uc_RTOutputByte(); /* 讀1Byte數據 */
- T_CLK = 1;
- // delay(20);
- T_RST =0;
- // delay(20);
- return(ucDa);
- }
- /********************************************************************
- *
- * 名稱: v_BurstW1302T
- * 說明: 先寫地址,后寫數據(時鐘多字節方式)
- * 功能: 往DS1302寫入時鐘數據(多字節方式)
- * 調用: v_RTInputByte()
- * 輸入: pSecDa: 時鐘數據地址 格式為: 秒 分 時 日 月 星期 年 控制
- * 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:時鐘多字節寫命令
- for (i=8;i>0;i--) //8Byte = 7Byte 時鐘數據 + 1Byte 控制
- {
- v_RTInputByte(*pSecDa);// 寫1Byte數據
- pSecDa++;
- }
- T_CLK = 1;
- T_RST =0;
- } */
- /********************************************************************
- *
- * 名稱: v_BurstR1302T
- * 說明: 先寫地址,后讀命令/數據(時鐘多字節方式)
- * 功能: 讀取DS1302時鐘數據
- * 調用: v_RTInputByte() , uc_RTOutputByte()
- * 輸入: pSecDa: 時鐘數據地址 格式為: 秒 分 時 日 月 星期 年
- * 7Byte (BCD碼) 1B 1B 1B 1B 1B 1B 1B
- * 返回值: ucDa :讀取的數據
- ***********************************************************************/
- /*void v_BurstR1302T(uchar *pSecDa)
- {
- uchar i;
- T_RST = 0;
- T_CLK = 0;
- T_RST = 1;
- v_RTInputByte(0xbf); // 0xbf:時鐘多字節讀命令
- for (i=8; i>0; i--)
- {
- *pSecDa = uc_RTOutputByte(); // 讀1Byte數據
- pSecDa++;
- }
- T_CLK = 1;
- T_RST =0;
- } */
- /********************************************************************
- *
- * 名稱: v_BurstW1302R
- * 說明: 先寫地址,后寫數據(寄存器多字節方式)
- * 功能: 往DS1302寄存器數寫入數據(多字節方式)
- * 調用: v_RTInputByte()
- * 輸入: pReDa: 寄存器數據地址
- * 返回值: 無
- ***********************************************************************/
- /*id 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:時鐘多字節寫命令
- for (i=31;i>0;i--) //31Byte 寄存器數據
- {
- v_RTInputByte(*pReDa); // 寫1Byte數據
- pReDa++;
- }
- T_CLK = 1;
- T_RST =0;
- } */
- /********************************************************************
- *
- * 名稱: uc_BurstR1302R
- * 說明: 先寫地址,后讀命令/數據(寄存器多字節方式)
- * 功能: 讀取DS1302寄存器數據
- * 調用: v_RTInputByte() , uc_RTOutputByte()
- * 輸入: pReDa: 寄存器數據地址
- * 返回值: 無
- ***********************************************************************/
- /*void v_BurstR1302R(uchar *pReDa)
- {
- uchar i;
- T_RST = 0;
- T_CLK = 0;
- T_RST = 1;
- v_RTInputByte(0xff); // 0xbf:時鐘多字節讀命令
- for (i=31; i>0; i--) //31Byte 寄存器數據
- {
- *pReDa = uc_RTOutputByte(); //讀1Byte數據
- pReDa++;
- }
- T_CLK = 1;
- T_RST =0;
- } */
- void Set_Charge(void)
- {
- v_W1302(0x8e,0x00); /* 控制命令,WP=0,寫操作?*/
- v_W1302(0x90,0xaa); /* 控制命令,WP=0,寫操作?*/
- v_W1302(0x8e,0x80); /* 控制命令,WP=1,寫保護?*/
- v_W1302(0x90,0xa5);
- }
- /********************************************************************
- *
- * 名稱: v_Set1302
- * 說明:
- * 功能: 設置初始時間
- * 調用: v_W1302()
- * 輸入: pSecDa: 初始時間地址。初始時間格式為: 秒 分 時 日 月 星期 年
- * 7Byte (BCD碼) 1B 1B 1B 1B 1B 1B 1B
- * 返回值: 無
- ***********************************************************************/
- void Set_Time(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當前時間
- * 調用: uc_R1302()
- * 輸入: ucCurtime: 保存當前時間地址。當前時間格式為: 秒 分 時 日 月 星期 年
- * 7Byte (BCD碼) 1B 1B 1B 1B 1B 1B 1B
- * 返回值: 無
- ***********************************************************************/
- void Read_Time(uchar ucCurtime[])
- {
- uchar i;
- uchar ucAddr = 0x81;
- for (i=0;i<7;i++)
- {
- ucCurtime[i] = uc_R1302(ucAddr);/*格式為: 秒 分 時 日 月 星期 年 */
- ucAddr += 2;
- }
- }
- void Write_RAM(unsigned char *s,unsigned char startbyte,unsigned char length)
- {
- uchar i;
- uchar ucAddr;
-
- ucAddr=0xc0+startbyte*2;
- v_W1302(0x8e,0x00); /* 控制命令,WP=0,寫操作?*/
- for(i =0;i<length;i++)
- {
- v_W1302(ucAddr,*s);
-
- s++;
- ucAddr +=2;
- }
- v_W1302(0x8e,0x80); /* 控制命令,WP=1,寫保護?*/
- }
- void Read_RAM(unsigned char *s,unsigned char startbyte,unsigned char length)
- {
- uchar i;
- uchar ucAddr;
-
- ucAddr=0xc1+startbyte*2;
- for (i=0;i<length;i++)
- {
- s[i] = uc_R1302(ucAddr);
- ucAddr += 2;
- }
- }
復制代碼 |