久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

專注電子技術(shù)學(xué)習(xí)與研究
當前位置:單片機教程網(wǎng) >> MCU設(shè)計實例 >> 瀏覽文章

最簡單的51單片機多任務(wù)代碼

作者:佚名   來源:本站原創(chuàng)   點擊數(shù):  更新時間:2012年10月07日   【字體:

;本51多任程序原理是設(shè)置了多個棧位置和在中斷中改寫棧指針的方法進行任務(wù)切換。
;由于使用了多個棧,調(diào)用時不能有太多的嵌套調(diào)用,以免超出棧的工作區(qū)(48個字節(jié)),使程序出錯。
;這個程序只是為了做個多任務(wù)的試驗,實用性還有侍驗證。
;當然這種思路是來自PC操作系統(tǒng),我個人認為把PC編程上的事件驅(qū)動引入51是一種很好的方法。
;在另一程序內(nèi)已使用過,感覺還不錯。(感興趣的朋友可向我索取)
;----------------------------------------------
;由于我用的MCS51程序有BUG,在調(diào)試時MCS51軟件的棧區(qū)數(shù)變化和數(shù)據(jù)區(qū)不一至。即:棧區(qū)數(shù)變化
;了對應(yīng)的數(shù)據(jù)區(qū)數(shù)據(jù)沒有按實際的應(yīng)同時變化(因用的是同一存儲空間)。
;(實際兩數(shù)據(jù)的地址和內(nèi)容都是相同的,只是模擬軟件內(nèi)部不同步)。要用手動改寫才能正常工作。
;具體方法是:棧區(qū)數(shù)據(jù)變化時手動改寫數(shù)據(jù)區(qū)對應(yīng)地址的數(shù)據(jù)與棧內(nèi)數(shù)據(jù)對應(yīng)。
;請使用該軟件的朋友用到棧區(qū)模擬調(diào)試時注意(否則程序就會飛掉)。
;----------------------------------------------
org 0000h;m.zg4o1577.cn 2004.6  028-89951522
;mail:xch1106@163.com  QQ:15552363
jmp zcx;去主程序
org 001bh
call tim;定時中斷1入口
reti

zcx:
mov sp,#60h;置任務(wù)1棧頂位置,任務(wù)2 90h,任務(wù)3 0c0h
mov tmod,#10h;設(shè)定時器1工作方式2
mov th1,#0f3h;設(shè)高位初值  
mov tl1,#00h;設(shè)低位初值
setb ea;開中斷
setb et1;開定時中斷
setb tr1;開啟計數(shù)器
mov 00h,#00h    ;任務(wù)計數(shù)器初始化
clr 00h;全部棧初始化完成標志清0
clr 01h;任務(wù)1棧初始化標志位清0
clr 02h;任務(wù)2棧初始化標志位清0
clr 03h;任務(wù)3棧初始化標志位清0
setb rs0;選擇寄存器組
clr  rs1
;==============================
cshsp1: jnb 01h,$;等侍定時中斷,以便自動初始化任務(wù)1棧數(shù)據(jù)
;mov 01h,sp
jb 00h,main1;全部棧區(qū)數(shù)據(jù)初始化完成則進入任務(wù)1
jmp cshsp2;否則->初始化任務(wù)2


main1:  ;任務(wù)1
nop;你的代碼
nop
nop
nop
nop

jmp main1
;-------------------------------
cshsp2: mov sp,#90h;置任務(wù)2棧頂位置
jnb 02h,$;等侍定時中斷,以便自動初始化任務(wù)2棧數(shù)據(jù)
;mov 02h,sp
jb 00h,main2;全部棧區(qū)數(shù)據(jù)初始化完成則進入任務(wù)2
jmp cshsp3
main2:;任務(wù)2
nop
nop
nop
nop
nop
jmp main2
;---------------------------------------
cshsp3: mov sp,#0c0h;置任務(wù)3棧頂位置
jnb 03h,$;等侍定時中斷,以便自動初始化任務(wù)3棧數(shù)據(jù)
;mov 03h,sp;全部棧區(qū)數(shù)據(jù)初始化完成則進入任務(wù)3
main3:;任務(wù)3
nop
nop
nop
nop
nop
jmp main3

