DS1302的使用(by 51微控制器)

2021-08-16 22:54:21 字數 3766 閱讀 2313

最近在準備藍橋杯微控制器組的比賽,在學習這款微控制器時,裡面涉及到ds1302晶元的使用,所以今天就在這裡把學習使用ds1302的過程寫下來,以方便日後查閱。

ds1302是由dallas公司推出的涓流充電時鐘晶元,片內含有乙個實時時鐘和31位元組靜態ram.可通過簡單序列介面與微控制器進行通訊。

與微控制器相連的參考電路如上所示。很明顯與微控制器相連只需要三條線。

ce復位引腳:輸入訊號,在讀寫資料期間,必須為高,因此該引腳有兩個功能,一是ce開始控制字訪問移位暫存器的控制邏輯,二是提供結束單位元組或多位元組資料傳輸的方法。

i/o引腳:三線介面時的雙向資料線。

sclk:序列時鐘,輸入,控制資料的輸入與輸出。

既然接線都知道怎麼接了,那麼就直接開始程式的編寫吧。(有些微控制器板子在製作過程中就已經連在一起了)

其實不管什麼樣的晶元,使用它的過程都是差不多的,無非是先進行乙個初始化,初始化之後就可以進行自己想要的讀寫(與晶元通訊)。

初始化說起來好像和與晶元通訊是兩種不同的操作,其實本質上都是一樣的,都是對晶元的暫存器進行讀寫操作,當然初始化就單純是寫。既然要寫,就要知道ds1302控制字的格式,如下圖所示。

一共八位。

最高位bit7:必須為1,當為0時無法向ds1302寫入資料。

bit6:為0表示對時鐘資料進行操作,為1表示對ram資料進行操作。

bit0:為0進行寫操作,為1進行讀操作。

讀操作示意圖

寫操作示意圖

很明顯,資料操作之前ce要先置高。對於讀操作,開始的8個sclk週期,輸入乙個讀命令位元組,資料位元組在後8個sclk週期的下降沿輸出。需要注意的是,第乙個資料位元組的第乙個下降沿發生後,命令字的最後一位被寫入。

對於寫操作,開始的8個sclk週期,輸入乙個寫命令位元組,資料位元組在後8個sclk週期的上公升沿輸入。

下面貼出藍橋杯官方給出的讀寫操作函式。

unsigned char read_ds1302_byte(void) 

//大家別忘了,前面說過,第乙個資料位元組的第乙個下降沿發生後,

else                      //命令字的最後一位寫入,也就是說寫操作的最後一位和讀操作的第一位

sck_set;         //時鐘週期的電平置高置低,製造上公升,下降沿

sck_clr;

}return dat;

}void write_ds1302_byte(unsigned char dat) 

else 

sck_set;                //同樣是製造上公升下降沿,用於資料傳輸

ds1302內部一共有12個暫存器,其中七個暫存器與時鐘,日曆有關,沒錯,就是上表中的前七個,暫存器中的資料是二----十進位制的bcd碼。

下面說說這七個暫存器中比較特殊的兩個暫存器:秒暫存器和小時暫存器。

秒暫存器:bit7位,時間暫停位,當為1時,時鐘振盪器停止工作,ds1302進入低功耗模式,當為0時,ds1302正常工作。

小時暫存器:bit7用來選擇12小時還是24小時工作模式,很顯然為1是12小時工作模式,為0是24小時工作模式,bit5為am/pm位,為0是am模式,為1是pm模式。

上表中的倒數第二個為寫保護暫存器:wp是寫保護位,工作時,除wp外的其他位都置0,對時鐘暫存器或ram進行寫操作之前,wp必須置為0,當wp為1,不得對任何時鐘暫存器或者ram進行寫操作。

下面說一下對指定暫存器進行讀寫操作。依舊給出藍橋杯官網給出的**。

unsigned char ds1302_single_byte_read(unsigned char addr) 

{ unsigned char temp;

rst_clr;  //ce引腳置低

sck_clr;  //時鐘線拉低

rst_set;//ce引腳置高,開始資料傳輸

addr = addr | 0x01; //前面說過,要進行讀操作,控制字最後一位應置1

write_ds1302_byte(addr);    //寫入位址

temp=read_ds1302_byte();   //讀出資料

rst_clr;                            //ce引腳拉低

return temp;

void ds1302_single_byte_write(unsigned char addr, unsigned char dat)

{ rst_clr;

sck_clr;

rst_set;

addr = addr & 0xfe;        //同樣,控制字最後一位置0,確保是寫操作

write_ds1302_byte(addr);  //寫位址

write_ds1302_byte(dat);//寫資料

rst_clr;

好,最基本的函式講解介紹完了,這些也是藍橋杯大賽時給出的庫函式,下面我將介紹利用這些函式完成ds1302的初始化以及讀寫ds1302的操作。

初始化函式如下所示:

void init_ds1302(void)

{ds1302_single_byte_write(0x8e,0x00);

ds1302_single_byte_write(ds1302_sec_addr,0x00);

ds1302_single_byte_write(ds1302_min_addr,0x20);

ds1302_single_byte_write(ds1302_hr_addr,0x09);

ds1302_single_byte_write(ds1302_date_addr,0x25);

ds1302_single_byte_write(ds1302_month_addr,0x12);

ds1302_single_byte_write(ds1302_day_addr,0x06);

ds1302_single_byte_write(ds1302_year_addr,0x10);

ds1302_single_byte_write(ds1302_charger_addr,0x01);

ds1302_single_byte_write(0x8e,0x80);

當然還有對應的一些巨集定義:

#define ds1302_sec_addr0x80

#define ds1302_min_addr0x82

#define ds1302_hr_addr0x84

#define ds1302_date_addr0x86

#define ds1302_month_addr0x88

#define ds1302_day_addr0x8a

#define ds1302_year_addr0x8c

沒錯,初始化就是在相應位址寫上相應的初始化運算元據。

當初始化完成之後,就可以與ds1302進行通訊了,即配合使用上面的函式就可以讀出相應暫存器的內容。

51微控制器複習 DS1302

一 ds1302的主要效能指標 1 ds1302實時時鐘具有能計算2100年之前的秒 分 時 日 日期 星期 月 年的能力,還有閏年調整的能力。2 內部含有31個位元組靜態ram,可提供使用者訪問。3 採用序列資料傳送方式,使得管腳數量最少,簡單spi 3線介面。4 工作電壓範圍寬 2.0 5.5v...

51微控制器的DS1302的驅動程式

ds1302實時時鐘模組 對於時鐘晶元,我們只要知道它的寫入時序圖和讀出時序圖,以及時鐘晶元內部 所對應的位址就可以了,所謂寫是寫入eeprom裡面,即設定好乙個時鐘的初值,然後每次重新整理的時鐘的 新值都寫入eeprom裡儲存起來,再從 eeprom 裡讀出來,這樣就能保證當外部 電源掉電後,自帶...

ds1302的應用問題

define rtc ok1 操作成功 define rtc fail0 操作失敗 define second invalid40 秒值無效 define minute invalid41 分鐘值無效 define hour invalid42 小時值無效 define week invalid43...