c51单片机的多任务机制及应用(编辑修改稿)内容摘要:

讯,当发生火灾、地震等灾情时,管理中心能通知用户。 其结构如图 1所示。 平时状态下,主板的 CPU 不断地扫描各个传感器的状态。 当检测到传感器的异常信号(有人闯入)时, CPU 进入入侵报警状 态,执行响警铃、拨打户主电话、通知管理中心等工作。 当发生火灾地震时,管理中心发送一个串口代码给主板 CPU,使 CPU 进入灾难报警状态,执行响警铃、语音报警等操作。 用户需要进行功能设置时可以通过键盘板使主板 CPU 进入功能设置状态。 因此主板的 CPU 有 4 种不同的工作状态。 图 1 智能安防系统结构示意图 如果采用单任务机制 , 主板的程序流程如图 2 所示。 在主函数中循环检测传感器状态 ,如有异常则调用报警函数,灾难报警和功能设置在串口中断中完成。 这种单任务结构有两个缺点。 首先,在各种非平时状态中,程序需要 不停地检测是否收到撤除信号,这个要求在程序代码量大、执行工作较多的情况下很难实现。 其次,各状态之间的切换十分困难,用 C语言写的程序为求模块化,一般函数数量较多,函数调用的嵌套层数也多,要从一个较深的嵌套立刻跳出到主函数,是非常困难的。 一般的解决方法或是使用 C51的库函数 setjmp()和 longjmp()实现长跳转,但是这两个函数在中断函数内部是无能为力的;再或是在 C 函数中嵌入汇编指令。 虽然用汇编指令可以实现程序的长距离跳转,但是这种方法的调试过程十分烦琐,而且程序的可移植性差。 对于习惯用 C51 编程而不想用汇编的设计者,该部分程序是一个难题。 图 2 单任务机制程序流程 实现多任务机制的程序结构 本文提供了一种方法,可以在完全不使用汇编指令的前提下实现可移植性强的多任务程序,程序流程如图 3所示。 图 3 多任务结构程序流程 实现这个多任务机制的完整源代码如下: word idata PC_Value, SP_Value。 SP 初值的全局变量 byte idata Ctrl_Code。 的全局变量,在中断函数里被赋值 void main() { Initial()。 SP_Value=SP。 PC_Value=Get_Next_PC()。 一条指令的地址 EA=1。 PC、 SP 初值后再开中断保证稳定性 if(Ctrl_Code!=0) SP=SP_Value。 switch( Ctrl_Co。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。