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

專注電子技術學習與研究
當前位置:單片機教程網 >> MCU設計實例 >> 瀏覽文章

最簡單的51單片機多任務代碼

作者:佚名   來源:本站原創   點擊數:  更新時間:2012年10月07日   【字體:

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

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


main1:  ;任務1
nop;你的代碼
nop
nop
nop
nop

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

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

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

關閉窗口

相關文章

主站蜘蛛池模板: 日本字幕在线观看 | 日韩福利 | 中文av在线播放 | 日本一区不卡 | 天天综合网天天综合 | 亚洲精品久久久久久久久久久 | 欧美xxxⅹ性欧美大片 | 午夜天堂精品久久久久 | 久久一区二区三区四区 | 国产精品视频一区二区三区, | 91精品欧美久久久久久久 | 日韩欧美一区二区三区在线播放 | 在线播放中文字幕 | 久久国产一区 | 亚洲精品九九 | 久婷婷 | 久久久xx | 在线看片国产精品 | 亚洲欧美日韩在线不卡 | 成人伊人网 | 嫩草研究影院 | 欧美九九九 | 久久久精品天堂 | 在线看91 | 欧美aaa级 | 91性高湖久久久久久久久_久久99 | 一二区电影 | 久久中文一区二区 | 成人精品国产免费网站 | 操操网站 | 国产一区二区三区色淫影院 | 久久久久国产精品 | 亚洲一区中文字幕 | 国产精品黄色 | 欧美成人免费在线视频 | 午夜寂寞福利视频 | 亚洲国产精久久久久久久 | 亚洲人成在线播放 | 成人在线一级片 | 国产精品1区2区3区 中文字幕一区二区三区四区 | 成人欧美一区二区三区在线播放 |