Arduino控制DS1302時鐘晶片(ds1302引腳圖及功能和應用電路)

2021-01-05 電子發燒友

  DS1302的引腳排列,其中Vcc2為主電源,VCC1為後備電源。在主電源關閉的情況下,也能保持時鐘的連續運行。DS1302由Vcc1或Vcc2兩者中的較大者供電。當Vcc2大於Vcc1+0.2V時,Vcc2給DS1302供電。當Vcc2小於Vcc1時,DS1302由Vcc1供電。

  X1和X2是振蕩源,外接32.768kHz晶振。RST是復位/片選線,通過把RST輸入驅動置高電平來啟動所有的數據傳送。RST輸入有兩種功能:首先,RST接通控制邏輯,允許地址/命令序列送入移位寄存器;其次,RST提供終止單字節或多字節數據傳送的方法。

  當RST為高電平時,所有的數據傳送被初始化,允許對DS1302進行操作。如果在傳送過程中RST置為低電平,則會終止此次數據傳送,I/O引腳變為高阻態。上電運行時,在Vcc》2.0V之前,RST必須保持低電平。只有在SCLK為低電平時,才能將RST置為高電平。

  DS1302應用電路   應用電路一:

  DS1302的電路一個重點就是時鐘電路,它所使用的晶振是一個32.768k的晶振,晶振外部也不需要額外添加其他的電容或者電阻電路了。時鐘的精度,首先取決於晶振的精度以及晶振的引腳負載電容。如果晶振不準或者負載電容過大過小,都會導致時鐘誤差過大。在這一切都搞定後,最終一個考慮因素是晶振的溫漂。隨著溫度的變化,晶振往往精度會發生變化,因此,在實際的系統中,其中一種方法就是經常校對。比如我們所用的電腦的時鐘,通常我們會設置一個選項「將計算機設置於internet時間同步」。選中這個選項後,一般可以過一段時間,我們的計算機就會和internet時間校準同步一次。

  應用電路二:

  1腳VCC2是主電源正極的引腳,2腳X1和3腳X2是晶振輸入和輸出引腳,4腳GND是負極,5腳CE是使能引腳,接單片機的IO口,6腳I/O是數據傳輸引腳,接單片機的IO口,7腳SCLK是通信時鐘引腳,接單片機的IO口,8腳VCC1是備用電源引腳。考慮到KST-51開發板是一套以學習為目的的板子,加上備用電池對航空運輸和攜帶不方便,所以8腳沒有接備用電池,而是接了一個10uF的電容,這個電容就相當於一個電量很小的電池,經過試驗測量得出其可以在系統掉電後仍維持DS1302運行1分鐘左右,如果大家想運行時間再長,可以加大電容的容量或者換成備用電池,如果掉電後不需要它再維持運行,也可以乾脆懸空,如圖15-7和圖15-8所示。

  涓流充電功能,基本也用不到,因為實際應用中很少會選擇可充電電池作為備用電源,成本太高,本課程也不講了,大家作為選學即可。我們使用的時候直接用5V電源接一個二極體,在主電源上電的情況下給電容充電,在主電源掉電的情況下,二極體可以防止電容向主電路放電,而僅用來維持DS1302的供電,這種電路的最大用處是在電池供電系統中更換主電池的時候保持實時時鐘的運行不中斷,1分鐘的時間對於更換電池足夠了。此外,通過我們的使用經驗,在DS1302的主電源引腳串聯一個1K電阻可以有效的防止電源對DS1302的衝擊,R6就是這個電阻,而R9、R26、R32都是上拉電阻。

  DS1302寫入時序

  通過命令的方式寫入年月日時分秒信息。 命令格式為2位元組。 第一字節為地址,第二字節為內容。

  寫入邏輯:

  1 將RST先拉低

  2 將SCLK拉低(如果不拉低,且本來是高電平,則瞬間就發出了一個bit,我們還沒放數據呢)

  3 再RST拉高。。 形成一個上升沿

  4 在IO口放入一個bit(字節發送順序,從低位到高位)

  5 設SCLK為高電平,形成上升沿,這時候DS1302就會讀取IO口的數據存入它的寄存器。

  6 拉低SCLK,為下一個字節做準備。,跳轉到5 ,直到發送完所有的16個字節

  7 拉低RST,整個寫入過程完成。

  DS1302命令格式

  雖然命令字節看起來很複雜,但編寫程序很簡單,比如你要設置秒為13秒。那麼發送的兩個字節的數據應該是什麼?第一個字節是0x80(寫入秒的命令,見上圖)。第二個數據,第四位為3,高四位為1。就是(1<<4)|3,為0x13

  其他的年月日類似。比較特殊的幾個位說一下。

  (1)如果想讓錶停下來

  發送一個設置秒的命令,第二個字節最高位置為1,即,發送0x800x80即可。

  (2)小時的第二個字節的最高位控制著12還是24進位

  Arduino控制DS1302連線   Arduino控制DS1302程序

  /* * 讀寫DS1302 時鐘晶片

  * @author Yangtf

  * 很棒的文檔 http://www.21ic.com/jichuzhishi/datasheet/DS1302/data/185858.html

  * 時序圖 http://www.21ic.com/d/file/201307/0a93263a0126e1580cc71c89dce1fda9.jpg

  *

  */

  #define RST 7

  #define SCLK 6

  #define IO 5

  //#define L(item) digitalWrite((item),LOW)

  //#define H(item) digitalWrite((item),HIGH)

  #define uchar unsigned char

  void setup() {

  pinMode(RST,OUTPUT);

  pinMode(SCLK,OUTPUT);

  pinMode(IO,OUTPUT);

  Serial.begin(9600);

  attachInterrupt(0, settm, FALLING );

  }

  void writeData(unsigned char addr,unsigned char dat)

  {

  pinMode(IO,OUTPUT);

  digitalWrite(RST,LOW); //下拉低,再拉高

  digitalWrite(SCLK,LOW) ; //SCLK的上升沿, 晶片會讀取IO埠 d

  elayMicroseconds(1);

  digitalWrite(RST,HIGH);

  int i;

  for(i =0;i《8;i++)

  {

  digitalWrite(SCLK,LOW);

  digitalWrite(IO, addr&1);

  addr =addr》》1;

  digitalWrite(SCLK,HIGH);

  delayMicroseconds(1);

  }

  for(i =0;i《8;i++){

  digitalWrite(SCLK,LOW);

  digitalWrite(IO, dat&1);

  dat =dat》》1;

  digitalWrite(SCLK,HIGH);

  delayMicroseconds(1);

  }

  digitalWrite(RST,LOW);

  }

  uchar readData(uchar addr){

  addr = addr | 1; //讀操作最低位置為1

  pinMode(IO,OUTPUT);

  digitalWrite(RST,LOW); //下拉低,再拉高

  digitalWrite(SCLK,LOW) ; //SCLK的上升沿, 晶片會讀取IO埠

  delayMicroseconds(1);

  digitalWrite(RST,HIGH);

  int i;

  for(i =0;i《8;i++){

  digitalWrite(SCLK,LOW);

  digitalWrite(IO, addr&1);

  addr =addr》》1;

  digitalWrite(SCLK,HIGH);

  delayMicroseconds(1);

  }

  pinMode(IO,INPUT);

  int dat = 0;

  for(i =0;i《8;i++){

  digitalWrite(SCLK,LOW);

  delayMicroseconds(10);

  uchar b = digitalRead(IO);

  dat = dat 》》1; //先向右平移

  dat = dat | (b《《7); //將所得放入最高位

  digitalWrite(SCLK,HIGH);

  delayMicroseconds(1);

  }

  digitalWrite(RST,LOW);

  return dat ;

  }

  #define SECOND 0x80

  #define MIN 0x82

  #define HOUR 0x84

  #define DAY 0x86

  #define MONTH 0x88

  #define YEAR 0x8C

  #define WEEK 0x8A

  void writeTimeUnit(

  uchar TYPE,uchar data){

  uchar high = data / 10;

  uchar low = data % 10;

  uchar d = ((data /10) 《《 4) | (data % 10);

  writeData(TYPE,data);

  }

  uchar readTimeUnit(uchar TYPE){

  uchar r = readData(TYPE);

  r = 10*(r 》》 4)+ (r & 0xf);

  return r;

  }

  void writeAllTm(uchar tm[]){

  uchar s = SECOND;

  for(uchar i=0;i《5;i++){

  writeTimeUnit(s,tm[5-i]);

  s+=2; } writeTimeUnit(YEAR,tm[0]);

  } void readAllTm(uchar tm[]){

  uchar s = SECOND;

  for(uchar i=0;i《5;i++){

  tm[5-i] = readTimeUnit(s);

  s+=2;

  }

  tm[0] = readTimeUnit(YEAR);

  tm[6] = readTimeUnit(WEEK);

  }

  void printTm(uchar tm[]){

  Serial.print(tm[0]);

  Serial.print(「-」);

  Serial.print(tm[1]);

  Serial.print(「-」);

  Serial.print(tm[2]);

  Serial.print(「 」);

  Serial.print(tm[3]);

  Serial.print(「:」);

  Serial.print(tm[4]);

  Serial.print(「:」);

  Serial.print(tm[5]);

  Serial.print(「 week 」);

  Serial.print(tm[6]);

  Serial.println();

  }

  uchar st = 0;

  void loop() {

  uchar tm[7] = {0};

  readAllTm(tm);

  printTm(tm);

  delay(1000);

  }

  void settm()//中斷函數

  {

  uchar tm[] = {11,12,13,4,5,6 ,0}; // 2011-12-22 3:4:1

  Serial.println(「set tm 。。.」);

  writeAllTm(tm);

  }

