?? ds1302.c
字號:
#pragma small
#include <reg52.h>
#define uchar unsigned char
/************************************引腳連接圖*****************************************/
sbit ds1302_clk=P1^0;
sbit ds1302_dat=P1^1;
sbit ds1302_rst=P1^2;
sbit ACC_0 = ACC^0;
sbit ACC_1 = ACC^1;
sbit ACC_2 = ACC^2;
sbit ACC_3 = ACC^3;
sbit ACC_4 = ACC^4;
sbit ACC_5 = ACC^5;
sbit ACC_6 = ACC^6;
sbit ACC_7 = ACC^7;
/*************************************函數說明******************************************/
void Read(void); //寫DS1302操作
void Write(void); //讀DS1302操作
uchar ReadRam_Byte(uchar address); //從Ram中讀出一個字節
uchar ReadRTC_Byte(uchar address); //從DS1302中讀出一個字節
uchar WriteRam_Byte(uchar address,uchar number); //向Ram中寫入一個字節
uchar WriteRTC_Byte(uchar address,uchar number); //向DS1302中寫入一個字節
void ReadRam(uchar data * buffer,uchar size); //從Ram中讀出多個字節
void ReadRTC(uchar data * buffer,uchar size); //從DS1302中讀出多個字節
void WriteRam(uchar data * buffer,uchar size); //向Ram中寫入多個字節
void WriteRTC(uchar data * buffer,uchar size); //向DS1302中寫入多個字節
uchar ReadSec(void); //從DS1302中讀出秒字節
uchar ReadMin(void); //從DS1302中讀出分字節
uchar ReadHr(void); //從DS1302中讀出時字節
uchar ReadDay(void); //從DS1302中讀出日字節
uchar ReadMonth(void); //從DS1302中讀出月字節
uchar ReadWeek(void); //從DS1302中讀出星期字節
uchar ReadYear(void); //從DS1302中讀出年字節
void WriteSec(uchar number); //向DS1302中寫入秒字節
void WriteMin(uchar number); //向DS1302中寫入分字節
void WriteHr(uchar number); //向DS1302中寫入時字節
void WriteDay(uchar number); //向DS1302中寫入日字節
void WriteMonth(uchar number); //向DS1302中寫入月字節
void WriteWeek(uchar number); //向DS1302中寫入星期字節
void WriteYear(uchar number); //向DS1302中寫入年字節
void WriteControl(uchar number); //向慢速充電控制寄存器寫入控制字節
void EnableWP(void); //禁止寫保護
void DisableWP(void); //允許寫保護
void Write(void) //寫DS1302操作
{
ds1302_dat = ACC_0; //寫DS1302
ds1302_clk = 1; //時鐘上升沿,發送數據有效
ds1302_clk = 0; //清零時鐘總線
ds1302_dat = ACC_1;
ds1302_clk = 1; ds1302_clk = 0;
ds1302_dat = ACC_2;
ds1302_clk = 1; ds1302_clk = 0;
ds1302_dat = ACC_3;
ds1302_clk = 1; ds1302_clk = 0;
ds1302_dat = ACC_4;
ds1302_clk = 1; ds1302_clk = 0;
ds1302_dat = ACC_5;
ds1302_clk = 1; ds1302_clk = 0;
ds1302_dat = ACC_6;
ds1302_clk = 1; ds1302_clk = 0;
ds1302_dat = ACC_7;
ds1302_clk = 1; ds1302_clk = 0;
}
void Read(void) //讀DS1302操作
{
ACC_0 = ds1302_dat; //讀取DS1302數據
ds1302_clk = 1; //時鐘上升沿,發送數據有效
ds1302_clk = 0; //清零時鐘總線
ACC_1 = ds1302_dat;
ds1302_clk = 1; ds1302_clk = 0;
ACC_2 = ds1302_dat;
ds1302_clk = 1; ds1302_clk = 0;
ACC_3 = ds1302_dat;
ds1302_clk = 1; ds1302_clk = 0;
ACC_4 = ds1302_dat;
ds1302_clk = 1;ds1302_clk = 0;
ACC_5 = ds1302_dat;
ds1302_clk = 1; ds1302_clk = 0;
ACC_6 = ds1302_dat;
ds1302_clk = 1; ds1302_clk = 0;
ACC_7 = ds1302_dat;
ds1302_rst = 0; ds1302_clk = 1;
}
uchar ReadRam_Byte(uchar address) //從RAM中讀出一個字節
{
ds1302_rst = 0; //復位引腳為低電平,所有數據傳送中止
ds1302_clk = 0; //清零時鐘總線
ds1302_rst = 1; //復位引腳為高電平,邏輯控制有效
ACC = address;
Write(); //寫DS1302操作
ds1302_dat = 1;
Read(); //讀DS1302操作
return ACC;
}
uchar ReadRTC_Byte(uchar address) //從DS1302中讀出一個字節
{
ds1302_rst = 0; //復位引腳為低電平,所有數據傳送中止
ds1302_clk = 0; //清零時鐘總線
ds1302_rst = 1; //復位引腳為高電平,邏輯控制有效
ACC = address;
Write(); //對DS1302寫命令字和地址
ds1302_dat = 1;
Read(); //讀DS1302操作
return ACC; //返回讀取的數據
}
uchar WriteRam_Byte(uchar address,uchar number) //向RAM中寫入一個字節
{
ds1302_clk = 0; ds1302_rst = 0;ds1302_rst = 1;
ACC = address;
Write(); //對DS1302寫命令字和地址
ACC = number;
Write(); //對DS1302寫命令字和數據
ds1302_rst = 0;
ds1302_clk = 1;
return ACC;
}
uchar WriteRTC_Byte(uchar address,uchar number) //向DS1302中寫入一個字節
{
ds1302_clk = 0;
ds1302_rst = 0;ds1302_rst = 1;
ACC = address;
ACC |= 0x80;
Write(); //對DS1302寫命令字和地址
ACC = number;
Write(); //對DS1302寫命令字和數據
ds1302_rst = 0; ds1302_clk = 1;
return ACC;
}
void ReadRam(uchar data * buffer,uchar size) //從RAM中讀出多個字節
{
register uchar a,b;
ds1302_clk = 0;
ds1302_rst = 0;
ds1302_rst = 1;
ACC = 0xff; //命令字為FFH
Write(); //對DS1302寫命令字和地址
ds1302_dat = 1;
for(a=0;a<size;a++)
{
ACC_0 = ds1302_dat;
ds1302_clk = 1; ds1302_clk = 0; ACC_1 = ds1302_dat;
ds1302_clk = 1; ds1302_clk = 0; ACC_2 = ds1302_dat;
ds1302_clk = 1; ds1302_clk = 0; ACC_3 = ds1302_dat;
ds1302_clk = 1; ds1302_clk = 0; ACC_4 = ds1302_dat;
ds1302_clk = 1; ds1302_clk = 0; ACC_5 = ds1302_dat;
ds1302_clk = 1; ds1302_clk = 0; ACC_6 = ds1302_dat;
ds1302_clk = 1; ds1302_clk = 0; ACC_7 = ds1302_dat;
b = ACC;
*(buffer+a)=b;
ds1302_clk = 1; ds1302_clk = 0;
}
ds1302_rst = 0; ds1302_clk = 1;
}
void ReadRTC(uchar data * buffer,uchar size) //從DS1302中讀出多個字節
{
register uchar a,b;
ds1302_clk = 0;
ds1302_rst = 0;
ds1302_rst = 1;
ACC = 0xbf; //命令字為BFH
Write(); //對DS1302寫命令字和地址
ds1302_dat = 1;
for(a=0;a<size;a++) //讀出DS1302數據
{
ACC_0 = ds1302_dat;
ds1302_clk = 1; ds1302_clk = 0; ACC_1 = ds1302_dat;
ds1302_clk = 1; ds1302_clk = 0; ACC_2 = ds1302_dat;
ds1302_clk = 1; ds1302_clk = 0; ACC_3 = ds1302_dat;
ds1302_clk = 1; ds1302_clk = 0; ACC_4 = ds1302_dat;
ds1302_clk = 1; ds1302_clk = 0; ACC_5 = ds1302_dat;
ds1302_clk = 1; ds1302_clk = 0; ACC_6 = ds1302_dat;
ds1302_clk = 1; ds1302_clk = 0; ACC_7 = ds1302_dat;
b = ACC;
*(buffer+a)=b;
ds1302_clk = 1; ds1302_clk = 0;
}
ds1302_rst = 0;
ds1302_clk = 1;
}
void WriteRam(uchar data * buffer,uchar size) //向RAM中寫入多個字節
{
register uchar a;
ds1302_clk = 0;
ds1302_rst = 0;
ds1302_rst = 1;
ACC = 0xfe; //命令字為FE
Write(); //對DS1302寫命令字和地址
for(a=0;a<size;a++)
{
ACC = *(buffer+a);
Write(); //對DS1302寫數據
}
ds1302_rst = 0;
ds1302_clk = 1;
}
void WriteRTC(uchar data * buffer,uchar size) //向DS1302中寫入多個字節
{//注意:連續寫DS1302只能是8個字節一起寫
register uchar a;
ds1302_clk = 0;
ds1302_rst = 0;
ds1302_rst = 1;
ACC = 0xbe; //命令字為BEH
Write(); //對DS1302寫命令字和地址
for(a=0;a<size;a++)
{
ACC = *(buffer+a);
Write(); //對DS1302寫數據
}
ds1302_rst = 0;
ds1302_clk = 1;
}
uchar ReadSec(void) //從DS1302中讀出秒字節
{
return ReadRTC_Byte(0x81);
}
uchar ReadMin(void) //從DS1302中讀出分字節
{
return ReadRTC_Byte(0x83);
}
uchar ReadHr(void) //從DS1302中讀出時字節
{
return ReadRTC_Byte(0x85);
}
uchar ReadDay(void) //從DS1302中讀出日字節
{
return ReadRTC_Byte(0x87);
}
uchar ReadMonth(void) //從DS1302中讀出月字節
{
return ReadRTC_Byte(0x89);
}
uchar ReadWeek(void) //從DS1302中讀出星期字節
{
return ReadRTC_Byte(0x8B);
}
uchar ReadYear(void) //從DS1302中讀出年字節
{
return ReadRTC_Byte(0x8D);
}
void WriteSec(uchar number) //向DS1302中寫入秒字節
{
WriteRTC_Byte(0x80,number);
}
void WriteMin(uchar number) //向DS1302中寫入分字節
{
WriteRTC_Byte(0x82,number);
}
void WriteHr(uchar number) //向DS1302中寫入時字節
{
WriteRTC_Byte(0x84,number);
}
void WriteDay(uchar number) //向DS1302中寫入日字節
{
WriteRTC_Byte(0x86,number);
}
void WriteMonth(uchar number) //向DS1302中寫入月字節
{
WriteRTC_Byte(0x88,number);
}
void WriteWeek(uchar number) //向DS1302中寫入星期字節
{
WriteRTC_Byte(0x8A,number);
}
void WriteYear(uchar number) //向DS1302中寫入年字節
{
WriteRTC_Byte(0x8C,number);
}
void WriteControl(uchar number) //向慢速充電控制寄存器寫入控制字節
{
WriteRTC_Byte(0x90,number);
}
void DisableWP(void) //禁止寫保護
{
WriteRTC_Byte(0x8E,0);
}
void EnableWP(void) //允許寫保護
{
WriteRTC_Byte(0x8E,0x80);
}
void main(void) //主程序
{
uchar sec,min,hr,day,month,week,year;
uchar data buffer1[32] =
{32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63};
uchar data buffer2[8] = {45,45,15,13,3,2,01,0};
ReadRTC(buffer2,8);
DisableWP(); //禁止寫保護
WriteControl(0xaa); //向慢速充電控制寄存器寫入控制字節
WriteRam(buffer1,31); //寫DS1302RAM
WriteRTC(buffer2,8); //寫DS1302時鐘
EnableWP(); //允許寫保護
ReadRam(buffer1,31); //讀DS1302RAM
ReadRTC(buffer2,8); //讀DS1302時鐘
sec = ReadSec(); //讀秒
min = ReadMin(); //讀分
hr = ReadHr(); //讀小時
day = ReadDay(); //讀日
month = ReadMonth(); //讀月
week = ReadWeek(); //讀星期
year = ReadYear(); //讀年
ACC = 0;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -