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

发布者:张延强最新更新时间:2015-07-14 来源: 51hei关键字:51单片机  多任务代码 手机看文章 扫描二维码
随时随地手机看文章
;本51多任程序原理是设置了多个栈位置和在中断中改写栈指针的方法进行任务切换。 
;由于使用了多个栈,调用时不能有太多的嵌套调用,以免超出栈的工作区(48个字节),使程序出错。 
;这个程序只是为了做个多任务的试验,实用性还有侍验证。 
;当然这种思路是来自PC操作系统,我个人认为把PC编程上的事件驱动引入51是一种很好的方法。 
;在另一程序内已使用过,感觉还不错。(感兴趣的朋友可向我索取) 
;---------------------------------------------- 
;由于我用的MCS51程序有BUG,在调试时MCS51软件的栈区数变化和数据区不一至。即:栈区数变化 
;了对应的数据区数据没有按实际的应同时变化(因用的是同一存储空间)。 
;(实际两数据的地址和内容都是相同的,只是模拟软件内部不同步)。要用手动改写才能正常工作。 
;具体方法是:栈区数据变化时手动改写数据区对应地址的数据与栈内数据对应。 
;请使用该软件的朋友用到栈区模拟调试时注意(否则程序就会飞掉)。 
;---------------------------------------------- 
org 0000h;www.51hei.com 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.51hei.com/mcu/1325.html
关键字:51单片机  多任务代码 引用地址:最简单的51单片机多任务代码

上一篇:单片机驱动H桥电路
下一篇:STC89C52RC单片机8位流水灯程序

推荐阅读最新更新时间:2024-03-16 14:25

浅谈51单片机内存优化
对 51 单片机内存的认识,很多人有误解,最常见的是以下两种: ① 超过变量128后必须使用compact模式编译 实际的情况是只要内存占用量不超过 256.0 就可以用 small 模式编译 ② 128以上的某些地址为特殊寄存器使用,不能给程序用 与 PC 机不同,51 单片机不使用线性编址,特殊寄存器与 RAM 使用重复的重复的地址。但访问时采用不同的指令,所以并不会占用 RAM 空间。 由于内存比较小,一般要进行内存优化,尽量提高内存的使用效率。 以 Keil C 编译器为例,small 模式下未指存储类型的变量默认为data型,即直接寻址,只能访问低 128 个字节,但这 128 个字节也不是全为我们的程序所
[单片机]
51单片机实现对24C02进行页写、顺序读取并显示验证
//************************************************************************************* //**程序名称:51单片机实现对24C02进行页写、顺序读取并显示验证 //**编写人:**** //**修改人:**** //**程序目的:熟悉I2C总线协议,实现51模拟I2C时序和24C02通信 //**功能描述:51单片机将8个字节数据写入24C02的一页中,然后顺序读出,每隔1秒送P0口LED显示 //**其他说明:本程序是采用某51开发板,若在其他地方验证可更改相关端口及延时程序等。 //** 程序编写前曾参考过多个教程,最终自己编程通过,并详
[单片机]
基于51单片机的光电开关计数
电路原理图如下: 设计要求 (1)利用光电开关计数系统,可在0-999任意设定计数值,超过设定值时,步进电机停止。计数时步进电机以某一恒定速度转动。 (2)超过设定值后利用220V报警灯提示。 (3)数码管显示当前计数值和设定值。(按键选择是出于设定还是计数状态) 单片机程序如下: #include reg51.h #include intrins.h #define uchar unsigned char #define uint unsigned int sbit p1=P2^0; sbit p2=P2^1; sbit p3=P2^2; sbit p4=P2^3; sbit q1=P2^4; sbit q2
[单片机]
基于<font color='red'>51单片机</font>的光电开关计数
有关Keil软件仿真的51单片机串口调试技巧
引言   在单片机系统中,串口(UART,通用异步收发接口)是一个非常重要的组成部分。通常使用单片机串口通过RS232/RS485电平转换芯片与上位机连接,以进行上位机与下位机的数据交换、参数设置、组成网络以及各种外部设备的连接等。RS232/RS485串行接口总线具有成本低、简单可靠、容易使用等特点,加上其历史悠久,所以目前应用仍然非常广泛;特别对于数据量不是很大的场合,串口通信仍然是很好的选择,有着广阔的使用前景。   在单片机编程中,串口占了很重要的地位。传统方式串口程序的调试,往往是利用专用的单片机硬件仿真器。在编写好程序后,利用仿真器来设置断点,观察变量和程序的流程,逐步对程序进行调试,修正错误。使用硬件仿真器的确是很有
[单片机]
有关Keil软件仿真的<font color='red'>51单片机</font>串口调试技巧
C51单片机定时器/计数器控制字设置
在使用定时/计数器之前需要先通过定时/计数器的方式控制字来设置其工作方式。 在单片机中有两个特殊功能寄存器与定时/计数有关,这就是TMOD和TCON。顺便说一下,TMOD和TCON是名称,我们在写程序时就能直接用这个名称来指定它们,当然也能直接用它们的地址89H和88H来指定它们(其实用名称也就是直接用地址,汇编软件帮你翻译一下而已)。 从图1中我们能看出,TMOD被分成两部份,每部份4位。分别用于控制T1和T0,至于这里面是什么意思,我们下面介绍。 从图2中我们能看出,TCON也被分成两部份,高4位用于定时/计数器,低4位则用于中断(我们暂不管)。而TF1(0)我们上节课已提到了,当计数溢出后TF1(0)就由0变为
[单片机]
C<font color='red'>51单片机</font>定时器/计数器控制字设置
51单片机的P0口电路结构
51单片机的P0口电路如下: 由1中的上拉电阻作用分析可知,需要在51单片机的P0口,加一个上拉电阻,加上后的电路如下:
[单片机]
<font color='red'>51单片机</font>的P0口电路结构
51单片机的四种工作模式怎么去设置
学51单片机需要专门把C语言学透吗 大家是不是看了很多网上的视频或者文章,他们的建议是不是教你拿一本C语言书看几个月,当真正开始给单片机编程时你会发现单片机编程语言只用到了c语言的百分之十都不到,浪费了自己的青春,消磨了对电子方面的兴趣!真正学习单片机需要一定的动手能力,不误人子弟的教程,理论和实践相结合的教学模式并没有刚开始教大家一堆C语言知识。 所以建议从一块开发板和教程开始学起,起初的知识对C语言的要求很低。之后发现自己的C语言功底不足以使你的程序如鱼得水的时候再回头认认真真学习C语言。 51单片机的四种工作模式怎么去设置,既然它有四种工作模式,像定时计数器一样,要想使用定时计数器它也有四种工作方式,那必然的要有
[单片机]
<font color='red'>51单片机</font>的四种工作模式怎么去设置
基于AT89C51单片机的变频调速控制系统设计
  1.概述   在电气传动领域中,随着自关断器件技术水平的不断提高,脉宽调制技术(简称PWM技术)也日趋成熟。PMW交流变频调速以其高效率、高功率因数、输出波形好、结构简单等优点,在井下风机、水泵、造纸机等设备中得到了广泛的应用。将单片机应用于交流变频调速系统,可有效地避免传统调速方案中的一些缺点,达到了提高控制精度的目的 ,其特点:   (1)采用单片机可以使绝大多数控制逻辑通过软件实现,简化了电路。   (2)单片机具有更强的逻辑功能,运算速度快,精度高,有大容量的存储单元,可以实现较为复杂的控制。   (3)无零点漂移,控制精度高。   (4)可以提供人机界面,多机连网工作。   根据国内外有关变频调速的最新研
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved