您的位置 首页 IOT

最简略的51单片机多任务代码

;本51多任程序原理是设置了多个栈位置和在中断中改写栈指针的方法进行任务切换。;由于使用了多个栈,调用时不能有太多的嵌套调用,以免超出

;本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

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/yingyong/iot/255458.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部