基于51单片机的电子时钟
基于51單片機的電子時鐘設計
目錄
基于51單片機的電子時鐘設計
一、需求分析
1.1?前言
1.2研究價值及意義
1.3 任務目標
一、總體設計
2.1 設計思路
2.2 總體框架
2.3 主要元件說明
2.3.1?AT89C51單片機
2.3.2 LCD1602液晶顯示器
2.3.3 24C02C存儲芯片
2.3.4 DS1302時鐘芯片
三、詳細設計
3.1 液晶顯示模塊設計
3.1.1 硬件設計
3.2 時間產生模塊設計
3.2.1 硬件設計
3.2.2 軟件設計
3.3 數據存儲模塊設計
3.3.1 硬件設計
3.3.2 軟件設計
3.4 按鍵處理模塊設計
3.4.1 硬件設計
3.4.2 軟件設計
四、程序運行結果測試與分析
4.1 LCD1602功能測試
4.2 DS1302功能測試
4.3 24C02C功能測試
4.4 調整時間功能測試
一、需求分析
1.1?前言
單品微型計算機簡稱單片機,是典型的嵌入式微控制器(Microcontroller Unit),常用英文字母的縮寫MCU表示單片機,單片機又稱單片微控制器,它不是完成某個邏輯功能的芯片,而是把一個計算機系統集成到一個芯片上。相當于一個微型的計算機,和計算機相比,單片機只缺少了I/O 設備。
單片機作為應用最廣泛的控制系統之一,具有體積小,易于控制,價格便宜,安全可靠等等優良的性能而被廣泛的關注。無論是小到兒童玩具,到工業控制系統,大到航天航空系統的設計與操作之中,隨處可見單片機的蹤影。
由于單片機在工業控制領域的廣泛應用,單片機由芯片內僅有CPU的專用處理器發展而來。最早的設計理念是通過將大量外圍設備和CPU集成在一個芯片中,使計算機系統更小,更容易集成進復雜的而對體積要求嚴格的控制設備當中。
1.2研究價值及意義
電子鐘亦稱數顯鐘(數字顯示鐘),是一種用數字電路技術實現時、分、秒計時的裝置,與機械時鐘相比,直觀性為其主要顯著特點,且因非機械驅動,具有更長的使用壽命,相較石英鐘的石英機芯驅動,更具準確性。電子鐘已成為人們日常生活中必不可少的必需品,廣泛用于個人家庭以及車站、碼頭、劇院、辦公室等公共場所,給人們的生活、學習、工作、娛樂帶來極大地方便。相對于其他時鐘類型,它的特點可歸結為“兩強一弱”: 比機械鐘強在觀時顯著,比石英鐘強在走時準確,但是它的弱點為顯時較為單調。
?
1.3 任務目標
使用DS1302芯片作為計時設備,用6個7段LED數碼管或者LCD162作為顯示設備,實現時鐘功能;
功能要求:
(1)可以分別設定小時、分鐘和秒,復位后時間為00:00:00;
(2)秒鐘復位功能,秒復位鍵按下后,秒回到00。
(3)用EEPROM芯片存儲數據
?
一、總體設計
2.1 設計思路
(1)定義一個表示時間的數組,聲明為外部變量,可以在各個模塊中進行訪問,以此來建立它們之間的關聯。
(2)電子時鐘的時間數據由DS1302實時時鐘芯片來產生并顯示在LCD1602上顯示;通過定時器掃描按鍵的方式得到按鍵按下的鍵值,在主程序中根據得到的鍵值調用不同的按鍵處理函數(調時、保存數據、讀取數據等),當要對時間數據進行操作時,可以先對數組中的數進行操作,操作完成后再把數組中的各個元素寫入DS1302芯片。
(3)把各種模塊需要實現的功能都封裝成函數并在頭文件中聲明。例如LCD1602除了需要顯示時間這個數字類型外,還需要顯示字符、字符串等,所以可以定義多個函數來實現顯示各種數據類型。
2.2 總體框架
本項目主要包含這么四個模塊,分別是DS1302時鐘模塊、LCD1602顯示模塊、按鍵處理模塊以及EEPROM存儲模塊。總體框架如圖2-1所示,每一個模塊的詳細設計說明會在下一章進行介紹。
圖2-1 總體框架圖
系統的總體流程圖如圖2-2所示。
? ? ??
圖2-2 總體流程圖
?
2.3 主要元件說明
2.3.1?AT89C51單片機
ATC89C51是采用8051 核的ISP (In SystemProgramming)在系統可編程芯片,最高工作時鐘頻率為80MHz,片內含8K Bytes的可反復擦寫1000 次的Flash只讀程序存儲器,器件兼容標準MCS-51指令系統及80C51引腳結構,芯片內集成了通用8位中央處理器和ISP Flash存儲 單元,具有在系統可編程(ISP)特性,配合PC端的控制程序即可將用戶的程序代碼下載進單片機內部,省去了購買通用編程器,而且速度更快。ATC89C51是本系統的核心元件,控制著整個系統的運行。
?
2.3.2 LCD1602液晶顯示器
LCD1602可以顯示2行16個字符,有8位數據總線DO-D7,和RS、R/W、EN三個控制端口,工作電壓為5V,并且帶有字符對比度調節和背光。LCD1602引腳說明如表2.1所示。LCD1602時序圖如圖2-3所示。
表2.1 LCD1602引腳說明表
| 編號 | 符號 | 引腳說明 | 編號 | 符號 | 引腳說明 |
| 1 | VSS | 電源地 | 9 | D2 | 數據 |
| 2 | VDD | 電源正極 | 10 | D3 | 數據 |
| 3 | VL | 液晶顯示偏壓 | 11 | D4 | 數據 |
| 4 | RS | 數據/命令選擇 | 12 | D5 | 數據 |
| 5 | R/W | 使能信號 | 13 | D6 | 數據 |
| 6 | E | 數據 | 14 | D7 | 數據 |
| 7 | D0 | 數據 | 15 | BLA | 背光源正極 |
| 8 | D1 | 數據 | 16 | BLK | 背光源正極 |
第1引腳:GND為電源地。
第2引腳: VCC接5V電源正極。
第3引腳: V0為液晶顯示器對比度調整端,接正電源時對比魔最弱。接地電源時對比度最離(對比廈過離時會產生"鬼影”.使用時可以通過一個10K的電位器調整對比度)。
第4引腳RS為箭存器選擇,離電平1時選擇微據寄存器低電竿0時選擇指令寄存器.
第5引腳RW為讀寫情號線,離電平(1)時進行讀操作,以51為例的簡草原理圖低電平(0)時進行寫操作。
第6引腳: E(或EN)端為使能(enable)端,離電子(1)時讀取信息,負眺變時執行指令.
第7-14引腳DO- D7為8位雙向擻據端。第15-16腳空腳或青燈電源.第15引腳背光正極.
第16引腳背光負極。
圖2-3 LCD1602時序圖
2.3.3 24C02C存儲芯片
(1)引腳功能介紹及相關知識
24c02是低工作電壓的2k位豐行電可擦除只讀存儲器,內部組織為256個字節,每個字節8位,工作電壓為1.8v-5.5v, 輸入\輸出引腳兼窖為5v,該芯片被廣泛應用于低電壓及低功耗的工商業領城。24c02引腳定義如表2.2所示。
表2.2 24c02引腳定義圖
| 引腳名稱 | 引腳功能 |
| A0-A2 | 器件地址輸入 |
| SDA | 串行數據輸入輸出 |
| SCL | 串行時鐘輸入 |
| WP | 寫保護 |
| VCC | 電源 |
| GND | 地 |
(2)I2C總線協議
只有總線非忙時才被允許進行數據傳送,在傳送時,當時鐘線為高電平,數據線必須為固定狀態,不允許有跳變。時鐘線為高電平時數據線的任何電平變化將被當作總線的啟動或停止條件。
(3)起始條件
起始調教必須在所有操作命令之前發送。時鐘線保持高電平期間,數據線電平從高到低跳變作為I2c 總線的啟動信號。CAT24Cxxx一直監視SDA和SCL電平信號,直到條件滿足時才響應。
(4)停止條件
時鐘線保持高電平期間,數據線電平從低到高跳變作為I'C 總線的停止信號。
(5)器件地址約定
主器件在發送啟動命令后開始傳送數據,主器件發送相應的從器件地址,8位從器件地址的高四位固定為1010, 接下來的3位用來定義存儲器的地址,對于CAT24C021/022,這三位無意義,對于CAT24C41/042,接下來的2位無意義,第三位是地址高位,CAT24C081/082中,第一位無意義,后兩位表示地址高位。最后一位為讀寫控制位,“1” 表示對從器件進行讀寫操作,“0” 表示寫操作。在主器件發送啟動命令和一字節從器件地址后,如果與從器件地址吻合,CAT24C02將發送一個應答信號,然后再根據讀/寫控制為進行讀或寫操作。
(6)應答信號
每次數據傳送成功后,接收器件將發送一個應答信號。當第九個時鐘信號產生時,產生應答型號的器件將SDA下拉為低,通知已經接受到8位數據,接收到起始條件和從器件地址后,CAT24C02 發送一個應答信號,如果為寫操作,每接收到一個字節數據,CAT24C02 發送一一個應答信號。如果為讀操作,CAT24C02發送一個字節數據后釋放總線等待應答信號,一旦接收到應答信號,它將繼續發發送數據,如果接收到主器件發送非應答信號,將結束數據傳送等待停止條件。
(7)寫操作
在寫字節模式下,助器件發送起始命令和從器件地址信息給從器件,在從器件響應應答信號后,主器件將要寫入的數據地址發送到CAT24C02的地址指針,主器件收到從器件的應答信號后再送數據到相應的數據存儲區地址,.CAT24C02再響應一個應答信號,主器件產生一個停止信號,然后CAT24C02啟動內部寫周期,在內部寫周期期間,CAT24C02不再響應主器件任何請求。寫操作時序讀如圖2-4所示:
圖2-4 寫時序圖
(8)讀操作
CAT24C02讀操作的初始化方式和寫操作一樣, 僅把R/w位置1,讀操作有三種方式:立即地址讀、選擇地址讀、連續讀。選擇地址讀操作時序圖如圖2-5所示:
圖2-5 讀時序圖
2.3.4 DS1302時鐘芯片
DS1302是一個實時時鐘芯片,可以提供秒、分、小時、日期、月、年等信息,并且還有軟年自動調整的能力,可以通過配置AM/PM來決定采用24小時格式還是12小時格式,它的引腳及功能如下表所示。
單字節寫入時序如下圖所示。
由圖可見,先拉高使能端,進行使能選擇,然后在時鐘上升沿寫入一個字節。DS1302在進行讀寫操作時最少讀寫兩個字節,第一個是控制字節,就是一個命令,說明是讀還是寫操作,第二個時需要讀寫的數據。對于單字節寫,只有在SCLK為低電平時才能將 CE?置高電平,所以剛開始將SCLK?置低,CE置高,然后把需要寫入的字節送入 IO口,然后跳變SCLK,在SCLK下降沿時,寫入數據。
3.1 液晶顯示模塊設計三、詳細設計
在液晶顯示模塊需要實現的功能有:顯示字符串、顯示字符、顯示十進制數字。字符串用來表示提示信息,字符用來表示“:”、“-”等特殊符號,時間數據用十進制表示。
3.1.1 硬件設計
液晶顯示模塊的硬件連接圖如下圖所示,LCD1602的VSS與地相連、VDD與電源相連、RS與單片機的P2_6口相連、RW與P2_5口相連、E與P2_7口相連、D0-D7通過上拉電阻連接到單片機的P0口(VEE用于調節對比度,此處沒必要連接)。所以給LCD1602送入數據也就是給單片機P0口送數據,再通過單片機的P2_5(RW)、P2_6(RS)、P2_7(E)控制LCD的時序使其正常工作于各個過程。
圖3-1 ?LCD1602硬件接線圖
考慮到代碼的可讀性,首先在程序開頭對一些需要使用到的位變量和數據端口進行了定義,代碼如下。
sbit LCD1602_RS=P2^6;sbit LCD1602_RW=P2^5;sbit LCD1602_E=P2^7;#define??LCD1602_DATA??P0在使用LCD1602時,我們通過寫入指令來控制待顯示數據在液晶顯示器上的位置以及設置LCD1602的參數;通過寫入數據來表示具體要顯示的內容。接下來,依次對LCD1602模塊中的各個函數進行介紹。
(1)寫指令函數。函數的參數即為待寫入的指令。通過改變RS、RW和E這三個引腳的電平變化來對寫指令的時序進行模擬,代碼如下。
void LCD1602_WriteCmd(unsigned char cmd) {LCD1602_RS=0;LCD1602_RW=0;LCD1602_DATA=cmd;LCD1602_E=1;LCD_Delay();LCD1602_E=0;LCD_Delay(); }(2)寫數據函數。函數的參數即為待寫入的數據。寫入數據和寫入指令唯一的區別是RS 引腳的電平狀態不同,RS為低電平期間寫入的是指令,為高電平期間寫入的是數據,具體代碼如下。
void LCD1602_WriteDat(unsigned char dat) {LCD1602_RS=1;LCD1602_RW=0;LCD1602_DATA=dat;LCD1602_E=1;LCD_Delay();LCD1602_E=0;LCD_Delay(); }(3)初始化函數。LCD1602在使用之前需要對它的工作方式進行配置,具體的代碼和注釋如下。
void LCD1602_Init() {LCD1602_WriteCmd(0x38);//顯示模式設置LCD1602_WriteCmd(0x0c);//顯示開LCD1602_WriteCmd(0x06);//顯示光標LCD1602_WriteCmd(0x01);//顯示清屏LCD1602_WriteCmd(0x80);//顯示位置第1行1列 }(4)其他函數。上面介紹的都是最基本的函數,為了在其他模塊中調用方便,我們在這些基本函數的基礎上加以簡單的邏輯設計還編寫了另外三個函數。當需要用到液晶顯示器的時候只需要調用這三個函數即可,下面只對他們的使用進行聲明,代碼較多就不全部列出了。
/*在LCD的第x行第y列上顯示十進制數字num,顯示長度為z*/void LCD1602_ShowNum(unsigned char x,y,z,num ); //顯示十進制數字 /*在LCD的第x行第y列上顯示首地址為dat的字符串*/ void LCD1602_ShowString(unsigned char x,y,char *dat); //顯示字符串 /*在LCD的第x行第y列上顯示字符dat*/void LCD1602_ShowChar(unsigned char x,y,dat);//顯示單個字符3.2 時間產生模塊設計
時間產生模塊需要實現的功能有:通過DS1302實時時鐘芯片產生時間信息,能夠把時間信息寫入DS1302并且讀取出來。
3.2.1 硬件設計
DS1302與單片機的硬件接線如下圖所示。在DS1302的X1、X2管教處外接了一個頻率為32.768KHZ的晶振,為時鐘運行提供一個穩定的時鐘頻率。RST非、SCLK、I/O分別與單片機的P3_5、P3_6、P3_4連接,串行數據通過I/O引腳在單片機和DS1302之間進行傳輸。
?
圖3-2 ?DS1302硬件接線圖
3.2.2 軟件設計
在程序的最開始首先對需要用到的位變量進行定義和DS1302中特殊意義的常量進行宏定義,此外還定義了一個儲存時間的全局變量,具體代碼及注釋如下。
#define DS1302_SECOND 0x80//秒 #define DS1302_MINUTE 0x82//分 #define DS1302_HOUR 0x84//小時 #define DS1302_DATE 0x86//日 #define DS1302_MONTH 0x88//月 #define DS1302_DAY 0x8A//星期 #define DS1302_YEAR 0x8C//年 #define DS1302_WP 0x8E//寫保護 sbit DS1302_RST=P3^5; sbit DS1302_SCLK=P3^6; sbit DS1302_IO=P3^4; char DS1302_Time[]={20,1,1,0,0,0,3}; //保存時間信息 年 月 日 時 分 秒 星期 //所以在單片機上電之后DS1302默認的時間就是2020-1-1 00:00:00 星期三在此模塊中最重要也是最基本的兩個函數是寫入一個字節的函數(即設置時間)和讀取一個字節的函數,下面分別對其進行介紹。
(1)單字節寫函數。函數的第二個參數表示待寫入的數據,第一個參數表示操作指令。兩個8位數據從高位開始一次一位一位的通過I/O管腳寫入DS1302。具體代碼如下。
void DS1302_WriteByte(unsigned char cmd,dat) {unsigned char i;DS1302_RST=1;for(i=0;i<8;i++){DS1302_IO=cmd&(0x01<<i);DS1302_SCLK=1;DS1302_SCLK=0;}for(i=0;i<8;i++){DS1302_IO=dat&(0x01<<i);DS1302_SCLK=1;DS1302_SCLK=0;}DS1302_RST=0;DS1302_SCLK=0; }(2)單字節讀函數。函數的參數是操作指令,返回值為讀取到的數據。這里的指令跟單字節寫函數的指令有所不同,它要求指令的最后一位必須為1,而單字節寫要求為0。所以在代碼中對參數cmd進行了處理,確保末位為1,具體代碼如下。
unsigned char DS1302_ReadByte (unsigned char cmd) {unsigned char i,DATA=0x00;cmd|=0x01;//確保末位為1DS1302_RST=1;for(i=0;i<8;i++){DS1302_IO=cmd&(0x01<<i);DS1302_SCLK=1;DS1302_SCLK=0;}for(i=0;i<8;i++){if(DS1302_IO)DATA=DATA|(0x01<<i);DS1302_SCLK=1;DS1302_SCLK=0;}DS1302_RST=0;return DATA; }(3)設置時間函數。在實際調用上面兩個函數時,指令實參一般是開頭定義的宏,數據實參一般是數據組中的元素。為了在其他模塊中更好的使用這個模塊,我們另外定義了兩個函數分別用于讀取時間和設置時間,這樣避免了過于繁瑣的調用單字節寫和讀函數,不容易出錯,只需要對數組進行操作。具體代碼如下。
void setTime () {DS1302_WriteByte(DS1302_WP,0x00);DS1302_WriteByte(DS1302_YEAR,DS1302_Time[0]/10*16+DS1302_Time[0]%10);DS1302_WriteByte(DS1302_MONTH,DS1302_Time[1]/10*16+DS1302_Time[1]%10);DS1302_WriteByte(DS1302_DATE,DS1302_Time[2]/10*16+DS1302_Time[2]%10);DS1302_WriteByte(DS1302_HOUR,DS1302_Time[3]/10*16+DS1302_Time[3]%10);DS1302_WriteByte(DS1302_MINUTE,DS1302_Time[4]/10*16+DS1302_Time[4]%10);DS1302_WriteByte(DS1302_SECOND,DS1302_Time[5]/10*16+DS1302_Time[5]%10);DS1302_WriteByte(DS1302_DAY,DS1302_Time[6]/10*16+DS1302_Time[6]%10);DS1302_WriteByte(DS1302_WP,0x80); }說明:由于時間在DS1302芯片中是以BCD碼的形式進行存儲的,而數組中的元素是十進制,所以我們要把十進制轉化成BCD碼再寫入DS1302;讀取時間則反過來把BCD碼轉化成十進制。?
?
3.3 數據存儲模塊設計
本模塊使用基于I2C協議的存儲芯片24C02C來保存時間數據,需要實現的功能包括寫入數據和讀取數據。
3.3.1 硬件設計
24C02C與單片機的鏈接圖如下圖所示,時鐘線SCK由單片機P2_1口控制,數據線SDA由P2_0口控制,寫保護管腳WP和表示地址的A0-A2均接地。因此,24C02C的寫保護處于失能狀態,也就是說24C02C始終可讀可寫,且地址碼為1010000X。下面的I2C Debug模塊在仿真中用于驗證存儲的信息是否準確無誤。
圖3-3 24C02C硬件接線圖
3.3.2 軟件設計
首先對一些需要使用到的位變量進行定義,具體的代碼如下。
sbit I2C_SDA=P2^0;
sbit I2C_SCL=P2^1;
24C02C是一種遵循I2C總線協議的存儲芯片,它的數據幀由I2C模塊的函數拼湊而成。I2C模塊的函數聲明如表3.1所示。
表3.1 I2C模塊函數聲明表
| 函數原型聲明 | 意義 |
| void I2C_Start() | 起始信號 |
| void I2C_Stop() | 終止信號 |
| I2C_SendByte(unsigned char Byte) | 發生一個字節 |
| unsigned char I2C_ReceiveByte() | 接收一個字節 |
| void I2C_SendAck(unsigned char AckBit) | 發送應答信號 |
| unsigned char I2C_ReceiveAck(void) | 接收應答信號 |
接下來正式介紹24C02的發送和接收數據函數。
(1)發送數據函數。函數的第一個參數表示的是要發送的地址,第二個參數為待發送的數據,ADDRESS表示器件的地址碼,由硬件接線確定,此處為0xA0。具體的代碼如下。
void _24C02_WriteByte(unsigned char WordAddress,Data) {I2C_Start();I2C_SendByte(ADDRESS);//0xA0I2C_ReceiveAck();I2C_SendByte(WordAddress);I2C_ReceiveAck();I2C_SendByte(Data);I2C_ReceiveAck();I2C_Stop(); }(2)接收數據函數。參數為需要接收數據的地址,返回值為該地址中的數據。在接收數據的過程中要求ADDRESS的末位為1。函數的具體代碼如下。
unsigned char _24C02_ReadByte(unsigned char WordAddress) {unsigned char Data;I2C_Start();I2C_SendByte(ADDRESS);I2C_ReceiveAck();I2C_SendByte(WordAddress);I2C_ReceiveAck();I2C_Start();I2C_SendByte(ADDRESS|0x01);I2C_ReceiveAck();Data=I2C_ReceiveByte();I2C_SendAck(1);I2C_Stop();return Data; }3.4 按鍵處理模塊設計
按鍵模塊的電路最為簡單,但他需要實現的邏輯功能確實最為復雜。本模塊需要實現的功能包括按鍵掃描和按鍵處理。通過定時器掃描按鍵的方式對按下的按鍵進行檢測,根據得到的鍵值調用不同的方法。
3.4.1 硬件設計
按鍵的硬件連接如下圖所示。7個按鍵一端接單片機I/O口,另一端接地,當有按鍵按下時對應的I/O口就為低電平。
圖3-4 按鍵接線圖
3.4.2 軟件設計
由于按鍵的器件特性,在實際使用過程中無論是在按下按鍵還是松開按鍵的瞬間都會存在抖動,我們必須要消抖才能正常使用。按鍵消抖的方式有兩種:硬件消抖和軟件消抖,這里采用的是軟件消抖的方式。抖動的時間一般不會超過20ms,我們可以利用單片機的定時器中斷函數,每隔20ms對按鍵進行一次掃描,按鍵掃描程序流程圖如下所示。
?
圖3-5 ?按鍵掃描流程圖
按鍵掃描的主要代碼如下。
void key_scan() {static unsigned char oldState,newState;//當前的按鍵狀態和之前的按鍵狀態 oldState=newState;newState=getKeyNum();if(newState==0&&oldState==1) KeyVal=1;if(newState==0&&oldState==2) KeyVal=2;if(newState==0&&oldState==3) KeyVal=3;if(newState==0&&oldState==4) KeyVal=4;if(newState==0&&oldState==5) KeyVal=5;if(newState==0&&oldState==6) KeyVal=6;if(newState==0&&oldState==7) KeyVal=7; }在通過按鍵掃描程序得到鍵值后,由主程序根據不同的鍵值調用不同的功能模塊。例如,按下第一個鍵(k1=0)進入時間設置模式、按下第二個鍵(k2=0)使秒鐘復位等等。按鍵處理的流程圖如下圖所示。
圖3-6 ?按鍵處理流程圖
按鍵處理的主要代碼如下所示。
if(keyNum==1){if(MODE==0)MODE=1; //選擇設置時間或者顯示時間else if(MODE==1){MODE=0;setTime();} //設置模式切換至顯示模式后重新設置時間}if(keyNum==6){unsigned char i;for(i=0;i<6;i++){_24C02_WriteByte(i,DS1302_Time[i]); //從第0號地址開始依次寫入時間數據Delay(5);}}if(keyNum==7){unsigned char i;for(i=0;i<6;i++){DS1302_Time[i]=_24C02_ReadByte(i); //依次讀取數據到表示時間的數組中setTime(); //重新設置時間}} switch(MODE){case 0: LCD_ShowTime();break;case 1: LCD_TimeSet();break;}在設置時間功能模塊需要對每一次設置的時間的合法性進行判斷,判斷的流程圖如下所示。
圖3-7 設置時間模塊流程圖
四、程序運行結果測試與分析
系統的總體原理圖如下所示,接下來分別對各個模塊進行測試。
圖4-1 總體原理圖
4.1 LCD1602功能測試
(1)顯示字符串。在第一行第一列開始顯示“zhou shuaige”,在第二行第一列開始顯示“yi choubi”。測試結果如下所示。
圖4-2 ?LCD1602顯示字符串測試
(2)顯示數字。在第一行第一列顯示數字5,顯示長度2;在第二行第一列顯示數字2,顯示長度3。測試結果如下所示。
圖4-3 ?LCD1602顯示數字測試
(3)顯示字符。在第一行第二列顯示‘a’,第二行第二列顯示‘b’,測試結果如下所示。
圖4-4 ?LCD1602顯示字符測試
4.2 DS1302功能測試
(1)設置時間。在程序中給DS1302設置一個的時間“20年01月01日00點00時00分00秒,星期三”,測試結果如下。
圖4-5 ?DS1302設置時間測試
(2)讀取時間。把DS1302中的數據讀取出來顯示在LCD1602上。測試結果如下。
圖4-6 ?DS1302讀取時間測試
4.3 24C02C功能測試
(1)寫入數據。把時鐘芯片中目前的時間寫入24C02C,暫停仿真后打開I2C Debug模塊,測試結果如下。
圖4-7 ?24C02C寫入數據測試
說明:DS1302的時間是“20年01月01號00是01分16秒,星期3”,所有的信息都儲存在24C02C芯片以0號地址開始的7個單元中(以十六進制存儲)。
(2)讀取數據。把上一步存儲的信息讀出來顯示在LCD1602上,測試結果如下。
圖4-8 ?24C02C讀取數據測試
4.4 調整時間功能測試
通過按鍵把時間設置成08:08:08,測試結果如下。
圖4-9 ?按鍵調整時間測試
總結
以上是生活随笔為你收集整理的基于51单片机的电子时钟的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 安全bios手册(5)
- 下一篇: 一文学会LCD12864显示中文、英文、