本篇講述了如何使用DSP去實(shí)現(xiàn)一個(gè)秒表功能。剛?cè)腴T(mén)DSP去做一些小的項(xiàng)目,可以很好的把一些知識(shí)綜合起來(lái),并且能夠快速熟悉開(kāi)發(fā)的環(huán)境,是一個(gè)非常好的選擇。本文采用開(kāi)發(fā)板型號(hào)為,編譯器CCS6.2。
任務(wù):利用數(shù)碼管實(shí)現(xiàn)秒表計(jì)時(shí),同時(shí)要求具有按鍵復(fù)位功能。
1. 總體思路
實(shí)現(xiàn)一個(gè)秒表,我們需要使用數(shù)碼管顯示數(shù)字;計(jì)時(shí)需要設(shè)計(jì)時(shí)長(zhǎng)1s的定時(shí)器中斷,每過(guò)一秒將觸發(fā)一次中斷使秒表+1;復(fù)位要設(shè)計(jì)按鍵key,同時(shí)與中斷結(jié)合,利用按鍵觸發(fā)外部中斷使秒表清零。因此可以看到,一個(gè)簡(jiǎn)單的秒表功能結(jié)合了 按鍵控制、外部中斷、定時(shí)器中斷、數(shù)碼管顯示這些功能。
2. 各功能設(shè)計(jì) 2.1 數(shù)碼管顯示
數(shù)碼管僅靠IO口驅(qū)動(dòng)是不行的,需要使用 芯片,原理圖如下。開(kāi)發(fā)板自帶的是4位數(shù)碼管,四個(gè)位選線原理圖如下,我們要讓哪一位顯示數(shù)字,只需要讓位選控制 IO 口XD輸出高電平,此時(shí)三極管導(dǎo)通,對(duì)應(yīng)的位選信號(hào)線SEG為低電平選通。
那么我們要控制哪幾個(gè)IO口進(jìn)行位選? 通過(guò)開(kāi)發(fā)板原理圖可以查到,數(shù)碼管的 4 個(gè)位選控制線由- 控制。
接下來(lái)在CCS中編寫(xiě)代碼,使用數(shù)碼管首先需要進(jìn)行初始化 ();初始化函數(shù)中首先使能 GPIO 時(shí)鐘,然后將數(shù)碼管相應(yīng)的控制 IO 配置為普通 IO 口模式、輸出方向、使能上拉等功能,不再贅述。
初始化完成如何在上面顯示時(shí)間?顯示函數(shù)的代碼如下。輸入為所要顯示的數(shù)字,這里和單片機(jī)原理是一樣的。smg.c中的函數(shù)如下:
在高速的for循環(huán)中循環(huán)顯示,利用視覺(jué)暫留讓人看到是4位同時(shí)顯示。DSP用到很多寄存器映射,實(shí)質(zhì)上是簡(jiǎn)化了操作。諸如上面那些大寫(xiě)字母的變量,實(shí)際上都是在.h的頭文件中進(jìn)行的宏定義數(shù)碼管秒表c語(yǔ)言程序,這些語(yǔ)句可以通過(guò)寄存器映射到對(duì)應(yīng)的芯片管腳對(duì)其進(jìn)行控制。
2.2 定時(shí)器中斷
能夠顯示數(shù)字后,怎樣進(jìn)行計(jì)時(shí)?上面講到要設(shè)計(jì)1s的定時(shí)器中斷,其原理是每計(jì)時(shí)1s就會(huì)觸發(fā)中斷,原有程序?qū)和^D(zhuǎn)而去執(zhí)行終端服務(wù)函數(shù)。在time.c文件中編寫(xiě)兩個(gè)函數(shù),首先初始化中斷:void (float Freq, float ) ,然后編寫(xiě)終端服務(wù)函數(shù): void (void)。
主函數(shù)中編寫(xiě)如下:
設(shè)置了全局變量n代表秒數(shù),每定時(shí)1s跳到中斷函數(shù)執(zhí)行n++,即可實(shí)現(xiàn)按秒遞增。想要按時(shí)分秒顯示只要進(jìn)行取60的余數(shù)或者商即可。
2.3 按鍵復(fù)位
按下key1出發(fā)外部中斷執(zhí)行清零,這里設(shè)計(jì)兩部分內(nèi)容:首先檢測(cè)按鍵按下數(shù)碼管秒表c語(yǔ)言程序,滿足條件就發(fā)生。中斷后執(zhí)行n清零操作。
首先應(yīng)初始化按鍵、外部中斷,在初始化函數(shù)中指定了key1出發(fā)XINT1中斷。
然后編寫(xiě)中斷函數(shù),檢測(cè)到key1按下后觸發(fā)清零。
主函數(shù)如下: