DS12C887實時時鐘

實物圖
2
引腳定義
1
GND、 VCC:直流電源,其中VCC接+5V輸入,GND接地,當VCC輸入爲+5V時,用戶可以訪問DS12C887內RAM中的數據,並可對其進行讀、寫操作;當VCC的輸入小於+4.25V時,禁止用戶對內部RAM進行讀、寫操作,此時用戶不能正確獲取芯片內的時間信息;當VCC的輸入小於+3V時, DS12C887會自動將電源發換到內部自帶的鋰電池上。
MOT:模式選擇腳,DA12C887有兩種工作模式,即Motorola模式和Intel模式,當MOT接VCC時,選用的工作模式是Motorola模式,當MOT接GND時,選用的是Intel模式。本文主要討論Intel模式。
SQW:方波輸出腳,當供電電壓VCC大於4.25V時,SQW腳可進行方波輸出,此時用戶可以通過對控制寄存器編程來得到13種方波信號的輸出。
AD0~AD7:複用地址數據總線,該總線採用時分複用技術,在總線週期的前半部分,出現在AD0-AD7上的是地址信息,可用以選通DS12C887內的RAM,總線週期的後半部分出現在AD0-AD7上的數據信息。
AS:地址選通輸入腳,在進行讀寫操作時,AS的上升沿將AD0-AD7上出現的地址信息鎖存到DS12C887上,而下一個下降沿清除AD0-AD7上的地址信息,不論是否有效,DS12C887都將執行該操作。
DS/RD:數據選擇或讀輸入腳,該引腳有兩種工作模式,當MOT接VCC時,選用Motorola工作模式,在這種工作模式中,每個總線週期的後一部分的DS爲高電平,被稱爲數據選通。在讀操作中,DS的上升沿使DS12C887將內部數據送往總線AD0-AD7上,以供外部讀取。在寫操作中,DS的下降沿將使總線 AD0-AD7上的數據鎖存在DS12C887中。
R/W:讀/寫輸入端,該管腳也有2種工作模式,當MOT接VCC時,R/W工作在Motorola模式。此時,該引腳的作用是區分進行的是讀操作還是寫操作,當R/W爲高電平時爲讀操作,R/W爲低電平時爲寫操作;當MOT接GND時,該腳工作在Intle模式,此時該作爲寫允許輸入。
CS:片選輸入,低電平有效。
3
舉例

#define uchar unsigned char
#define uint unsigned int

sbit dsds = P4 ^ 4;
sbit dsrw = P4 ^ 2;
sbit dsas = P4 ^ 5;
sbit dscs = P2 ^ 0;

//寫12C887函數
void write_ds(uchar addr, uchar date)
{
   dscs = 0;
   dsas = 1;
   dsds = 1;
   dsrw = 1;
   P0 = addr; //先寫地址
   dsas = 0;
   dsrw = 0;
   P0 = addr; //再寫數據
   dsrw = 1;
   dsas = 1;
   dscs = 1;
}

//讀12C887函數
uchar read_ds(uchar addr)
{
   uchar ds_date;

   dsas = 1;
   dsds = 1;
   dsrw = 1;
   dscs = 0;
   P0 = addr; //先寫地址
   dsas = 0;
   dsds = 0;
   P0 = 0xff;
   ds_date = P0; //再讀數據
   dsds = 1;
   dsas = 1;
   dscs = 1;

   return ds_date;
}

//讀取12C887數據
void read_time(void)
{
   char hour, minute, second, year, month, date, day;

   year = read_ds(9);
   month = read_ds(8);
   date = read_ds(7);
   day = read_ds(6);
   hour = read_ds(4);
   minute = read_ds(2);
   second = read_ds(0);
}

/*
	首次操作12C887時,寄存器初始化
	配置12C887當前時間(20190716-10:54:07)
	配置12C887鬧鐘
*/
void set_time(void)
{
   write_ds(0, 7);
   write_ds(1, 0);
   write_ds(2, 54);
   write_ds(3, 0);
   write_ds(4, 10);
   write_ds(5, 0);
   write_ds(6, 3);
   write_ds(7, 16);
   write_ds(8, 7);
   write_ds(9, 19);
}

/*首次上電設置DS12C887時使用,以後不必再調用*/
void init(void)
{
   write_ds(0x0A, 0x20); //打開振盪器
   write_ds(0x0B, 0x26); //設置24小時模式,數據二進制格式
   set_time();
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章