新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 最簡單的51單片機多任務代碼

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

        作者: 時間:2016-11-29 來源:網絡 收藏
        ;本51多任程序原理是設置了多個棧位置和在中斷中改寫棧指針的方法進行任務切換。
        ;由于使用了多個棧,調用時不能有太多的嵌套調用,以免超出棧的工作區(48個字節),使程序出錯。
        ;這個程序只是為了做個多任務的試驗,實用性還有侍驗證。
        ;當然這種思路是來自PC操作系統,我個人認為把PC編程上的事件驅動引入51是一種很好的方法。
        ;在另一程序內已使用過,感覺還不錯。(感興趣的朋友可向我索取)
        ;----------------------------------------------
        ;由于我用的MCS51程序有BUG,在調試時MCS51軟件的棧區數變化和數據區不一至。即:棧區數變化
        ;了對應的數據區數據沒有按實際的應同時變化(因用的是同一存儲空間)。
        ;(實際兩數據的地址和內容都是相同的,只是模擬軟件內部不同步)。要用手動改寫才能正常工作。
        ;具體方法是:棧區數據變化時手動改寫數據區對應地址的數據與棧內數據對應。
        ;請使用該軟件的朋友用到棧區模擬調試時注意(否則程序就會飛掉)。
        ;----------------------------------------------
        org 0000h;www.51hei.com2004.6028-89951522
        ;mail:xch1106@163.comQQ: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;選擇寄存器組
        clrrs1
        ;==============================
        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.51hei.com/mcu/1325.html


        評論


        技術專區

        關閉
        主站蜘蛛池模板: 通江县| 普安县| 曲靖市| 从江县| 双牌县| 霸州市| 隆回县| 天水市| 红原县| 班戈县| 三原县| 汽车| 太湖县| 内江市| 德令哈市| 鹿泉市| 高邮市| 河津市| 健康| 北京市| 甘孜| 蒙山县| 龙里县| 宜昌市| 龙海市| 九台市| 阿勒泰市| 白银市| 开化县| 曲阳县| 黄平县| 吴桥县| 化州市| 鄂托克旗| 凤山县| 深泽县| 建昌县| 娄底市| 若尔盖县| 文安县| 正镶白旗|