freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內容

基于dsp微控制器定時器設計-資料下載頁

2024-08-29 12:04本頁面

【導讀】隨著時代的進步,電子行業(yè)的發(fā)展,定時器的應用也越來越廣泛。電機進行驅動的。這種定時器精度不高,定時誤差較大。相對于前兩種定時器,整方便、適于頻繁使用。本次設計的題目是基于DSP微控制器定時器設計。利用內部定時器0和PIE外設中。斷擴展模塊產生定時中斷,并進行逆行計數。通過SPI串行外設接口在DSP和。74HC164之間進行通信,進而實現在數碼管上通過動態(tài)掃描顯示定時時間。統(tǒng)通過矩陣鍵盤控制定時器開啟和暫停。新輸入定時初值。當定時結束時,還會通過LED燈閃爍報警,提示定時結束。

  

【正文】 三個參數就是設定定時器的計數周期,單位為 微秒 ,本程序希望定時時間為 一秒 ,所以此處寫 1000000。至此,定時器設置完畢。 打開定時器 開定時器的語句如下所示: 圖 35 定時器 0 控制寄存器情況圖 開定時器的語句如下所示: 第 23 頁 = 0x4011。 向 TCR 寄存器的 4 位 TSS 寫 1 即為開啟定時器 開中斷 cpu 的中斷使能位,因為看門狗和定時器 0 的中斷都通過 INT1 傳輸給 cpu,故需要將 IER 的第 0 位置 1 ,程序如下 IER |= M_INT1。 其中在工程中的 文件中,定義: define M_INT1 0x0001 PIE 中相應的中斷使能位。如上文所示,定時器 0 和看門狗的中斷分別位于 PIE(1,7)和 PIE(1,8),故需要把 PIE 中的這兩個位置 1。程序如下: = 1。 = 1。 這兩行語句分別表示打開定時器 0 和看門狗的中 斷。 cpu 的總中斷 INTM。如前文所述,只有 cpu 的總中斷被使能,其他外設的中斷才能被傳輸到 cpu 內,如果 INTM 未被使能,那么,無論什么外設的中斷,都沒有辦法傳輸到 cpu 內部。打開總中斷語句如下 EINT。 開啟看門狗 開啟看門狗需要對看門狗的工作控制寄存器進行配置。程序如下 = 0x002c。 主要功能的實現 定時器中斷子程序的設計 本程序使用的是 DSP 微控制器中的內部定時器 0。如上文所述,程序組配置定時器 0 的定時周期為 1 秒,也就是說每隔 1 秒定時器 0 就會產生一個中斷,主程序就 會 響應這個中斷從而進入定時器 0的中斷服務子程序執(zhí)行相應的語句。 本系統(tǒng)能夠實現最多 100 分鐘 的定時功能,進入定時器 0 中斷服務子程序后就會對當前所剩的時間進行計算和更改,定時器 0 中斷服務子程序的大致功能是:進入中斷服務子程序之后,如果定時器分鐘位和秒位均不為零,則秒位 第 24 頁 ( Second)減一;如果秒位為零但是分鐘不為零,則將秒位賦值為 59,分鐘位減一;如果秒位和分鐘位都為零,則代表定時結束,分鐘位和秒位都為零不動。相關程序如下: if(Second!=00) { Second。 } Else if(Second==00amp。amp。Minute!=00) { Second=59。 Minute。 } else if(Second==00amp。amp。Minute==00) { Second=0。 } = PIEACK_GROUP1。 圖 36 定時器中斷子程序流程圖 SPI 通信與數碼管顯示程序的設計 由硬件部分所述,本程序所用的 4 個七段數碼管的段選端一同連接到74HC164 串 行輸入并行輸出芯片的輸出端,故需要先用 DSP 的串行外設通信 第 25 頁 SPI 進行 DSP 和 74HC164 之間的通信,從而將數碼管所需要的段碼傳輸給74HC164 芯片,再通過 74HC164 并行輸出給數碼管。 通信功能的實現 由硬件部分所述, SPI 通信的數據傳輸是在主機 DSP 微控制器和從機74HC164 的移位寄存器之間實現的,在對 SPI 進行了初始化并設置好極性和相位之后,主機和從機之間的通信是隨著 SPI 的時鐘信號自動進行的,軟件部分只需要將需要進行通信的數據寫入主機的寫入串行輸出緩沖寄存器( SPITXBUF)即可 [14][15]。具體程序如下: void SPI_xmit(Uint16 a) { =a。 } 函數 SPI_xmit 即為將通信數據寫入輸出緩沖寄存器進行發(fā)送。 圖 37 數字拆分示意圖 為了清晰直觀的顯示出定時器的計時狀態(tài),本系統(tǒng)設置了四個七段數碼管對時間進行顯示。隨著程序的運行,定時器所剩的的時間逐漸減少,四個數碼管上的數字就會顯示出這種狀態(tài)。 四個數碼管分為兩個部分,左邊的兩位定義為分鐘,顯示當前還剩余多少分鐘,右邊的兩位定 義為秒,顯示還剩多少秒。本系統(tǒng)的最大定時時間即為 99分 59 秒。 第 26 頁 由于采用了四個數碼管,要采用動態(tài)掃描的方式點亮數碼管,在程序中需要將分鐘的十位和個位拆開,還需要將秒的十位與個位也拆開,這樣才能在動態(tài)掃描時對不同的數碼管賦予不同的數值,從而達到顯示時間的目的。具體的實現方法和程序如下: void Second_Trans(Uint16 data) { Second_Bit[1]=data/10。 Second_Bit[0]=data%10。 } void Minute_Trans(Uint16 data) { Minute_Bit[1]=data/10。 Minute_Bit[0]=data%10。 } void DisData_Send() { DisData_Bit[3] = Minute_Bit[1]。 DisData_Bit[2] = Minute_Bit[0]。 DisData_Bit[1] = Second_Bit[1]。 DisData_Bit[0] = Second_Bit[0]。 } 先通過除法和取余運算將分鐘和秒的個位 與十位分開,放置于數組中;再將這四位數字存入一個具有四個元素的一維數組 DisData_Bit 中,在 DSP 與74HC164 進行通信時均是通過這個數組選取數碼管需要的段碼從而進行通信的。 眾所周知,動態(tài)掃描方式是通過不間斷循環(huán)點亮的方法對若干個數碼管進行點亮,由于人眼存在視覺暫留和數碼管的余暉效應,人通過肉眼看到的效果是幾個數碼管一起點亮的。 矩陣鍵盤程序設計 為了通過鍵盤控制定時器,本系統(tǒng)設置了矩陣鍵盤。矩陣鍵盤是十六個按鍵排列成為 4X4 的矩陣,通過行掃描和列掃描就能獲取鍵值。 按鍵識別 的大致流程是:硬件電路四個列是輸出,默認是低電平,四個行是輸入,默認是高電平。當有鍵按下時,哪個輸入是低電平,就是哪個行有鍵按下。然后通過依次使四個列的輸出變?yōu)楦唠娖剑茨膫€列變?yōu)楦唠娖綍r,行輸入又變?yōu)楦唠娖侥前存I的位置就在哪個列,這樣一來,按鍵的位置就被確定了。 第 27 頁 由于四個行默認的輸入是高電平,所以沒有鍵按下時,輸入一直是高電平。假設第 a 行 b 列的按鍵按下,那么第 a 行的輸入就變?yōu)榈碗娖?,說明按鍵在第 a行。但是,由于按鍵按下時都會存在抖動,矩陣鍵盤沒有硬件去抖電路,因此就需要通過軟件完成去抖功能。 按鍵去抖的過程是:在有鍵按下時,程序雖然檢測到有鍵按下但是并不立即對其做出響應,而是進行延時,當延時 5~10 毫秒后,再次檢測,若此時按鍵仍為按下狀態(tài),則視為有按鍵按下,程序才會對按鍵進行響應執(zhí)行響應的功能。行識別的核心代碼如下: void Read_KX(Uint16 x) { KX_AllStatus()。 if(KX_Status[x] == 0) { KX_Tim[x]++。 if(KX_Tim[x] = 3000) { KX_On = x。 KX_Tim[1]=0。 KX_Tim[2]=0。 KX_Tim[3]=0。 KX_Tim[4]=0。 } } } 由程序可知,對按鍵的某行進行識別時,會判斷行的輸入是否為低電平,如果為低,還要進行延時,當數組 KX_Tim 中的值大于 3000 時才會判定有鍵按下從而確定按鍵所屬的行。 列的識別是通過列掃描函數來實現的。只有當按鍵按下后,按鍵的行被確定后,列掃描函數才中的語句才會被執(zhí)行,如果按鍵的行位置都沒有被確定,也就是數按鍵的行標 KX_On 仍然為零,那么即使運行列掃描函數,其中的語 句也不會被執(zhí)行,即此時函數什么功能也不執(zhí)行。由于按鍵的行確定后,按鍵所在的第 a 行的輸入就變?yōu)榈碗娖?,這時要想識別出按鍵所在的列,就要依次改變鍵盤列的輸出。先將第一列的輸出變?yōu)楦唠娖?,然后讀取 a 行的輸入,若不為高電平則說明按鍵不在這一列,以此類推將剩下三列也進行如下操作,若將第 b 列變?yōu)楦唠娖胶螅?a 行的輸入也變?yōu)楦?,就說明按鍵在 b 行。相應的程序如 第 28 頁 下: void Read_KY(Uint16 x) { int j=0。 if(!KX_Status[KX_On] amp。amp。 KX_On) { Set_KY(x)。 delay(200)。 KX_AllStatus()。 if(KX_Status[KX_On]) { KY_On = x。 Key = Keys[KX_On1][KY_On1]。 if(Key==15||Key==16) {Fun=Key。} KY_On = 0。 KX_On = 0。 if(Key!=15amp。amp。Key!=16) { Key_Bit[i] = Key。 i。 if(i==1) {i=3。} } for(j=0。j4。j++) { if(Key_Bit[j]!=10) {DisData_Bit[j]=Key_Bit[j]。} else {DisData_Bit[j]=0。} } } Rst_KY(x)。 } } 如程序所示,當檢測出按鍵后,還要判別按下的按鍵的鍵值從而程序做出不同的響應。如果鍵值為 15 或者 16,則判定為功能鍵,其功能分別為開啟定時器和關閉定時器。如果鍵值為 0~9,則為數字鍵,用來更改定時的時間,其數值會賦給 DisData 數組并推出計時 初值重新計時。 第 29 頁 核心功能的設計 當程序開始運行后,定時器默認為關閉狀態(tài),數碼管不顯示任何數值。若按下 “開始”鍵(鍵值 15),則開啟定時器,開始定時,同時 SPI 會將時間數據傳送給數碼管進行時間顯示,在數碼管上可以看到定時的時間一秒一秒的減少。若此時按下暫停鍵(鍵值 16),則關閉定時器,定時暫停 , 數碼管上 會 顯示“ ”的圖案,而所剩的定時時間仍然保存在數字顯示數組 Dis_Data 中不變,除非用戶在暫停期間通過鍵盤改變時間,否則所剩的定時時間會一直鎖存在顯示數組中,此時如果重新按下“開始”鍵(鍵值 15),則定時器將從暫停之前的時間處繼續(xù)開始計時;但是如果用戶在計時暫停期間通過矩陣鍵盤對定時的時間進行重新設置,那么定時器暫停之前所剩的時間就會被用戶通過鍵盤更新,其按下的第一個鍵代表分鐘的高位,第二個鍵代表分鐘的個位,按下的第三個鍵代表秒的高位,第二個鍵代表秒的個位,重新設置的時間將會被存入時間顯示數組顯示在數碼管上,同時程序會逆推出定時初值,此時再重新按下 15 鍵,則定時器按照用戶設定的時間開始計時。 圖 38 倒計時效果圖 第 30 頁 圖 39 暫停定時效果圖 圖 310 定時結束報警效果圖 如果重新 設置時間時只輸入了分鐘位 ,而沒有輸入秒, 則程序會自動將秒設置為零 。例如:用戶在剩余 1 分 20 秒時按下“暫?!?,然后選擇重新設置時間,但是只輸入了前兩位,即將分鐘設置為 30 分鐘,而沒有設置秒。此時若用戶按下“開始”,則用戶會從 30 分 00 秒處開始定時,其 秒位 就是 系統(tǒng)自動設置的 。 第 31 頁 圖 311 定時功能流程圖 若用戶設置秒時出現誤操作,如將秒設置為 99 等大于 60 的數字。則系統(tǒng)會自動將秒重置為 60。 程序逆推初值公式如下: 分鐘初值 =分鐘十位 10+分鐘個位 ( 31) 秒初值 =秒 十位 10+秒個位 ( 32) 當定時時間到時,程序中的分鐘位和秒都會歸零,數碼管的顯示也為零,此時數碼管會亮起,起到報警的作用。 相關程序如下: if(Fun==15) { = 0x4001。 Second_Trans(Second)。 第 32 頁 Minute_Trans(Minute)。 DisData_Send()。 for(Loop=0。Loop4。Loop++) //分別顯示四位 { scan()。 Sellect_Bit(Loop)。 //選擇要掃描的數碼管位 SPI_xmit(msg[DisData_Bit[Loop]])。 //串行輸出要顯示的數字 delay(10000)。 } Key_Bit[0]=10。 Key_Bit[1]=10。 Key_Bit[2]=10。 Key_Bit[3]=10。 i=3。 } else if(Fun==16) { = 0x4011。 //定時器關閉 for(Loop=0。Loop4。Loop++)
點擊復制文檔內容
畢業(yè)設計相關推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號-1