;;===========================================
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
tim:push a;定時1中斷子程序
push psw
clr tr1;關(guān)閉定時器
clr et1;關(guān)閉定時中斷
;使用資源:定時器1,定時器1中斷,0組寄存器,
clr rs0;選擇寄存器組
clr rs1  
mov th1,#0f3h;設(shè)高位初值   (中斷時間的長短)
mov tl1,#00h;設(shè)低位初值   (在操作系統(tǒng)中可能叫時間片參數(shù))

    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    jb 00h,rwqh;00H為1則初始化已完成(初始化只進行3次中斷即全部初始化1次)
;就不再進行初始化,而進行任務(wù)切換操作
    ;------------------- sp 1 2 3初始化棧數(shù)據(jù)
    jb 01h,stsp1
mov 01h,sp;保存當前的棧位置(任務(wù)1)
;讀取當前棧內(nèi)容并全部重壓入1次。
;相當于在棧區(qū)做了一次備份,任務(wù)切換時使用
;本次中斷返回時將彈出原來的數(shù)據(jù),備份的則還在棧內(nèi)。
push 61h
push 62h
push 63h
push 64h
push 65h
push 66h
    setb 01h
    jmp end1
stsp1:  
    jb 02h,stsp2
mov 02h,sp;保存當前的棧位置(任務(wù)2)
;讀取當前棧內(nèi)容并全部重壓入1次。
push 91h
push 92h
push 93h
push 94h
push 95h
push 96h
    setb 02h
    jmp end1
stsp2:
jb 03h,rwqh
mov 03h,sp;保存當前的棧位置(任務(wù)3)
;讀取當前棧內(nèi)容并全部重壓入1次。(初始化棧區(qū)數(shù)據(jù)的方法)
push 0c1h
push 0c2h
push 0c3h
push 0c4h
push 0c5h
push 0c6h
setb 03h
setb 00h
jmp end1
;-------------------
rwqh:
;;;;;;;;;;;;;;;;;;;切換任務(wù),每中斷1次切換1次。
inc 00h;任務(wù)計數(shù)
cjne r0,#01h,rwqh2;當前任務(wù)為3切換到任務(wù)1(改變SP位置,得到切換任務(wù)的目的)
mov 03h,sp
mov sp,01h
rwqh2:
cjne r0,#02h,rwqh3;當前任務(wù)為1切換到任務(wù)2
mov 01h,sp
mov sp,02h
rwqh3:
cjne r0,#03h,end1;當前任務(wù)為2切換到任務(wù)3
mov 02h,sp
mov sp,03h
mov 00h,#00h
end1:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
setb et1
setb tr1
pop psw
pop a
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
參考資料:http://m.zg4o1577.cn/mcu/1325.html

關(guān)閉窗口

相關(guān)文章

主站蜘蛛池模板: 国产精品一区二区日韩 | 99精品国自产在线 | 精品一级 | 北条麻妃99精品青青久久主播 | 精品视频一区二区三区在线观看 | 久久91 | 成人网av | 欧美精品在线看 | 成人精品一区二区三区 | 日韩影院在线 | 亚洲国产精品视频 | 亚洲福利在线观看 | 亚洲喷水| 97福利在线| 激情毛片 | 中文字幕日韩欧美 | 国产欧美一级 | 夜夜夜夜夜夜曰天天天 | 特黄一级| 久久久精品一区二区 | 久久久精| 五月婷婷丁香 | 九九热最新地址 | 国外成人在线视频 | 国产99久久久国产精品 | 亚洲日本一区二区 | 99精品久久久久 | 中文在线一区二区 | 91精品国产综合久久婷婷香蕉 | 99精品在线 | 91精品国产乱码久久久久久 | 欧美精品一区二区三区在线 | 精品成人免费视频 | 天天拍天天射 | 国产精品成人一区二区三区 | 第四色影音先锋 | 日韩成人av在线 | 中文字幕欧美在线观看 | 国产一区二区三区不卡av | 亚洲精品久久久久中文字幕欢迎你 | 精品一区二区在线看 |