中圖分類號:TH714 文獻標(biāo)志碼:A 文章編號:2095-2945(2025)14-0142-05
Abstract:This paper mainly expounds the design principlesanddesign ideas of anelectronicclock based on STM32.The designprinciplemainlyintroducesthehardwarepart,includingtheRTCfunctionmodule,LCDscreendisplayprinciple,key workingprinciple,andtimer module.Thenitexpoundstheprogramdesignideaofanelectronicclockwithcountdownfunction, including thedesignofatimetiming module,atimedisplaymoduleandabutonmodule.Theexperimentalresultsof this scheme showthattheclock designedinthisscheme hasthefunctionof displaying themonth,month,hour,minuteandscond, andcounting down,andcanbeabletopressthebutontomodifythetimeandmodifythecountdowntime.Theplanis feasible,effective,easy to operate,and can meet people's daily life needs.
Keywords:STM32;clock;countdown;RTC;buttons
在日常生活中,時間對于每個人都非常重要,因此時鐘在人們生活中扮演著十分重要的角色。如今,時鐘的款式各種各樣,而電子鐘有著不可替代的地位,電子鐘具有精準(zhǔn)、美觀、成本低廉和調(diào)時方便等優(yōu)點。本文設(shè)計的電子鐘除了能夠顯示時分秒,還具備萬年歷功能和倒計時功能,同時能夠通過按鍵修改時間和倒計時。外觀設(shè)計較為美觀,能夠滿足人們的生活需求。
1 設(shè)計原理
1.1RTC功能模塊工作原理
RTC(實時時鐘)模塊主要用于設(shè)置時間、計算時間、獲取當(dāng)前時間。該模塊處于系統(tǒng)的后備區(qū)域,后備區(qū)域是獨立供電的,這樣即使設(shè)備斷電,只要后備區(qū)域正常供電,時鐘便能正常運行。一般情況下,后備區(qū)域是不允許訪問的,防止對時鐘的意外操作,起到對時鐘的保護作用。同時后備區(qū)域可以被寫入編號,這樣程序在運行時,如果是同一個編號,則不用重復(fù)
初始化。
RTC模塊主要由預(yù)分頻器和計數(shù)器組成。雖然內(nèi)部低速時鐘、外部低速時鐘和外部高速時鐘都可作為RTC的時鐘源,但為了精準(zhǔn)、低功耗,一般采用外部低速時鐘作為RTC模塊的時鐘源,該時鐘源經(jīng)過預(yù)分頻器分頻以后,一般得到一個頻率為 1Hz 的計數(shù)頻率,這意味著計數(shù)器每1s計數(shù)1次。在顯示當(dāng)前時間時,將計數(shù)器內(nèi)的總秒數(shù)換算成時間,便實現(xiàn)了RTC計時功能。在設(shè)置時間時,則需要將設(shè)置時間換算成秒數(shù),存儲在計數(shù)器里。
RTC模塊還具有2個中斷源:秒中斷源和鬧鐘中斷源。在中斷開啟的情況下,秒中斷源是指每1s產(chǎn)生1次中斷,鬧鐘中斷源是指當(dāng)鬧鐘寄存器與計數(shù)器的值相等時產(chǎn)生1次中斷,產(chǎn)生的中斷交由NVIC(嵌套向量中斷控制器)處理。
1.2LCD屏幕顯示原理
LCD屏具有亮度高、對比度好、顏色鮮艷等特點,被廣泛地應(yīng)用于各種電子產(chǎn)品。本文采用的是2.8寸LCD模塊,分辨率為 240×320 ,驅(qū)動芯片為ILI9341,是16位真彩顯示。電路圖如圖1所示。
其中,LCD_CS為片選信號;LCD_WR為寫信號,用于向LCD屏寫數(shù)據(jù);LCD_RD為讀信號,用于讀數(shù)據(jù);LCD_RS為命令/數(shù)據(jù)標(biāo)志信號,該位為0時用于設(shè)置命令,為1時用于傳輸數(shù)據(jù);LCD_D[0:15]為雙向數(shù)據(jù)線,用于傳輸命令和數(shù)據(jù)。
TFT_2.8 LCD TFTLCD LCD WR 1 LRDCLS RS 24 LCD_RS OELD LCD D1 5號 RST DB1 08 LCD-D2 H2X1 LCDD3 9 DB4 DBS 10 LCD_D4 12 LCDDS LCD D7 1 B B D12 12 14 LCD_D6 LCDD10C30 cVcc3.3 LCB B13 最 DB13 DB14 1820 LCDDi4104 104 LCB BLS VCC3.3 223 25 DB15 BL VDD3.3 DB16 26 224 VCC3.3 VDD3.3 GND 27 GND BL_VDD 28 VCC5 TMISO 29 30 TMOSI C32 MISO MOSI GND T CS 313 T_PEN T_CS CLK Mo 34 TSCK 104 GND TFTLCD
1.3 按鍵工作原理
本文設(shè)計方案使用KEYO、KEY1和WK_UP按鍵來實現(xiàn)時鐘調(diào)整功能,其中WK_UP按鍵作為功能選擇鍵,用于選擇倒計時時間、分鐘、時鐘、日期、月份和年份,KEYO和KEY1按鍵分別作為時間數(shù)值的“ °+ ”和“-”調(diào)整鍵。按鍵電路原理圖如圖2所示,KEYO、KEY1按鍵按下時,對應(yīng)引腳為低電平;WK_UP按鍵按下時,對應(yīng)引腳為高電平。因此,通過讀取按鍵對應(yīng)的引腳電平值便能夠判斷按鍵是否按下[4]。
KEY KEYO 88Y0 WK_UP KEY4 VCC3.3188WRUP KEY1 KEY4 88Y1 KEY4 N
2基于STM32的數(shù)字時鐘的設(shè)計
2.1 時間計時模塊設(shè)計
時間計時模塊主要用于時鐘的計時,程序流程圖如圖3所示。在設(shè)計時首先需要對相關(guān)模塊進行初始化,包括RTC模塊初始化,中斷初始化。
初始化完成后,設(shè)置初始時間,這里需要把當(dāng)前的初始時間轉(zhuǎn)換為秒數(shù),將秒數(shù)存入RTC計數(shù)器模塊,然后退出配置模式。初始時間設(shè)置完成后,需要對時間進行更新,每1s產(chǎn)生1次中斷,將存放在RTC計數(shù)模塊中的值提取出來,換算成具體時間,存放在變量年(calendar.w_year)、月(calendar.w_month)、日(calendar.w_date)、時(calendar.hour)、分(calendar.min)、秒(calendar.sec)和星期(calendar.week)中。
1.4定時器模塊
圖1LCD電路圖
圖2按鍵電路圖
圖3時間計時模塊程序流程圖
定時器模塊主要用于實現(xiàn)倒計時功能。在STM32中,定時器包括基本定時器、通用定時器和高級定時器。本文使用通用定時器來實現(xiàn)倒計時功能。定時器是由一個通過可編程預(yù)分頻器(PSC)一個帶有自動重裝載(ARR)的16位累加計數(shù)器(CNT)組成。計數(shù)方式有向上計數(shù)模式、向下計數(shù)模式、向上/向下計數(shù)模式。本文采用的是向上計數(shù)模式,即定時器開始工作后便開始從0計數(shù)到自動重裝載值,然后產(chǎn)生一次溢出事件。由于每次計數(shù)的時間是確定的,由此便可設(shè)計出定時時間。通過定時器的這個工作原理實現(xiàn)倒計時功能。
2.2 時間顯示模塊設(shè)計
時間顯示模塊主要用于將時間顯示在LCD屏上。首先LCD屏進行初始化,LCD屏在顯示時無法直接顯示數(shù)字,需要將數(shù)字轉(zhuǎn)換成字符。因此設(shè)置一個字符類型數(shù)組time[來存放時間。再調(diào)用字符串顯示函數(shù)DrawZf_N。具體程序如下:
char time[]=\"2024-08-10 10:20:30\";
time[O]=calendar.w_year/1000+0';
time[1]=calendar.w_year%1000/100+O';
time[2]=calendar.w_year%100/10+0';
time[3]=calendar.w_year%10+0';
time[5]=calendar.w_month/10+0';
time[6]=calendar.w_month%10+0'; time[8]=calendar.w_date/10+0';
time[9]=calendar.w_date%10+0';
time[11]=calendar.hour/10+0';
time[12]=calendar.hour%10+0';
time[14]=calendar.min/10+O';
time[15]=calendar.min%10+ 0';
time[17]=calendar.sec/10+0;
time[18]=calendar.sec%10+0';
DrawZf_N(xO,yO,color,backcolor,time);
2.3按鍵模塊設(shè)計
按鍵模塊主要用于修改時間。根據(jù)按鍵電路圖圖2所示,對按鍵進行初始化時,WK_UP按鍵作為選擇鍵,工作方式設(shè)為下拉輸入模式,KEYO和KEY1按鍵作為時間設(shè)置按鍵,工作方式設(shè)為上拉輸入模式。當(dāng)WK_UP按鍵按下,對應(yīng)的外部中斷發(fā)生,設(shè)變量Key_State作為選擇標(biāo)記量,按鍵每按一次,變量Key_State加1,變量Key_State為1時,表示選擇倒計時模塊;變量Key_State為2時,選擇分鐘;變量Key_State為3時,選擇小時;變量Key_State為4時,選擇日期;變量Key_State為5時,選擇月份;變量Key_State為6時,選擇年份。KEYO和KEY1按鍵分別用于對選擇的時間作“ + ”\"-”。按鍵修改時間的程序流程圖如圖4所示。
3基于STM32的時鐘的實現(xiàn)
3.1 初始界面
初始界面包含數(shù)字鐘、倒計時模塊。如圖5所示,LCD屏上方顯示的是時間,包含了年月日、時分秒、星期,LCD屏下方顯示的是倒計時功能部分。
3.2 倒計時時間設(shè)置
按下功能選擇鍵WK_UP第1次,進入倒計時功能選擇界面,倒計時初始時間為 10s ,如圖6所示。當(dāng)?shù)褂嫊r時間字體變?yōu)閹П尘吧募t色字體時,按下KEYO按鍵對倒計時時間 +1 ,按下KEY1按鍵對倒計時時間-1,如圖7所示,倒數(shù)計時修改后為 12s 。
3.3 時間設(shè)置
功能選擇界面,如圖8所示。當(dāng)?shù)褂嫊r時間字體變?yōu)閹П尘吧募t色字體時,按下KEYO按鍵對分鐘 +1 按下KEY1按鍵對分鐘-1,如圖9所示,分鐘由15修改為 10
按下功能選擇鍵WK_UP第2次,進入分鐘時間計時結(jié)束,屏幕上顯示“GO!”,倒計時模塊停止工作,如圖17所示。
同理,按下功能選擇鍵WK_UP第3次,進入小時時間功能選擇界面,如圖10所示。對小時時間進行調(diào)整,調(diào)整后的界面如圖11所示,時鐘由10修改為12。
圖14年份設(shè)置
圖16倒計時開始
圖11 時鐘修改后界面
圖17倒計時結(jié)束
繼續(xù)按下功能選擇鍵WK_UP,分別進入日期、月份、年份功能選擇界面,如圖12、13、14所示。圖15為年份設(shè)置后的效果界面。
3.4倒計時模塊的實現(xiàn)
最后一次按下功能選擇鍵WK_UP,時間設(shè)置完成,時間模塊正常運行,同時,倒計時開始,如圖16所示,屏幕上會顯示“Ready”。當(dāng)?shù)褂嫊r時間為0時,倒
4結(jié)束語
本文是基于STM32的具備倒計時功能的數(shù)字鐘的設(shè)計與實現(xiàn),介紹了RTC模塊、LCD模塊、按鍵模塊和定時器的工作原理,以及時間計時、時間顯示和按鍵調(diào)時的程序設(shè)計思路。實現(xiàn)了顯示時間,包括年月日和時分秒的功能,同時具備倒計時功能,能夠通過按鍵修改時間和倒計時的功能,且系統(tǒng)穩(wěn)定,從實驗結(jié)果看出效果較好,方案具有一定實用性。
(下轉(zhuǎn)149頁)