DS1302實時時鐘芯片_讀寫時間實現電子鐘功能

一、前言

1.1 功能說明

本項目以STC90C51單片機為核心,結合DS1302實時時鐘芯片和IIC協議的OLED顯示屏,設計了一款功能豐富、操作簡便的電子時鐘。

【1】項目目標

  1. 實現高精度的時間顯示,包括時、分、秒。
  2. 提供按鍵調整時間的功能,方便用戶校準時間。
  3. 利用OLED顯示屏以直觀的方式展示時間信息。

【2】系統架構

  1. 微控制器:采用STC90C51單片機作為核心控制器,負責整個系統的數據處理和邏輯控制。
  2. 實時時鐘芯片:選用DS1302作為實時時鐘芯片,提供高精度的時間信息。DS1302通過I2C接口與STC90C51進行通信,實現時間的讀取和設置。
  3. 顯示屏:采用IIC協議的OLED顯示屏作為顯示設備,用于顯示時間信息。顯示屏與STC90C51通過SPI I2C接口連接,實現數據的傳輸和顯示。
  4. 按鍵模塊:設計一組按鍵用于調整時間。按鍵模塊通過GPIO接口與STC90C51連接,實現按鍵信號的輸入和識別。

【3】功能實現

  1. 時間顯示:STC90C51定時從DS1302讀取時間信息,并通過OLED顯示屏進行顯示。顯示屏可以實時更新時間,保證時間的準確性。
  2. 時間調整:用戶通過按鍵模塊輸入調整時間的指令,STC90C51根據指令對DS1302進行設置,實現時間的校準。

1.2 DS1302介紹

DS1302是由美國DALLAS公司推出的一款低功耗實時時鐘芯片,具有涓細電流充電能力。以下是對DS1302的詳細介紹:

【1】主要功能特點

  1. 計時功能:DS1302能夠對年、月、日、周、時、分、秒進行精確計時,并具備閏年補償功能,確保時間的準確性。
  2. 低功耗:該芯片功耗極低,工作電壓在2.0V至5.5V范圍內,使得它非常適合在需要長時間運行且電源有限的設備中使用。
  3. 數據存儲:DS1302內部具有一個31×8的RAM寄存器,可用于臨時性存放數據。
  4. 雙電源引腳:DS1302擁有主電源/后備電源雙電源引腳設計,可以在主電源關閉的情況下,通過后備電源保持時鐘的連續運行。
  5. 串行I/O通信:采用串行I/O通信方式,相對于并行通信更節省IO口的使用。

【2】引腳說明

DS1302共有8個引腳,包括:

  • VCC2:主電源正極的引腳。
  • X1和X2:晶振輸入和輸出引腳,外接32.768kHz晶振。
  • GND:負極。
  • CE:使能引腳,接單片機的IO口,用于啟動和停止時鐘芯片的工作。
  • I/O:數據傳輸引腳,接單片機的IO口,用于數據的讀寫。
  • SCLK:通信時鐘引腳,接單片機的IO口,用于同步數據傳輸。
  • RST:復位/片選線,通過把RST輸入驅動置高電平來啟動所有的數據傳送。RST也有兩種功能:一是接通控制邏輯,允許地址/命令序列送入移位寄存器;二是提供終止單字節或多字節數據傳送的方法。
  • VCC1:后備電源引腳,在主電源關閉時,為DS1302提供電源。

【3】應用領域

由于其穩定可靠、易于使用和低功耗等特點,DS1302被廣泛應用于各個領域,包括:

  • 電子產品:如手機、平板電腦等需要準確顯示時間的設備中。
  • 工業控制系統:如自動化生產線、儀器儀表等需要同步計時和記錄數據的設備中。
  • 汽車電子系統:如車載導航儀、車載音響等需要準確顯示時間和日期信息的設備中。

image-20240612113752914

image-20240612113806768

二、代碼實現

2.1 main.c

#include <reg51.h>
#include "delay.h"
#include "type.h"
#include "uart.h"
#include "ds1302.h"
//#include "key.h"
//#include "led.h"
//#include "timer.h"
//#include "exti.h"
//#include "infrared.h"
//#include "ds18b20.h"
//#include "at24c02.h"int main()
{u8 stat;UART_Init();        //初始化串口波特率為4800DS1302_Init();stat=DS1302_ReadByte(0x80|0x01);//讀取秒if(stat&0x80){DS1302_WriteTime(2020-2000,1,18,16,33,33,6);}else{printf("DS1302 OK\r\n");}while(1){DS1302_ReadTime();printf("DS1302:%d-%d-%d %d:%d:%d %d\r\n",(int)DS1302_TIME[0]+2000,(int)DS1302_TIME[1],(int)DS1302_TIME[2],(int)DS1302_TIME[3],(int)DS1302_TIME[4],(int)DS1302_TIME[5],(int)DS1302_TIME[6]);     DelayMs(1000);}
}

