實物圖
引腳定義
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
:片選輸入,低電平有效。
舉例
#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();
}