相關焦點

  • ds1302引腳圖,ds1302引腳圖功能詳解
    打開APP ds1302引腳圖,ds1302引腳圖功能詳解 發表於 2017-10-19 15:39:22   DS1302是時鐘晶片
  • ds1302是什麼,ds1302引腳圖和寄存器詳解
    打開APP ds1302是什麼,ds1302引腳圖和寄存器詳解 發表於 2017-10-18 17:37:05   DS1302
  • ds1302晶振不起振_ds1302晶振電路圖
    打開APP ds1302晶振不起振_ds1302晶振電路圖 發表於 2017-08-26 18:31:28   實時時鐘電路DS1302
  • SPI時鐘晶片DS1302的應用
    DS1302 是美國DALLAS公司推出的一種高性能、低功耗、帶RAM的實時時鐘電路,它可以對年、月、日、周日、時、分、秒進行計時,具有閏年補償功能,工作電壓為
  • Arduino提高篇22—實時時鐘DS1302
    很多電子愛好者都熱衷製作電子時鐘來練手,這些時鐘會使用數碼管、點陣屏、LCD液晶屏、OLED屏、TFT屏等顯示模塊,所使用的RTC時鐘晶片也各不相同,DS1302、DS3231、DS12C887等。通過單片機等MCU驅動RTC模塊,讀取時間數據並交給顯示模塊進行展示,還可以加入按鍵來調節時鐘,可以說是一個非常全面的練手項目。
  • ds1302讀取數據問題分析及解決
    公司推出的具有涓細電流充電能力的低功耗實時時鐘晶片。它可以對年、月、日、周、時、分、秒進行計時,且具有閏年補償等多種功能。   工作原理編輯   DS1302 是美國DALLAS公司推出的一種高性能、低功耗、帶RAM的實時時鐘電路,它可以對年、月、日、周、時、分、秒進行計時,具有閏年補償功能,工作電壓為2.0V~5.5V。
  • 時鐘晶片接口分析與DS1302典型原理電路圖
    每個程序的運行都需要頻率這個東西來恆量,所以我們就會需要用到時鐘晶片,它才會產生時鐘頻率。時鐘晶片是日常生活中應用最為廣泛的消費類電子產品之一。它為人們提供精確的實時時間,可以對年、月、日、周日、時、分、秒進行計時,且具有閏年補償等多種功能;或者為電子系統提供精確的時間基準,目前實時時鐘晶片大多採用精度較高的晶體振蕩器作為時鐘源。
  • DS1302時鐘晶片顯示時間C51程序
    /*程序效果:通過DS1302晶片顯示時間,本程序主要是要理解     DS1302晶片的協議,這樣便於編寫程序。     當然時間顯示也可以用單片機的定時器來控制,比起延時     子函數來說較精準。
  • ds1302帶鬧鐘功能的單片機控制的時鐘程序
    (uchar add,uchar date);uchar read_ds1302(uchar add);void read_rtc();void set_ds1302(uchar add,uchar time);void display();void init_ds1302();void main(){wela=1;P1=0xff
  • 用ds1302製作一個精密的電子時鐘
    題目:用ds1302製作一個精密的電子時鐘感想:我看視頻的時候講的是DS12CR887這塊晶片,兩塊畢竟是不一樣的,所以,我只是看了他講怎樣看時序,之後的就沒再看了。我就拿著自己下載列印的DS1302數據手冊,研習,研習,再研習。還查了書上的,網上的,源程序。
  • 淺談單片機c語言模塊化編程-附ds1302時鐘晶片驅動程序
    最終確定在ds1302_write_byte中。發現了一個很奇特的事情。錯誤是因為fou循環,我用for(i=0;i<8;i++)替換成為for(i=8;i>0;i--)解決了問題。extern可以置於變量或者函數前,以表示變量或者函數的定義在別的文件中,提示編譯器遇到此變量和函數時在其他模塊中尋找其定義。
  • DS1302時鐘模塊的使用
    ds1302.h庫文件已經上傳,有需要的自行下載。注意ds1302.h要與zhy.h配合使用。接下來我詳細講解一下,ds1302.h庫文件的使用方法。sbit RST=P2^3;sbit IO=P2^5;sbit SCK=P2^4;這三個位定義,根據實際電路進行修改。
  • DS1302時鐘晶片介紹_DS1302的使用技巧和特點詳解
    DS1302 是DALLAS 公司推出的涓流充電時鐘晶片,內含有一個實時時鐘/日曆和31 字節靜態RAM,通過簡單的串行接口與單片機進行通信。實時時鐘/日曆電路提供秒、分、時、日、日期、月、年的信息,每月的天數和閏年的天數可自動調整,時鐘操作可通過AM/PM 指示決定採用24 或12 小時格式。
  • 基於STM32和DS1302設計的時鐘程序
    必須在read_time();後調用此函數;void ds1302set_time(void); //對時函數void ds1302read_time(void); //讀取時間#endif /* __STM32F10x_IT_H */DS1302——C程序時 間:11—5-4標 註:用到了 PA_3—5,PA3_5位控制為依次
  • LCD1602液晶顯示DS1302實時時鐘Proteus仿真
    Proteus仿真圖:本文引用地址:http://www.eepw.com.cn/article/201611/316089.htm仿真程序:#include#include#include#defineuintunsignedint#defineucharunsignedchar
  • 關於DS1302典型應用原理圖
    DS1302含充電電路,可以對作為後備電源的可充電電池充電,並可選擇充電使能和串入的二極體數目,以調節電池充電電壓。不過對我們目前而言,最需要熟悉的是和時鐘相關部分的功能,對於其它參數請參閱數據手冊。
  • ATMEGA16四線驅動LCD顯示時間-DS1302
    #include 本文引用地址:http://www.eepw.com.cn/article/201611/320229.htm#define uchar unsigned char#define uint unsigned int//定義LCD1602的埠應用#define
  • arduino設置ds1302電子時鐘模塊
    目前有許多流行的串行時鐘電路
  • PIC16F877驅動DS1302晶片
    下面是原理圖本文引用地址:http://www.eepw.com.cn/article/201611/317661.htm下面是程序頭文件#ifndef DS1302_H#define DS1302_H#include "main.h"#define Time_24_Hour0x00//24時制控制
  • 輕鬆吃透實時時鐘晶片DS1302軟硬體設計
    今天我們來討論一款老掉牙的實時時鐘晶片DS1302。什麼是實時時鐘(RealTime Clock, RTC)呢?為什麼我們需要它呢?當然,利用代碼來實現這些算法並不是惟一途徑,你也可以使用實時時鐘晶片來減輕編程負擔,只要我們把晶片內的年月日時分秒等參數設置為當前時間,啟動後內部會自動開始計數,理論上晶片記錄的時間將與我們的時間