在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

  • <dfn id="79stg"></dfn>
    <object id="79stg"><div id="79stg"><label id="79stg"></label></div></object>
    <ruby id="79stg"><dl id="79stg"><noscript id="79stg"></noscript></dl></ruby>

      新聞中心

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

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

      作者: 時間:2016-11-29 來源:網絡 收藏
      ;本51多任程序原理是設置了多個棧位置和在中斷中改寫棧指針的方法進行任務切換。
      ;由于使用了多個棧,調用時不能有太多的嵌套調用,以免超出棧的工作區(qū)(48個字節(jié)),使程序出錯。
      ;這個程序只是為了做個多任務的試驗,實用性還有侍驗證。
      ;當然這種思路是來自PC操作系統(tǒng),我個人認為把PC編程上的事件驅動引入51是一種很好的方法。
      ;在另一程序內已使用過,感覺還不錯。(感興趣的朋友可向我索?。?br />;----------------------------------------------
      ;由于我用的MCS51程序有BUG,在調試時MCS51軟件的棧區(qū)數(shù)變化和數(shù)據(jù)區(qū)不一至。即:棧區(qū)數(shù)變化
      ;了對應的數(shù)據(jù)區(qū)數(shù)據(jù)沒有按實際的應同時變化(因用的是同一存儲空間)。
      ;(實際兩數(shù)據(jù)的地址和內容都是相同的,只是模擬軟件內部不同步)。要用手動改寫才能正常工作。
      ;具體方法是:棧區(qū)數(shù)據(jù)變化時手動改寫數(shù)據(jù)區(qū)對應地址的數(shù)據(jù)與棧內數(shù)據(jù)對應。
      ;請使用該軟件的朋友用到棧區(qū)模擬調試時注意(否則程序就會飛掉)。
      ;----------------------------------------------
      org 0000h;www.51hei.com2004.6028-89951522
      ;mail:[email protected]: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;開啟計數(shù)器
      mov 00h,#00h;任務計數(shù)器初始化
      clr 00h;全部棧初始化完成標志清0
      clr 01h;任務1棧初始化標志位清0
      clr 02h;任務2棧初始化標志位清0
      clr 03h;任務3棧初始化標志位清0
      setb rs0;選擇寄存器組
      clrrs1
      ;==============================
      cshsp1: jnb 01h,$;等侍定時中斷,以便自動初始化任務1棧數(shù)據(jù)
      ;mov 01h,sp
      jb 00h,main1;全部棧區(qū)數(shù)據(jù)初始化完成則進入任務1
      jmp cshsp2;否則->初始化任務2


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

      jmp main1
      ;-------------------------------
      cshsp2: mov sp,#90h;置任務2棧頂位置
      jnb 02h,$;等侍定時中斷,以便自動初始化任務2棧數(shù)據(jù)
      ;mov 02h,sp
      jb 00h,main2;全部棧區(qū)數(shù)據(jù)初始化完成則進入任務2
      jmp cshsp3
      main2:;任務2
      nop
      nop
      nop
      nop
      nop
      jmp main2
      ;---------------------------------------
      cshsp3: mov sp,#0c0h;置任務3棧頂位置
      jnb 03h,$;等侍定時中斷,以便自動初始化任務3棧數(shù)據(jù)
      ;mov 03h,sp;全部棧區(qū)數(shù)據(jù)初始化完成則進入任務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;設低位初值 (在操作系統(tǒng)中可能叫時間片參數(shù))

      ;;;;;;;;;;;;;;;;;;;;;;;;;;;;
      jb 00h,rwqh;00H為1則初始化已完成(初始化只進行3次中斷即全部初始化1次)
      ;就不再進行初始化,而進行任務切換操作
      ;------------------- sp 1 2 3初始化棧數(shù)據(jù)
      jb 01h,stsp1
      mov 01h,sp;保存當前的棧位置(任務1)
      ;讀取當前棧內容并全部重壓入1次。
      ;相當于在棧區(qū)做了一次備份,任務切換時使用
      ;本次中斷返回時將彈出原來的數(shù)據(jù),備份的則還在棧內。
      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次。(初始化棧區(qū)數(shù)據(jù)的方法)
      push 0c1h
      push 0c2h
      push 0c3h
      push 0c4h
      push 0c5h
      push 0c6h
      setb 03h
      setb 00h
      jmp end1
      ;-------------------
      rwqh:
      ;;;;;;;;;;;;;;;;;;;切換任務,每中斷1次切換1次。
      inc 00h;任務計數(shù)
      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


      評論


      技術專區(qū)

      關閉