📄 drw.asm
字号:
;本51多任程序原理是设置了多个栈位置和在中断中改写栈指针的方法进行任务切换。
;由于使用了多个栈,调用时不能有太多的嵌套调用,以免超出栈的工作区,使程序出错。
;这个程序只是为了做个多任务的试验,实用性还有侍验证。
;当然这种思路是来自PC操作系统,我个人认为把PC编程上的事件驱动引入51是一种很好的方法。
;能让程序想路更加清晰。
org 0000h ;www.xch-dz.com 2003.8.3 028-89951522
;mail:xch1106@163.com
jmp zcx ;去主程序
org 001bh
call tim ;定时中断1入口
reti
org 0060h
zcx:
mov sp,#60h ;置栈位置(任务1栈位置)
mov tmod,#10h ;设定时器1工作方式2
mov th1,#0f3h ;设高位初值
mov tl1,#00h ;设低位初值
setb ea ;开中断
setb et1 ;开定时中断
setb tr1 ;开启计数器
mov 00h,#00h
mov 02h,#97h ;(任务2栈位置)
mov 03h,#0c7h ;;(任务3栈位置)
setb rs0 ;选择寄存器组
clr rs1
;========================setb sp 1 2 3
;任务1栈数据自动生成
;对任务2的栈数据进行初始化
mov sp,#90h
mov a,#0ach ;任务2入口地址低位(该值因程序变化而改变,请修改)
push a
mov a,#00h ;任务2入口地址高位(该值因程序变化而改变,请修改)
push a
mov a,#01eh ;定时中断反回地址低位
push a
mov a,#00h ;定时中断反回地址高位
push a
;对任务3的栈数据进行初始化
mov sp,#0c0h
mov a,#0b3h ;任务3入口地址低位(该值因程序变化而改变,请修改)
push a
mov a,#00h ;任务3入口地址高位(该值因程序变化而改变,请修改)
push a
mov a,#01eh ;定时中断反回地址低位
push a
mov a,#00h ;定时中断反回地址高位
push a
;用上面的代码或用这里的代码均可。
;由于我用的MCS51程序有BUG在用下面的代码时不正常工作。所以写了上面的代码进行代换
;当然用下面的代码只是在软件模拟单步时不行。在别的环境下应该可以正常工作。
;mov 91h,#0adh ;任务3入口地址低位(该值因程序变化而改变,请修改)
;mov 92h,#00h ;任务3入口地址高位(该值因程序变化而改变,请修改)
;mov 93h,#1eh ;定时中断反回地址低位
;mov 94h,#00h ;定时中断反回地址高位
;mov 0c1h,#0adh ;任务3入口地址低位(该值因程序变化而改变,请修改)
;mov 0c2h,#00h ;任务3入口地址高位(该值因程序变化而改变,请修改)
;mov 0c3h,#1eh ;定时中断反回地址低位
;mov 0c4h,#00h ;定时中断反回地址高位
;===========================
main1: ;任务1
nop
nop
nop
nop
nop
jmp main1
;-------------------------------
main2: ;任务2
nop
nop
nop
nop
nop
jmp main2
;---------------------------------------
main3: ;任务3
nop
nop
nop
nop
nop
jmp main3
;;===========================================
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
tim: push a ;定时1中断子程序
push b
push psw
clr tr1 ;关闭定时器
clr et1 ;关闭定时中断
;使用资源:定时器1,定时器1中断,0组寄存器,
clr rs0 ;选择寄存器组
clr rs1
mov th1,#0f3h ;设高位初值(在操作系统中可能叫时间片参数)
mov tl1,#00h ;设低位初值(在操作系统中可能叫时间片参数)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
rwqh:
;;;;;;;;;;;;;;;;;;;rwqh
inc 00h ;任务计数
cjne r0,#01h,rwqh2 ;当前任务为1切换到任务2(改变SP位置,得到切换任务的目的)
mov 01h,sp
mov sp,02h
rwqh2:
cjne r0,#02h,rwqh3 ;当前任务为2切换到任务3
mov 02h,sp
mov sp,03h
rwqh3:
cjne r0,#03h,end1 ;当前任务为3切换到任务1
mov 03h,sp
mov sp,01h
mov 00h,#00h
end1:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
setb et1
setb tr1
pop psw
pop b
pop a
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -