單片機程序結(jié)構(gòu)_第1頁
單片機程序結(jié)構(gòu)_第2頁
單片機程序結(jié)構(gòu)_第3頁
單片機程序結(jié)構(gòu)_第4頁
單片機程序結(jié)構(gòu)_第5頁
已閱讀5頁,還剩16頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、單片機程序結(jié)構(gòu)單片機程序結(jié)構(gòu)void main() sysinit(); moduleInit(); while(1) if(!ADTimer) ADTimer=500; 處理AD數(shù)據(jù); if(!KeyTimer) KeyTimer=10; 掃描按鍵; if(!LEDTimer) LEDTimer=2; 掃描LED; if(hp!=rp) 處理串行接口數(shù)據(jù); 單片機程序結(jié)構(gòu)void SysTick_Handler() if(ADTimer) ADTimer-; if(KeyTimer) KeyTimer-; if(LEDTimer) LEDTimer-;時間片輪詢法架構(gòu)1.設(shè)計一個結(jié)構(gòu)體:/

2、任務(wù)結(jié)構(gòu)typedef struct _TASK_COMPONENTS uint8 Run; / 程序運行標記:0-不運行,1運行 uint8 Timer; / 計時器 uint8 ItvTime; / 任務(wù)運行間隔時間 void (*TaskHook)(void); / 要運行的任務(wù)函數(shù) TASK_COMPONENTS; 時間片輪詢法架構(gòu)2. 任務(wù)運行標志出來,此函數(shù)就相當于中斷服務(wù)函數(shù),需要在定時器的中斷服務(wù)函數(shù)中調(diào)用此函數(shù),這里獨立出來,并于移植和理解。voidTaskRemarks(void) uint8 i; for (i=0; iTask_Max;i+)/逐個任務(wù)時間處理 if (

3、TaskCompsi.Timer) / 時間不為0 TaskCompsi.Timer-; / 減去一個節(jié)拍 if (TaskCompsi.Timer = 0) / 時間減完了 TaskCompsi.Timer = TaskCompsi.ItvTime; / 恢復計時器值 TaskCompsi.Run = 1; / 任務(wù)可以運行 時間片輪詢法架構(gòu)3. 任務(wù)處理,主程序中調(diào)用voidTaskProcess(void) uint8 i; for (i=0; iTASKS_MAX; i+) /逐個任務(wù)時間處理 if (TaskCompsi.Run) / 時間不為0 TaskCompsi.TaskHoo

4、k(); / 運行任務(wù) TaskCompsi.Run = 0; / 標志清0 時間片輪詢法架構(gòu)4. 應(yīng)用建立任務(wù)static TASK_COMPONENTS TaskComps = 0, 1000, 1000, TaskDisplayClock, / 顯示時鐘 0, 10, 10, TaskKeyScan, / 按鍵掃描 0, 5, 5, TaskLedScan, / 動態(tài)刷新LED / 可以繼續(xù)添加任務(wù)。; 時間片輪詢法架構(gòu)4. 應(yīng)用編寫各個任務(wù)函數(shù)void TaskDisplayClock() void TaskKeySan() void TaskLedScan() 時間片輪詢法架構(gòu)4.

5、應(yīng)用編寫主函數(shù)void main(void) InitSys(); / 初始化 while (1) TaskProcess(); / 任務(wù)處理 按鍵掃描程序unsigned char read_key(void) unsigned char key_press; /按鍵是否被按下 unsigned char key_return = 0; /按鍵返回值 key_press = key_sr1; / 讀按鍵I/O電? if(!key_press) delay(10); key_press = key_sr1; / 讀按鍵I/O電? if(!key_press) key_return = 1; 狀

6、態(tài)機按鍵掃描程序按鍵初始狀態(tài)按鍵按下狀態(tài)按鍵釋放狀態(tài)I/O口低電平I/O口高電平I/O口高電平I/O口低電平I/O口低電平I/O口高電平執(zhí)行按鍵動作按鍵掃描程序/*名 稱:狀態(tài)機按鍵掃描功 能:運用狀態(tài)機思想,實現(xiàn)按下按鍵LED點亮,再按一下LED燈熄滅。作 者:創(chuàng)建時間:2014年12月14日修改時間:備 注:*/#include /頭文件#includeKey_State.h /按鍵掃描頭文件 sbit Led = P07; /LED燈輸出unsigned char Key_Number = 0; /按鍵值 按鍵掃描程序/*函數(shù)名稱:主程序功 能:程序執(zhí)行的入口返 回 值:無時 間:201

7、4-12-14 備 注:*/void main() while(1) if(!Key_Timer) Key_Timer=10; /在定時器內(nèi)每1Ms增1 Key_Number = read_key(); /按鍵掃描函數(shù),取得按鍵值,10MS調(diào)用一次 if(Key_Number = 1) /按鍵返回值是1 Led = Led; /LED燈取反 按鍵掃描程序Key_State.c#include sbit key_sr1 = P16; / 按鍵輸入口 #define key_state_0 0 /按鍵的初始狀態(tài)#define key_state_1 1 /按鍵按下的狀態(tài)#define key_st

8、ate_2 2 /按鍵釋放的狀態(tài)按鍵掃描程序 /*函數(shù)名稱:按鍵掃描程序功 能:檢測按鍵,并返回按鍵值返 回 值:key_press時 間:2014-12-14 備 注:*/unsigned char read_key(void) static char key_state = 0; /按鍵的狀態(tài) unsigned char key_press; /按鍵是否被按下 unsigned char key_return = 0; /按鍵返回值 key_press = key_sr1; / 讀按鍵I/O電? switch (key_state) return key_return; /返回按鍵值按鍵掃

9、描程序 switch (key_state) case key_state_0: / 按鍵初始態(tài) break; case key_state_1: / 按鍵確認態(tài) break; case key_state_2: /按鍵釋放的狀態(tài) break; 按鍵掃描程序 case key_state_0: / 按鍵初始態(tài) if (!key_press) key_state = key_state_1;/ 鍵被按下,狀態(tài)轉(zhuǎn)換到鍵確認態(tài) break; case key_state_1: / 按鍵確認態(tài) if (!key_press) key_return = 1; / 按鍵仍按下,按鍵確認輸出為“1” key_state = key_state_2;/

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論