摘要:它通過一個簡單的串行接口與微處理器通信。對于少于天的月份,月末日期會自動調(diào)整,包括閏年的更正。通過使用同步串行通信簡化了與微處理器的接口。否則寫入將被禁用。讀取操作后立即發(fā)送的附加脈沖,數(shù)據(jù)將再次可供讀取。
DS1302 涓流充電計時芯片包含一個實時時鐘/日歷和 31 字節(jié)的靜態(tài) RAM。它通過一個簡單的串行接口與微處理器通信。實時時鐘/日歷提供秒、分、小時、日、日、月和年信息。對于少于 31 天的月份,月末日期會自動調(diào)整,包括閏年的更正。時鐘以 24 小時或 12 小時格式運行,帶有 AM/PM 指示器。
通過使用同步串行通信簡化了 DS1302 與微處理器的接口。與時鐘/RAM 通信只需要三根線:CE( R S T /over RST RST?)、I/O(數(shù)據(jù)線)和 SCLK(串行時鐘)。數(shù)據(jù)可以一次 1 個字節(jié)或最多 31 個字節(jié)的突發(fā)傳輸?shù)綍r鐘/RAM 或從時鐘/RAM 傳輸。 DS1302 旨在以極低的功耗運行,并以低于 1μW 的功率保留數(shù)據(jù)和時鐘信息。 DS1302 是 DS1202 的后繼產(chǎn)品。除了 DS1202 的基本計時功能外,DS1302 還具有用于主電源和備用電源的雙電源引腳、用于 VCC1 的可編程涓流充電器和七個額外字節(jié)的暫存器存儲器的附加功能。
1)DS1302的命令組成
2)DS1302數(shù)據(jù)傳輸過程
在開始傳輸任何內(nèi)容之前,必須將 CE 引腳拉高,以便與芯片通話。 (選擇)
之后,發(fā)送命令字節(jié),通知 DS1302 將進行的操作。 (無論是讀還是寫,對時鐘還是 RAM。)
然后,如果執(zhí)行寫操作,則將要寫入的數(shù)據(jù)發(fā)送到 RAM 或時鐘中,或者如果執(zhí)行讀操作,則可以
從時鐘或 RAM 中讀取數(shù)據(jù)。
如果從 DS1302 讀取數(shù)據(jù),則在寫入命令字節(jié)的最后一位后的第一個下降沿上,數(shù)據(jù)將可用。相反,寫入 DS1302 發(fā)生在命令字節(jié)傳輸后的低電平到高電平轉(zhuǎn)換。要記住的四個注意事項,是所有發(fā)送和接收字節(jié)都是 LSB 優(yōu)先,在命令字節(jié)和數(shù)據(jù)字節(jié)之后的寫操作中發(fā)送到 DS1302 的附加 SCLK 脈沖將被忽略。
讀取操作后立即發(fā)送的附加 SCLK 脈沖,數(shù)據(jù)將再次可供讀取。最后,當(dāng)與 DS1302 通信時,微控制器的時鐘應(yīng)處于 2MHZ 的最大速度,如下面的數(shù)據(jù)表所示。如果使用不同的速度,那么必須校準頻率以滿足 DS1302 的需要,并將其重新校準為之前的頻率。
3)DS1302設(shè)置
DS1302的寄存器如下:
從左邊開始,前兩列是指命令字節(jié)。 是否要讀取或?qū)懭?RTC 或 RAM。從 (bit7 到 bit0) 的列是指它將在 RTC 或 RAM 中傳輸?shù)臄?shù)據(jù)字節(jié)。
1)發(fā)送數(shù)據(jù)
// 發(fā)送一位節(jié)數(shù)據(jù)void ds1302_send(unsigned char byte_t) { unsigned char mask = 0x01; IO_OUT(DS1302_DDR, DS1302_SIO); do { IO_CLR(DS1302_PORT, DS1302_SCK); if (byte_t & mask) IO_SET(DS1302_PORT, DS1302_SIO); else IO_CLR(DS1302_PORT, DS1302_SIO); IO_SET(DS1302_PORT, DS1302_SCK); mask = mask << 1; } while (mask); IO_CLR(DS1302_PORT, DS1302_SCK);}// 向指定寄存寫數(shù)據(jù)void ds1302_write(unsigned char ch, unsigned char byte_t) { ds1302_select(DS1302_CS); ds1302_send(ch | DS1302_CMD_WRITE); ds1302_send(byte_t); ds1302_deselect(DS1302_CS); }
2)讀數(shù)據(jù)
// 讀取一位數(shù)據(jù)unsigned char ds1302_get(void) { unsigned char mask = 0x01; unsigned char tmp = 0x00; IO_IN(DS1302_DDR, DS1302_SIO); do { IO_CLR(DS1302_PORT, DS1302_SCK); NOP(); NOP(); if (DS1302_PORT_IN & DS1302_SIO) tmp |= mask; else tmp |= 0x00; IO_SET(DS1302_PORT, DS1302_SCK); mask = mask << 1; } while (mask); IO_CLR(DS1302_PORT, DS1302_SCK); return tmp;}// 讀指定寄存器數(shù)據(jù)unsigned char ds1302_read(unsigned char ch) { unsigned char tmp; ds1302_select(DS1302_CS); ds1302_send(ch | DS1302_CMD_READ); tmp = ds1302_get(); ds1302_deselect(DS1302_CS); return tmp; }
3)年、月、日、時、分秒設(shè)置與讀取
// 秒設(shè)置與讀取#define ds1302_sec_write(n) ds1302_write(DS1302_SEC, (n)) #define ds1302_sec_read() ds1302_read(DS1302_SEC) // 分設(shè)置與讀取#define ds1302_min_write(n) ds1302_write(DS1302_MIN, (n)) #define ds1302_min_read() ds1302_read(DS1302_MIN) // 時設(shè)置與讀取#define ds1302_hour_write(n) ds1302_write(DS1302_HOUR, (n))#define ds1302_hour_read() ds1302_read(DS1302_HOUR) // 一個月的日設(shè)置與讀取#define ds1302_mdat_write(n) ds1302_write(DS1302_MDAT, (n)) #define ds1302_mdat_read() ds1302_read(DS1302_MDAT) // 月讀取與設(shè)置#define ds1302_mon_write(n) ds1302_write(DS1302_MON, (n)) #define ds1302_mon_read() ds1302_read(DS1302_MON) // 一周的日設(shè)置與讀取#define ds1302_wday_write(n) ds1302_write(DS1302_WDAY, (n))#define ds1302_wday_read() ds1302_read(DS1302_WDAY)// 年的設(shè)置與讀取#define ds1302_year_write(n) ds1302_write(DS1302_YEAR, (n))#define ds1302_year_read() ds1302_read(DS1302_YEAR)
4)主程序
//#include //we use keil c51 #include "gpio.h"#include "delay.h"#include "ds1302.h"#include "uart.h"#include "i2c_sw.h"#include unsigned int year,month,day,hours,minutes,seconds;void mcu_init(void) { uart_init(); ds1302_init(); // 初始讀取 year = ds1302_year_read(); month = ds1302_mon_read(); day = ds1302_mdat_read(); hours = ds1302_hour_read(); minutes = ds1302_min_read(); seconds = ds1302_sec_read();}int main(void) { mcu_init(); //reset the mcu uart_send_str("****DS1302****/r/n"); while (1) { year = ds1302_year_read(); month = ds1302_mon_read(); day = ds1302_mdat_read(); hours = ds1302_hour_read(); minutes = ds1302_min_read(); seconds = ds1302_sec_read(); printf("%d-%d-%d %d:%d:%d/r/n",BCD2DEC(year),BCD2DEC(month),BCD2DEC(day),BCD2DEC(hours),BCD2DEC(minutes),BCD2DEC(seconds)); delay_ms(1000); }}
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/122501.html
摘要:當(dāng)小于時,由供電讀數(shù)據(jù)工作時序單字節(jié)寫入上升沿置高電平,下降沿置低電平。當(dāng)總線控制器把數(shù)據(jù)線從高電平拉到低電平時,讀時序開始,數(shù)據(jù)線必須至少保持然后總線被釋放見圖。因此,總線控制器在讀時序開始后必須停止把腳驅(qū)動為低電平以讀取腳狀態(tài)。 目錄 一、前言 二、總體的設(shè)計思路 (一)使用器材 (二...
摘要:現(xiàn)在,單片機的名稱不再是特指公司推出的系列單片機,而是對兼容英特爾指令系統(tǒng)的單片機的統(tǒng)稱。單片機主要品牌及其產(chǎn)品英特爾,等艾特梅爾,,等飛利浦華邦達拉斯西門子等公司的許多產(chǎn)品宏晶系列系列系列等。 ...
摘要:設(shè)計簡介本設(shè)計是基于藍牙的超聲波無線測距的設(shè)計,主要實現(xiàn)以下功能實現(xiàn)通過測量當(dāng)前溫度值實現(xiàn)通過溫差補償法公式修改超聲波在當(dāng)前空氣中的傳播速度實現(xiàn)通過超聲波傳感器測量距離值。 設(shè)計簡介: 本設(shè)計是基于藍牙的超聲波無線測距的設(shè)計,主要實現(xiàn)以下功能: ① 實現(xiàn)通過DS18B20測量當(dāng)前溫度值 ② ...
摘要:可是在現(xiàn)實操作過程中總有一種方式出現(xiàn)問題,這就不得不提到現(xiàn)實情況下單片機的驅(qū)動能力對實驗結(jié)果的影響。但是在現(xiàn)實中由于單片機驅(qū)動能力的影響往往第一種是無法點亮燈的。 一、LED燈與單片機的連接方式 ? ? ? ? ?在proteus仿真中,無論LED燈是負極連接IO端口,正極通過電阻連接VCC...
摘要:設(shè)計簡介本設(shè)計是基于單片機的藍牙控制窗簾電路系統(tǒng),主要實現(xiàn)以下功能可通過顯示溫濕度光照強度窗簾狀態(tài)和模式可通過按鍵調(diào)整光照強度最小值可通過藍牙連接手機進行遠程控制可通過獲取溫濕度可通過光敏電阻獲取光照強度。 設(shè)計簡介: 本設(shè)計是基于單片機的藍牙控制窗簾電路系統(tǒng),主要實現(xiàn)以下功能: 可通過LC...
閱讀 663·2023-04-26 02:03
閱讀 1037·2021-11-23 09:51
閱讀 1111·2021-10-14 09:42
閱讀 1738·2021-09-13 10:23
閱讀 927·2021-08-27 13:12
閱讀 839·2019-08-30 11:21
閱讀 1001·2019-08-30 11:14
閱讀 1041·2019-08-30 11:09