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

正文內(nèi)容

基于51單片機(jī)和cpld試驗(yàn)開發(fā)板的設(shè)計(jì)(編輯修改稿)

2025-07-20 15:40 本頁面
 

【文章內(nèi)容簡(jiǎn)介】 :35 AL07:00】 三鍵輸入:模式設(shè)定 set,加一 up,減一 down。 按鍵操作:長(zhǎng)按 set 鍵進(jìn)入時(shí)間設(shè)定模式,在進(jìn)入設(shè)定模式以前,隨意短按任意鍵,不產(chǎn)生任何作用, 保證時(shí)間不被隨便修改;同一鍵短按鍵選擇設(shè)定對(duì)象;加減鍵長(zhǎng)按直接退出設(shè)定模式。進(jìn)入設(shè)定模式后, 長(zhǎng)時(shí)間 10s 不按鍵,自動(dòng)退出按鍵模式;以上所有的操作時(shí)鐘正常走鐘。聲音提示:所有按鍵操作伴隨聲音提示,長(zhǎng)短按鍵有不同的提示聲,按鍵手感好。 鬧鐘設(shè)置:鬧鐘設(shè)置信息寫入 DS1302 芯片的暫存 RAM,保證主電源掉電數(shù)據(jù)不丟失;鬧鐘精確到分鐘;鬧鐘可禁用,并有顯示提示;鬧鐘鬧鈴時(shí),任意按鍵結(jié)束鬧鈴。 多任務(wù)程序架構(gòu) 為了程序移植性好,維護(hù)性好,易裁剪,我們有必要引入多任務(wù)編程思想,就是一個(gè)系統(tǒng)由多個(gè)任務(wù) 構(gòu)成,各任務(wù)之間相對(duì)獨(dú)立。我在這里提出一種基于定時(shí)器中斷的多任務(wù)輪循程序架構(gòu),如圖 (a)所示。在 主程序中,根據(jù)任務(wù)延時(shí)量判斷任務(wù)是否就緒,各任務(wù)輪循占用 CPU,由任務(wù)延時(shí)量控制任務(wù)執(zhí)行頻度及 CPU 關(guān)照度,而任務(wù)延時(shí)量又由定時(shí)器中斷控制。 關(guān)于任務(wù)實(shí)時(shí)性的理解:從人機(jī)交互角度考慮,很多任務(wù)實(shí)時(shí)性要求是相對(duì)的,例如 LCD 顯示刷新, 就不需要很快的刷新頻度,即使被顯示的內(nèi)容更新足夠快,LCD 顯示刷新也不需要很快,因?yàn)?LCD 顯示 是給人看的,如果每秒刷新 20 次,已經(jīng)足夠了,這里結(jié)合數(shù)字鐘顯示任務(wù),每秒 3 次就可以達(dá)到要求了; 又如按鍵掃描,掃描執(zhí)行頻度則不能太慢,太慢容易丟失有效鍵值,至少每秒應(yīng)保持 50 次以上的執(zhí)行頻 度才行;同樣 DS1302 實(shí)時(shí)時(shí)鐘讀取頻度,每秒 3 次就可以了。不同任務(wù),需要不同的執(zhí)行頻度(CPU 關(guān)照度),如果采用傳統(tǒng)大循環(huán)模式,各任務(wù)按一個(gè)頻度運(yùn)行,顯然不適合本設(shè)計(jì)。這里還涉及到多種延時(shí)需要,例如按鍵去抖動(dòng)、蜂鳴器發(fā)聲等,如果采用傳統(tǒng) 循環(huán)延時(shí)法,不僅極大浪費(fèi) CPU 資源,而且造成不同任務(wù)之間相互影響,很難找到一個(gè)平衡點(diǎn),特別不利于程序維護(hù),我們形象稱這種程序?yàn)槊鏃l程序。(a) 定時(shí)中斷的多任務(wù)輪循程序架構(gòu)流程圖 基于定時(shí)器中斷的多任務(wù)輪循架構(gòu),各子任務(wù)必須設(shè)計(jì)成主動(dòng)放棄 CPU 運(yùn)行模式,子任務(wù)不能設(shè)計(jì) 成死循環(huán)流程,子任務(wù)的執(zhí)行依靠主程序任務(wù)調(diào)度來實(shí)現(xiàn)。正因?yàn)楦魅蝿?wù)不搶占 CPU,所以程序設(shè)計(jì)不用 考慮現(xiàn)場(chǎng)保護(hù)問題,簡(jiǎn)化了程序設(shè)計(jì)。(b) 所示,定時(shí)器固定節(jié)拍中斷,該節(jié)拍需 滿足最快任務(wù)執(zhí)行頻度需要,例如 50Hz,對(duì)于按鍵掃描程序,每秒按 50 次頻度執(zhí)行即可,而 LCD1602 可以按每秒 3 次頻度執(zhí)行,實(shí)時(shí)時(shí)鐘數(shù)據(jù)讀取也只需按每秒 3 次頻度執(zhí)行一次。(b) Mini51 板實(shí)時(shí)時(shí)鐘流程圖 任務(wù)執(zhí)行頻度由任務(wù)延時(shí)量 task_delay[ID]控制,各任務(wù)延時(shí)量在定時(shí)中斷中減一,直到延時(shí)量為零, 相關(guān)相關(guān)任務(wù)就緒。務(wù)調(diào)度過程就是對(duì)任務(wù)延時(shí)量檢測(cè)過程,只有任務(wù)延時(shí)量為零時(shí),CPU 從其它任務(wù)中 返回后立即執(zhí)行相應(yīng)的任務(wù),由于不同任務(wù)延時(shí)量不同,從而實(shí)現(xiàn)不同任務(wù)具有不同的執(zhí)行頻度而相互不受影響。這里還必須滿足一個(gè)條件,就是每個(gè)任務(wù)執(zhí)行一次的時(shí)間不能太長(zhǎng)超過一次定時(shí)中斷時(shí)間,否則 任務(wù)之間執(zhí)行頻度會(huì)有影響,對(duì)于 50Hz 的中斷頻率,每個(gè)任務(wù)執(zhí)行時(shí)間最好不超過 20ms,既 CPU 光顧 一次任務(wù)時(shí)間要在 20ms 以內(nèi),這樣就可以保證任務(wù)之間相互完全不受影響。 定時(shí)中斷在這里就是心臟,依靠定時(shí)中斷完成任務(wù)延時(shí)量的修改,從而實(shí)現(xiàn)不同任務(wù)運(yùn)行頻度控制。 定時(shí)器設(shè)置及初始化代碼如下:define TIME_PER_SEC 50 //定義定時(shí)中斷頻度,由執(zhí)行頻度要求最快的任務(wù)確定,太高會(huì)降低CPU 運(yùn)行效率,太低任務(wù)頻度不好分配,一般 200Hz 以下,這里采用 50Hz。 define CLOCK 22118400 //定義時(shí)鐘晶振,單位 Hz,與硬件一致即可void OS_Init_Timer0(void) //定時(shí)器 0 初始化{uchar i。for(i=0。iMAX_TASK。i++) task_delay[i]=0。//任務(wù)延時(shí)量初始化TMOD = (TMOD amp。 0xf0) | 0x01。 //定時(shí)器 0 工作在模式 1,16Bit 定時(shí)器模式TH0 = 255CLOCK/TIME_PER_SEC/12/256。 TL0 = 255CLOCK/TIME_PER_SEC/12%256。 TR0 =1。 //開啟定時(shí)器ET0 =1。 //開啟定時(shí)器中斷} 這里通過宏定義,把易變參數(shù)在頭文件中定義,這樣使得程序容易修改,便于移植。void OS_Timer0(void) interrupt 1 using 2 //定時(shí)中斷服務(wù){(diào)uchar i。TH0=255CLOCK/TIME_PER_SEC/12/256。 TL0=255CLOCK/TIME_PER_SEC/12%256。//每節(jié)拍對(duì)任務(wù)延時(shí)量減 1 ,減至 0 后,任務(wù)就緒。for(i=0。iMAX_TASK。i++){if(task_delay[i]0) task_delay[i]。//任務(wù)延時(shí)量減一歸零,使任務(wù)就緒}} 在定時(shí)中斷服務(wù)中,執(zhí)行的任務(wù)必須很簡(jiǎn)短,重置定時(shí)器初值,把大于 0 的任務(wù)延時(shí)量減 1,該定時(shí) 中斷作為心臟跳動(dòng),不斷進(jìn)出運(yùn)行,為了節(jié)省 CPU 時(shí)間,該中斷任務(wù)越簡(jiǎn)單越好。 任務(wù)調(diào)度 任務(wù)調(diào)度在主程序 main()中完成,系統(tǒng)初始化之后,在一個(gè)大循環(huán)中,對(duì)各任務(wù)的延時(shí)量是否為零 判斷,當(dāng)任務(wù)延時(shí)量為零時(shí),表示該任務(wù)就緒,當(dāng)前一個(gè)任務(wù)主動(dòng)放棄 CPU 之后,馬上啟動(dòng)就緒的新任 務(wù)。各任務(wù)之間不具有搶占功能,因此不用考慮堆棧與保護(hù),初學(xué)者也能夠完全掌握。 void main(void){sys_init()。 //系統(tǒng)初始化,包含各子任務(wù)初始化 OS_Init_Timer0()。//定時(shí)器初始化 INT_GLOBAL(1)。//開總中斷 while(1){//根據(jù)任務(wù)延時(shí)量是否為零選擇執(zhí)就緒任務(wù)執(zhí)行,任務(wù)執(zhí)行完成后返回再恢復(fù)設(shè)定的延時(shí)量if(task_delay[0]==0) {task0()。task_delay[0]=TIME_PER_SEC/50。} if(task_delay[1]==0) {task1()。task_delay[1]=TIME_PER_SEC/20。} if(task_delay[2]==0) {task2()。task_delay[2]=TIME_PER_SEC/01。} if(task_delay[3]==0) {task3()。task_delay[3]=TIME_PER_SEC/02。} if(task_delay[4]==0) {task4()。task_delay[4]=TIME_PER_SEC/03。} if(task_delay[5]==0) {task5()。task_delay[5]=TIME_PER_SEC/04。} if(task_delay[6]==0) {task6()。task_delay[6]=TIME_PER_SEC/05。} if(task_delay[7]==0) {task7()。task_delay[7]=TIME_PER_SEC/06。}}} 紅色數(shù)字表示任務(wù)執(zhí)行的頻度,即每秒鐘執(zhí)行多少次。各個(gè)不同的任務(wù),根據(jù)需要,設(shè)定不同的延時(shí) 量,延時(shí)量在定時(shí)中斷中逐步減一歸零,每個(gè)任務(wù)必須主動(dòng)放棄 CPU,正因此,各任務(wù)執(zhí)行時(shí)間最好不要 超過定時(shí)中斷節(jié)拍時(shí)間單位,這里為 20ms,否則將影響其它任務(wù)運(yùn)行。 按鍵掃描 按鍵掃描任務(wù)流程圖 按鍵輸入需要要實(shí)現(xiàn)以下功能:按鍵去抖動(dòng),快速單次觸發(fā),長(zhǎng)按單次觸發(fā),長(zhǎng)按多次連續(xù)觸發(fā),同 一按鍵既有長(zhǎng)按又有短按功能。 由于該任務(wù)在一定的頻度內(nèi)執(zhí)行,通過定義狀態(tài)機(jī)記錄該任務(wù)的歷史運(yùn)行狀態(tài),由于一次按鍵不能立 即確定鍵值,需要去抖動(dòng)處理,我可以用狀態(tài)機(jī)把首次按鍵記住,在二次按鍵時(shí)確認(rèn)鍵值,同樣,長(zhǎng)短按 鍵也是用狀態(tài)機(jī)和計(jì)數(shù)器控制,通過任務(wù)多次調(diào)用積累時(shí)間,從而實(shí)現(xiàn)長(zhǎng)延時(shí)而又不占用 CPU 資源,這 就是此種定時(shí)器中斷的多任務(wù)輪循架構(gòu)程序設(shè)計(jì)的精髓所在。 以 50Hz 的頻度掃描鍵盤,基本不會(huì)出現(xiàn)按鍵丟失現(xiàn)象。通過狀態(tài)機(jī)計(jì)數(shù)器控制,去抖動(dòng),長(zhǎng)短按鍵,單次多次按鍵等各種復(fù)雜的控制,部分程序解讀如下:define KEY_PORT P3 //定義按鍵接口define KEY_VAL KEY
點(diǎn)擊復(fù)制文檔內(nèi)容
數(shù)學(xué)相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖片鄂ICP備17016276號(hào)-1