at89s51(關于at89s51的基本詳情介紹)

學生看過來,教你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 根有源導線組成。這些電線稱為SDA和SCL,都是雙向的。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()"函數將分別每隔一秒和一分鐘定期更新此數組元素。

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

轉載注明出處:華峰博客網

內容版權聲明:除非注明,否則皆為本站原創文章。