學生看過來,教你51單片機和RTC模塊構建實時時鐘

2022-03-14     大方老師單片機

原標題:學生看過來,教你51單片機和RTC模塊構建實時時鐘

學生看過來,教你51單片機和RTC模塊構建實時時鐘

RTC 模塊 (DS1307) 與 8051 微控制器接口

在本文中,我們將看到如何將RTC(實時時鐘)模塊連接到8051微控制器。市場上有不同種類的RTC模塊。在本教程中,我們使用DS1307 IC隨附的最常見的RTC模塊、LCD模塊和AT89S52(8051型號)。AT89S52 是 Atmel 製造的一款典型的 8051 微控制器。將RTC模塊連接到8051微控制器非常簡單。您只需要在 RTC 模塊和 8051 之間建立 2 個連接。因此,讓我們開始營業吧!

實時時鐘模塊基本上是一個時間跟蹤設備,它給出當前的時間和日期。DS3231 IC附帶的RTC模塊具有設置報警功能。

關於DS1307 RTC模塊的注意事項

這裡我們使用的是RTC模塊和基於I2C協議(雙線協議)的時鐘晶片DS1307。該模塊提供了諸如秒,分鐘,小時,星期幾,月中某天,月份和年份的詳細信息,包括閏年的校正。它可以以12小時或24小時格式運行。該模塊的電流消耗為納安範圍。即使是3V電池也可以供電10年,保持精確的時鐘,而無需任何外部電源。

DS1307的存儲區為64位元組,其中前8個位元組保留為RTC寄存器區,其餘56個位元組作為通用RAM分配。有關當前、日期和時間的詳細信息以二進位編碼小數 (BCD) 的形式存儲在其寄存器區域中。該模塊使用稱為I2C的串行通信協議與微控制器進行通信。I2C 總線物理上由 2 根有源導線組成。這些電線稱為SDASCL,都是雙向的。SDA 是串行數據線,SCL 是串行 CLock 線。連接到總線的每個設備都有自己唯一的設備地址,無論是MCU還是RTC模塊。這些晶片中的每一個都可以充當接收器或發射器,具體取決於功能。

DS1307在通信網絡中充當從站,控制器只能通過啟動啟動條件和器件地址來訪問從站。此後,我們需要發送寄存器編號才能訪問其中的值。8051 的接口非常簡單,SDA 和 SCL 引腳連接到 8051 的任意兩個引腳。在軟體方面,我們使用名為"I2C"的用戶定義庫進行I2C通信。該庫允許您與I2C / TWI設備進行通信。

希望大家到現在為止都能理解!讓我們進入電路圖!下面給出的是將RTC模塊連接到8051的電路圖。

電路圖 – RTC 與 8051 接口

電路圖 – RTC 8051 接口

如圖所示建立連接!現在讓我們進入編碼部分。

程序/代碼說明

下載程序 – 嵌入式 C

使用8051的RTC(實時時鐘)程序是用嵌入式C(使用Keil編譯器)編寫的。

我們首先將"LCD8bit"庫包含在程序中。它是一個用戶定義的庫,用於在8位模式下將微控制器與LCD模塊連接。在此庫中,我們包含了一些用於初始化LCD,發送命令和發送要顯示的數據的功能。

要連接到LCD數據引腳的埠和要連接到命令引腳的引腳可以在磁帶庫本身中配置。在這裡,我們為數據引腳定義了埠0,為命令引腳定義了P3.5,P3.6和P3.7。

這裡使用的另一個用戶定義的庫是"delay",它由名為"Delay_ms()"和"Delay_us()"的函數組成。Delay_ms(1000) 將停止程序 1000 毫秒(即一秒)和Delay_us(_)函數用於我們需要停止程序幾微秒。

請瀏覽我們的教程,了解有關在 4 位模式和 8 位模式下將 LCD 模塊連接到 8051 的更多信息

在這個項目中,我們主要關注RTC模塊接口。如前所述,這裡使用名為"I2C"的庫進行I2C通信。I2CStart() 函數將啟動通信。I2CSend() 是用於發送數據的函數,I2Cread() 用於讀取寄存器。

在主程序中定義了兩個名為"readAllReg()"和"readSecReg()"的函數,用於從RTC模塊讀取時間詳細信息。前者用於讀取所有寄存器,後者僅用於讀取"第二個"寄存器。

在DS1307中,位元組存儲為二進位編碼的小數。因此,在將值寫入寄存器之前,我們需要將其轉換為BCD(二進位編碼小數)。同樣明智的是,從寄存器區域讀取值後,應將其轉換為十進位。Dec_To_BCD() 是用於此目的的函數。

在從RTC模塊讀取值之前,我們必須立即設置時間和日期。用於此目的的函數是 setTime() 函數。我們應該將實際時間詳細信息作為參數傳遞。實際格式類似於 setTime(sec,min,hour,dow,dom,month,year); .

在我們的項目中,我們以 24 小時模式使用 DS1307,然後在軟體端將其轉換為 12 小時模式。因此,時間詳細信息應處於 24 小時模式,同時通過 setTime() 函數傳遞參數。

注意:-一次上傳程序後,您應該通過注釋 setTime() 函數來重新上傳代碼。否則,setTime() 函數會在每次重置微控制器時損壞當前時間。

名為 displayTime() 的函數用於在 LCD 中顯示時間和日期。在函數內部,它將每秒調用"readSecreg()"。並且"readAllReg()"函數將每隔一分鐘調用一次。一個名為"a[7]"的數組在程序開始時全局聲明。"readSecReg()"和"readAllReg()"函數將分別每隔一秒和一分鐘定期更新此數組元素。

說了這麼多,大家記得留意下方評論第一條(或者私信我)有乾貨全套入門課程~

文章來源: https://twgreatdaily.com/zh/04ed20e8ee54c42fc1ebab1df2ebb846.html