DS1302 RTC驅動仿真
1、DS1302介紹
DS1302 涓流充電計時芯片包含一個實時時鐘/日歷和 31 位元組的靜態 RAM,它通過一個簡單的串行介面與微處理器通信,實時時鐘/日歷提供秒、分、小時、日、日、月和年資訊,對于少于 31 天的月份,月末日期會自動調整,包括閏年的更正,時鐘以 24 小時或 12 小時格式運行,帶有 AM/PM 指示器,
通過使用同步串行通信簡化了 DS1302 與微處理器的介面,與時鐘/RAM 通信只需要三根線:CE( R S T \over RST RST?)、I/O(資料線)和 SCLK(串行時鐘),資料可以一次 1 個位元組或最多 31 個位元組的突發傳輸到時鐘/RAM 或從時鐘/RAM 傳輸, DS1302 旨在以極低的功耗運行,并以低于 1μW 的功率保留資料和時鐘資訊, DS1302 是 DS1202 的后繼產品,除了 DS1202 的基本計時功能外,DS1302 還具有用于主電源和備用電源的雙電源引腳、用于 VCC1 的可編程涓流充電器和七個額外位元組的暫存器存盤器的附加功能,

1)DS1302的命令組成

- Bit7 必須始終為邏輯 1,否則寫入 DS1302 將被禁用,
- Bit6 指定時鐘/日歷或 RAM 選擇, 如果它是 logic0 我們與時鐘交談,或者如果它是 logic1 我們與 RAM 交談,
- 位 5 至 1 指定要輸入或輸出的指定暫存器, (地址)
- Bit0 指定對 DS1302 的寫或讀操作, 如果是邏輯 0 則執行寫操作,如果是邏輯 1 則執行讀操作,
- 命令位元組總是從 LSB 開始(Bit0),
2)DS1302資料傳輸程序

-
在開始傳輸任何內容之前,必須將 CE 引腳拉高,以便與芯片通話, (選擇)
-
之后,發送命令位元組,通知 DS1302 將進行的操作, (無論是讀還是寫,對時鐘還是 RAM,)
-
然后,如果執行寫操作,則將要寫入的資料發送到 RAM 或時鐘中,或者如果執行讀操作,則可以
從時鐘或 RAM 中讀取資料,
如果從 DS1302 讀取資料,則在寫入命令位元組的最后一位后的第一個下降沿上,資料將可用,相反,寫入 DS1302 發生在命令位元組傳輸后的低電平到高電平轉換,要記住的四個注意事項,是所有發送和接收位元組都是 LSB 優先,在命令位元組和資料位元組之后的寫操作中發送到 DS1302 的附加 SCLK 脈沖將被忽略,
讀取操作后立即發送的附加 SCLK 脈沖,資料將再次可供讀取,最后,當與 DS1302 通信時,微控制器的時鐘應處于 2MHZ 的最大速度,如下面的資料表所示,如果使用不同的速度,那么必須校準頻率以滿足 DS1302 的需要,并將其重新校準為之前的頻率,

3)DS1302設定
DS1302的暫存器如下:

從左邊開始,前兩列是指命令位元組, 是否要讀取或寫入 RTC 或 RAM,從 (bit7 到 bit0) 的列是指它將在 RTC 或 RAM 中傳輸的資料位元組,
2、仿真電路原理圖

3、仿真代碼實作
1)發送資料
// 發送一位節資料
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);
}
// 向指定寄存寫資料
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)讀資料
// 讀取一位資料
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;
}
// 讀指定暫存器資料
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)年、月、日、時、分秒設定與讀取
// 秒設定與讀取
#define ds1302_sec_write(n) ds1302_write(DS1302_SEC, (n))
#define ds1302_sec_read() ds1302_read(DS1302_SEC)
// 分設定與讀取
#define ds1302_min_write(n) ds1302_write(DS1302_MIN, (n))
#define ds1302_min_read() ds1302_read(DS1302_MIN)
// 時設定與讀取
#define ds1302_hour_write(n) ds1302_write(DS1302_HOUR, (n))
#define ds1302_hour_read() ds1302_read(DS1302_HOUR)
// 一個月的日設定與讀取
#define ds1302_mdat_write(n) ds1302_write(DS1302_MDAT, (n))
#define ds1302_mdat_read() ds1302_read(DS1302_MDAT)
// 月讀取與設定
#define ds1302_mon_write(n) ds1302_write(DS1302_MON, (n))
#define ds1302_mon_read() ds1302_read(DS1302_MON)
// 一周的日設定與讀取
#define ds1302_wday_write(n) ds1302_write(DS1302_WDAY, (n))
#define ds1302_wday_read() ds1302_read(DS1302_WDAY)
// 年的設定與讀取
#define ds1302_year_write(n) ds1302_write(DS1302_YEAR, (n))
#define ds1302_year_read() ds1302_read(DS1302_YEAR)
4)主程式
//#include <regx52.h> //we use keil c51
#include "gpio.h"
#include "delay.h"
#include "ds1302.h"
#include "uart.h"
#include "i2c_sw.h"
#include <stdio.h>
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);
}
}
4、仿真結果

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/312200.html
標籤:其他
上一篇:chapter1:計算機網路概述