2.2 DS1302.c

#include"ds1302.h"
//定義ds1302使用的IO口
sbit DS1302_IO=P3^4;
sbit DS1302_RST=P3^5;
sbit DS1302_SCLK=P3^6;u8 DS1302_TIME[7]; //存放讀取的時間/*
函數功能: 將十進制數據轉為BCD碼
*/
u8 DEC_TO_BCD(u8 val)
{return ((val/10)<<4)+val%10;
}/*
函數功能: 將BCD碼數據轉為十進制格式
*/
u8 BCD_TO_DEC(u8 val)
{return (val&0x0f)+(val>>4)*10;
}void DS1302_Init(void)
{DS1302_RST=0;DS1302_SCLK=0;//先將DS1302_SCLK置低電平。
}/*
函數功能: 向DS1302指定寄存器里寫一個字節數據
*/
void DS1302_WriteByte(u8 addr,u8 dat)
{u8 n;DS1302_RST=1; //然后將DS1302_RST(CE)置高電平。/*1. 設置寫入的地址*/for(n=0;n<8;n++){DS1302_IO=addr&0x01;//數據從低位開始傳送addr>>=1;DS1302_SCLK=1;//數據在上升沿時,DS1302讀取數據DS1302_SCLK=0;}/*2. 寫入數據*/for(n=0;n<8;n++){DS1302_IO=dat&0x01;dat>>=1;DS1302_SCLK=1;//數據在上升沿時,DS1302讀取數據DS1302_SCLK=0;}	DS1302_RST=0;//傳送數據結束
}/*
函數功能: 從DS1302指定寄存器里讀取一個字節數據
*/
u8 DS1302_ReadByte(u8 addr)
{u8 n=0,dat=0;DS1302_RST=1;   //然后將DS1302_RST(CE)置高電平。/*1. 設置讀取的地址*/for(n=0;n<8;n++){DS1302_IO=addr&0x01;//數據從低位開始傳送addr>>=1;DS1302_SCLK=1;//數據在上升沿時,DS1302讀取數據DS1302_SCLK=0;//DS1302下降沿時,放置數據}/*2. 讀取數據*/for(n=0;n<8;n++){dat>>=1;if(DS1302_IO)dat|=0x80;DS1302_SCLK=1;DS1302_SCLK=0;//DS1302下降沿時,放置數據}DS1302_RST=0;//必須的操作,復位時間DS1302_IO=0;DS1302_IO=1;return dat;	
}/*
函數功能: 設置DS1302芯片的時間
DS1302的時間基準是從2000年開始的,設置年份時要減去2000再傳入設置
例如:DS1302_WriteTime(20,1,18,14,46,20,6);
*/
void DS1302_WriteTime(u8 year,u8 mon,u8 mday,u8 hour,u8 min,u8 sec,u8 week)
{DS1302_WriteByte(0x8E,0x00); //禁止寫保護,就是關閉寫保護功能	DS1302_WriteByte(0x8c,DEC_TO_BCD(year)); //設置年	DS1302_WriteByte(0x88,DEC_TO_BCD(mon));  //設置月	DS1302_WriteByte(0x86,DEC_TO_BCD(mday)); //設置日	DS1302_WriteByte(0x84,DEC_TO_BCD(hour)); //設置時	DS1302_WriteByte(0x82,DEC_TO_BCD(min));  //設置分	DS1302_WriteByte(0x80,DEC_TO_BCD(sec));  //設置秒	DS1302_WriteByte(0x8a,DEC_TO_BCD(week)); //設置星期	DS1302_WriteByte(0x8E,0x80);		     //打開寫保護功能
}/*
函數功能: 讀取DS1302時鐘的時間
DS1302寄存器的最低位是讀寫位,0是寫,1是讀
*/
void DS1302_ReadTime(void)
{DS1302_TIME[0]=BCD_TO_DEC(DS1302_ReadByte(0x8c|0x01));//讀取年DS1302_TIME[1]=BCD_TO_DEC(DS1302_ReadByte(0x88|0x01));//讀取月DS1302_TIME[2]=BCD_TO_DEC(DS1302_ReadByte(0x86|0x01));//讀取日	DS1302_TIME[3]=BCD_TO_DEC(DS1302_ReadByte(0x84|0x01));//讀取時DS1302_TIME[4]=BCD_TO_DEC(DS1302_ReadByte(0x82|0x01));//讀取分	DS1302_TIME[5]=BCD_TO_DEC(DS1302_ReadByte(0x80|0x01));//讀取秒	DS1302_TIME[6]=BCD_TO_DEC(DS1302_ReadByte(0x8a|0x01));//讀取星期
}

2.2 ds1302.h

#ifndef _DS1302_H
#define _DS1302_H
#include "type.h"
#include <reg51.h>
#include "delay.h"
#include "type.h"
#include "uart.h"
#include <intrins.h>//定義全局函數
u8 DEC_TO_BCD(u8 val);  //十進制轉BCD碼
u8 BCD_TO_DEC(u8 val);  //BCD碼轉十進制
u8 DS1302_ReadByte(u8 addr);
void DS1302_WriteByte(u8 addr,u8 dat);
void DS1302_WriteTime(u8 year,u8 mon,u8 mday,u8 hour,u8 min,u8 sec,u8 week);
void DS1302_ReadTime(void);
void DS1302_Init(void);
//加入全局變量
extern u8 DS1302_TIME[7];
#endif

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/43340.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/43340.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/43340.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

fatal error: NvInfer.h: No such file or directory 的參考解決方法

文章目錄 寫在前面一、問題描述二、解決方法參考鏈接 寫在前面 自己的測試環境&#xff1a; Ubuntu20.04 一、問題描述 編譯調用 tensorrt 的程序時&#xff0c;出現如下報錯&#xff1a; fatal error: NvInfer.h: No such file or directory7 | #include <NvInfer.h>…

sublime使用

快速格式化&#xff1a;control command j&#xff08;前提是安裝了Pretty JSON 插件&#xff09; 選中多行編輯&#xff1a;option command直接移動bar選中 多光標編輯功能對所有行進行相同的操作。以下是一些常用的方法&#xff1a; 1. 使用鼠標和鍵盤選擇多行 按住 Ctrl&am…

[Java]Swing版坦克大戰小游戲項目開發(1)——new出一個窗口

highlight: xcode theme: vuepress 前言 本系列文章帶領 Java 初學者學習使用 Java 語言結合 Swing 技術以及設計模式開發一款經典小游戲——坦克大戰。通過這個小游戲&#xff0c;你可以學會很多實用的設計模式思想&#xff0c;并且提高你的編碼水平。 熟悉Frame Frame 類是 J…

【java計算機畢設】基于java的奶茶店管理系統的設計與實現MySQL ssm JSP maven項目代碼源碼+文檔

目錄 1項目功能 2項目介紹 3項目地址 1項目功能 【java計算機畢設】奶茶店管理系統java MySQL ssm JSP maven項目源碼代碼萬字文檔 小組設計 2項目介紹 系統功能&#xff1a; 奶茶店管理系統包括管理員、用戶倆種角色。 管理員功能包括個人中心模塊用于修改個人信息和密碼、…

如何在 Ubuntu 14.04 上安裝和配置 Syncthing 來同步目錄

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到網站。 介紹 有許多程序可以在不同計算機之間同步文件。Syncthing 是一個引人注目的新選擇&#xff0c;它跨平臺、完全開源、非常靈活且易于使…

UDP通訊實現

服務器端&#xff1a; 1.獲取套接字 int fd;fdsocket(AF_INET,SOCK_DGRAM,0);if(fd<0){perror("socket");exit(0);} #include <sys/types.h> #include <sys/socket.h> int socket(int domain, int type, int protocol); -domain: 指定通信域&…

Elasticsearch 面試題指南

Elasticsearch 面試題指南 本文檔提供了一份詳細的 Elasticsearch 面試題指南&#xff0c;涵蓋了 Elasticsearch 的核心概念、架構、配置、操作和實際應用場景等方面的內容。希望通過這份指南能夠幫助你在 Elasticsearch 面試中取得成功。 目錄 Elasticsearch 基礎知識 什么…

Retrofit框架源碼深度剖析【Android熱門框架分析第二彈】

Android熱門框架解析&#xff0c;你確定不來看看嗎&#xff1f; OkHttp框架源碼深度剖析【Android熱門框架分析第一彈】 Retrofit框架源碼深度剖析【Android熱門框架分析第二彈】 什么是Retrofit&#xff1f; 準確來說&#xff0c;Retrofit 是一個 RESTful 的 HTTP 網絡請求…

網絡編程:數據包的封裝----libnet庫

使用libnet庫封裝數據包 安裝庫sudo apt-get install libnet-dev 1、數據包內存初始化 libnet_t *libnet_init(int injection_type, char *device, char *err_buf) 2、構造數據包&#xff0c; 由應用層UDP/TCP到MAC層的順序構造 封裝udp數據包的函數 libnet_ptag_t libnet_bui…

Miniconda的常見用法——以Isaacgym為例

1. ubuntu24.04安裝minicondda mkdir -p ~/miniconda3 wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh -O ~/miniconda3/miniconda.sh解釋下這段代碼 bash ~/miniconda3/miniconda.sh -b -u -p ~/miniconda3~/miniconda3/miniconda.sh: 指向Mi…

java中Function、Consumer和Supplier是函數式接口嗎?

是的&#xff0c;在Java中&#xff0c;Function、Consumer 和 Supplier 都是函數式接口&#xff0c;它們都是Java 8引入的java.util.function包中的一部分。這些接口為Lambda表達式提供了類型支持&#xff0c;允許以更簡潔的方式表示方法引用和匿名內部類。 Function<T, R&g…

SHARPNESS-AWARE MINIMIZATION FOR EFFICIENTLY IMPROVING GENERALIZATION--論文筆記

論文筆記 資料 1.代碼地址 https://github.com/google-research/sam https://github.com/davda54/sam 2.論文地址 https://arxiv.org/abs/2010.01412 3.數據集地址 論文摘要的翻譯 在當今嚴重過度參數化的模型中&#xff0c;訓練損失的值很難保證模型的泛化能力。事實上…

代碼隨想錄算法訓練營第三十天|62.不同路徑、63. 不同路徑 II

62.不同路徑 一個機器人位于一個 m x n 網格的左上角 &#xff08;起始點在下圖中標記為 “Start” &#xff09;。 機器人每次只能向下或者向右移動一步。機器人試圖達到網格的右下角&#xff08;在下圖中標記為 “Finish” &#xff09;。 問總共有多少條不同的路徑&#xff…

軟設之生成器模式

生成器模式的意圖是:將一個復雜的類表示與其構造分離&#xff0c;使得相同的構建過程能夠得出不同的表示 Builder:抽象建造者&#xff0c;為創建一個產品對象各個部件指定抽象接口&#xff0c;把產品的生產過程分解為不同的步驟&#xff0c;從而使具體建造者在具體的建造步驟上…

Java中的對象克隆詳解

Java中的對象克隆詳解 大家好&#xff0c;我是免費搭建查券返利機器人省錢賺傭金就用微賺淘客系統3.0的小編&#xff0c;也是冬天不穿秋褲&#xff0c;天冷也要風度的程序猿&#xff01; 對象克隆在Java編程中是一個重要的概念和技術。它允許我們創建一個對象的精確副本&…

MySQL第三次練習

作業三 一 先創建DB abc&#xff0c;創建table student 1、插入一條記錄 2、添加多條記錄 3、添加部分記錄 4、加0.5 5、刪除成績為空的記錄 二 1、創建一個用戶test1使他只能本地登錄擁有查詢student表的權限。 2、查詢用戶test1的權限。 3、刪除用戶test1. 全在一張圖上…

怎樣優化 PostgreSQL 中對日期時間范圍的模糊查詢?

文章目錄 一、問題分析&#xff08;一&#xff09;索引未有效利用&#xff08;二&#xff09;日期時間格式不統一&#xff08;三&#xff09;復雜的查詢條件 二、優化策略&#xff08;一&#xff09;使用合適的索引&#xff08;二&#xff09;規范日期時間格式&#xff08;三&a…

AI學習指南機器學習篇-層次聚類(Hierarchical Clustering)簡介

AI學習指南機器學習篇-層次聚類(Hierarchical Clustering)簡介 在機器學習領域中&#xff0c;層次聚類(Hierarchical Clustering)是一種常見的無監督學習算法&#xff0c;用于將數據集中的樣本分成具有相似特征的群組。層次聚類不需要預先指定要分成的群組數目&#xff0c;而是…

邏輯回歸模型(非回歸問題,而是分類問題)

目錄&#xff1a; 一、Sigmoid函數&#xff1a;二、邏輯回歸介紹&#xff1a;三、決策邊界四、邏輯回歸模型訓練過程&#xff1a;1.訓練目標&#xff1a;2.梯度下降調整參數&#xff1a; 一、Sigmoid函數&#xff1a; Sigmoid函數是構建邏輯回歸模型的重要函數&#xff0c;如下…