单片机多任务编程方法介绍_第1页
单片机多任务编程方法介绍_第2页
单片机多任务编程方法介绍_第3页
单片机多任务编程方法介绍_第4页
单片机多任务编程方法介绍_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

单片机多任务编程方法介绍单片机多任务编程方法介绍 Edan Lee Email edan lee QQ 284622554 前言前言 从事单片机学习和工作已有多年 多年下来对单片机开发有一 点自己的认识 想将自己的积累和大家分享 应该对初学者有一点 帮助 还有很多不足的地方 欢迎来函探讨 因为文学功底不行所 以直接进入主题 主体内容主体内容 本文的主要目的是介绍在没有操作系统的多任务编程方法 所 有例子都以 51 单片机为基础 内容编排 1 多任务简介 2 任务分拆 3 软件定时器 4 系统架构 5 例子 多任务简介多任务简介 对于单片机的多任务就是 CPU 处理多个任务 但是在同一个时 间 CPU 只能处理一个任务 在处理多任务的时候其实就是将 CPU 分 时复用 具体是在一个时间内处理一个任务 在接下来的时间里处 理另一个任务 这个时间一般很短 在操作系统里就是指时间片 单片机因为资源少的原因很少会带操作系统来工作 但是可以从多 任务的基本原本出发模拟操作系统的多任务 为了一个任务不会独 占 CPU 就将任务分成 N 个小任务 划分原则是在任务需要等待的 地方划分 每次运行到这个任务的时候 CPU 只执行其中的一个或 者多个小任务 任务分拆任务分拆 在一个 LED 闪烁的小程序中原理是点亮 LED 延时 关闭 LED 延时 循环 define LEDOn LED Port 0 define LEDOff LED Port 1 sbit LED Port P1 0 不精确延时 void Delay unsigned int t while t LED 闪烁处理 void LEDFlash void LEDOn Delay 1000 LEDOff Delay 1000 主函数 void main void LEDFlash 上例中的 LED 闪烁处理函数可以用一个进程控制器 变量 将其 分成四个部分 void LEDFlash void static unsigned char step 0 进程控制器 switch step case 0 LEDOn step break case 1 Delay 1000 step break case 2 LEDOff step break case 3 Delay 1000 step 0 break 上例对于这个小程序来说变得复杂了点 step 就是将 LEDFlash 函数拆分成了 4 个小部分 每次进入 LEDFlash 这个函数只执行了一 个小部分 这是多任务编程的基础 软件定时器软件定时器 在上例中的程序中加入另一个灯闪烁不同的频率的时候就会出 现问题 因为当执行 Delay 时 CPU 不可以做其它的事情 为了解决这个问题就要引入定时器来处理延时 原理是程序判 断定时是否到而决定是否往下执行 那么上面的程序就变成 void LEDFlash void static unsigned char step 0 进程控制器 switch step case 0 LEDOn step 定时器初始化 break case 1 if 定时未到 break step break case 2 LEDOff step 定时器初始化 break case 3 if 定时未到 break step 0 break 硬件的定时器是有限的 为了可以使用更多的定时器就需要用 软件定时器 具体就是用变量做累加或者递减 和定时器计脉冲的 原理是一样的 为了使软件定时器更精准 就可以对硬件定时器的 溢出次数计数 那软件定时器的定时时间就是硬件定时器溢出时间 的整数倍 unsigned char Tim 2 两个软件定时器 void Time0Irq void interupt 1 Tim 0 Tim 1 例子就可以变成 void LEDFlash void static unsigned char step 0 进程控制器 switch step case 0 LEDOn step Tim 0 0 break case 1 if Tim 0 x x 是延时的时间 break step break case 2 LEDOff step Tim 0 0 break case 3 if Tim 0 8 TL0 T0VALUE TMOD 0 x01 方式 1 16 位定时器 ET0 1 允许中断 EA 1 TR0 1 起动定时器 0 定时器 0 中断处理 void Time0Irq void interrupt 1 unsigned char i TH0 T0VALUE 8 TL0 T0VALUE for i 0 i Tim 0 break step break case 2 LED0Off step Tim 0 0 break case 3 if MS 500 Tim 0 break step 0 break 每秒闪 5 2 次 void LED1Flash void static unsigned char step 0 进程控制器 switch step case 0 LED1On step Tim 1 0 break case 1 if MS 200 Tim 1 break step break case 2 LED1Off step Tim 1 0 break case 3 if MS 200 Tim 1 break step 0 break void main void Tim0Init while 1 LED0Flash LED1Flash 经过优化后可以变成下面的形式 include define T0VALUE 65536 1000000 200 5ms define LED0On LED0 0 define LED0Off LED0 1 define LED1On LED1 0 define LED1Off LED1 1 define S 1 200 define S 2 400 sbit LED0 P1 0 sbit LED1 P1 1 软件定时器数量 define MAX T 2 软件定时器 unsigned int Tim MAX T 定时器 0 初始化 void Tim0Init void TH0 T0VALUE 8 TL0 T0VALUE TMOD 0 x01 方式 1 16 位定时器 ET0 1 允许中断 EA 1 TR0 1 起动定时器 0 定时器 0 中断处理 void Time0Irq void interrupt 1 unsigned char i TH0 T0VALUE 8 TL0 T0VALUE for i 0 i Tim 0 break step break endif case 2 LED0Off step 0 Tim 0 S 1 break if 0 case 3 if S 1 Tim 0 break step 0 break endif 间隔两秒闪烁 void LED1Flash void static unsigned char step 0 进程控制器 if 0 Tim 1 return switch step case 0 LED1On step 2 Tim 1 S 2 break if 0 case 1 if S 2 Tim 1 b

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论