基于消息驱动的单片机程序设计_第1页
基于消息驱动的单片机程序设计_第2页
基于消息驱动的单片机程序设计_第3页
基于消息驱动的单片机程序设计_第4页
全文预览已结束

下载本文档

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

文档简介

基于消息驱动的单片机程序设计 摘 要:论述了基于消息驱动程序设计思想,并通过实例说明了这种思想的实现方法,实践表明,它能大大简化编程难度,合理利用系统资源,并且由于程序结构脉络清晰,维护和扩展非常方便。 关键词:单片机;消息驱动;控制器1基于消息驱动程序设计思想 在单片机软件开发过程中,编制的程序要合理使用各种中断机制。当中断要处理的事务较复杂时,就会导致中断服务程序执行时间过长;这时如果另有中断发生,象MCS-51这样的只有两级中断优先级的单片机,就可能有丢失中断的现象出现。对于我们即将要介绍的智能控制器系统来说,任务复杂:有中断、定时任务、循环执行任务等,并且人机交互操作还通常会动态地改变程序的运行模式,尤其是人机界面液晶的显示输出需要占用大量CPU时间,与此同时又不允许丢失重要的数据。因此,需要综合采用消息机制及状态转移法来统一地处理好CPU的任务安排。 在WINDOWS面向对象编程方法中,消息是各个对象之间进行通讯的手段。程序通过消息来请求对象进行动作,对象间的联系或相互作用也是通过消息来完成的,消息中包含了消息发送者的要求,消息接受者在收到消息后,根据需要来处理消息。系统将会维护一个或多个消息队列,所有产生的消息都会被放入或是插入队列中。系统会在队列中取出每一条消息,根据消息的接收句柄而将该消息发送给拥有该窗口的程序的消息循环。每一个运行的程序都有自己的消息循环,在循环中得到属于自己的消息并根据接收窗口的句柄调用相应的窗口过程,而在没有消息时消息循环就将控制权交给系统,所以Windows可以同时进行多个任务。 与WINDOWS多任务操作系统相比,单片机是一个单任务的系统,资源十分有限,不易同时运行多个程序。因此,单片机系统不可能象WINDOWS那样建立庞大的消息循环机制,将消息分发给各个程序并行处理。在基于消息的单片机编程中,消息机制可以采取一种简化的方式来定义:当某个事件(例如中断)发生时,事件处理程序(例如中断服务程序)设置相应的标志,不同的标志即代表不同的消息;而主程序在消息循环中不断地判断这些标志,以决定启动哪一个处理函数(相当于将消息发送给特定的消息处理函数)。这就可能、并且允许采用异步方式处理各种中断及定时任务,因此将中断产生的标志作为消息,而数据处理则放在消息循环中进行,就可以在单片机编程中引入消息的概念。以智能温室控制器主程序的设计为例,说明使用消息驱动的程序设计方法。2智能温室控制器的硬件方案简介 系统硬件选择以单片机作为控制器的控制核心,按设计要求,控制器必须具备以下功能:(1) 配备键盘和显示,要有良好的人机界面;(2) 能显示当前时间、室内外的气象信息、执行机构状态和报警信息;(3) 历史数据保存,用于用户对两天内的气象信息供统计和分析;(4) 掉电时能保存运行状态和数据;(5) 高可靠性和高抗干扰能力,确保控制器在复杂环境下稳定运行。 根据上述的功能要求,本智能控制器的电路原理框图,如图1所示。 系统主要由下列几个部分组成: (1) 单片机基本系统。主控微处理器采用ATMEL89C51,ROM采用两片27256(各32K),RAM为一片62256(32K)组成基本的单片机系统。 (2) 系统监测电路。在本智能控制器中,该电路完成系统上电复位和看门狗功能。 (3) 译码电路。由地址线和读写信号线通过GAL16V8译码,分别得到实时时钟、执行机构控制接口、键盘接口和LCD液晶显示模块接口的片选信号。 (4) 显示电路。显示器的核心是T6963C控制器点阵图形式LCD显示模块,它通过接插件连在系统总线上,并从控制器上获得电源。ATMEL89C51控制LCD的读写和字体选择。 (5) 实时时钟电路。本智能控制器采用的是Dallas公司的DS12C887。DS12C887可以通过总线与单片机相连,并可以象读写外部RAM一样来进行透明的读写操作。 (6) 历史数据存储电路。选用两片Atmel公司容量8k字节的串行数据存储器AT24C64,它通过I+2C串行总线与89C51相连。 (7) 通信电路。控制器与A/D板之间的通信选用485总线。 (8) 输出控制电路。挂在总线上的两个数据锁存器74HC273分别通过两个16脚插座连接两个继电器板,继电器板用于控制外部执行机构的接触器,进而实现强电控制。3主程序设计 通常情况下,我们将中断发生后所需进行处理的工作全部放在中断服务程序中完成,而主控程序需要做的只是初始化系统并等待中断。以本课题的键盘中断服务程序为例,不难发现如果采用这种设计就会存在如下几个弊端:(1) 键盘中断服务程序过长,人机交互性变差,甚至不能满足用户的一些特殊要求;(2) 采用这样的结构可能导致代码的重入,增大堆栈的开销,造成难以预料的结果(某些C51编译器不支持函数的重入)。因此如果在屏幕刷新显示的时钟中断中又插入串口通信中断或者键盘中断,则会使键盘响应变慢,屏幕刷新减缓,从而大大影响人机交互性。 从前面的消息驱动的程序设计思想中可知,通过在中断服务程序中,向主程序的消息队列添加相应的消息,来达到将中断服务程序中的数据处理部分分离出来的目的。中断服务程序返回主程序后,主控程序只处理消息循环,判断并为消息处理对象发送所需处理的消息,而接受消息的对象则以消息响应函数的方式出现,当接收到主程序发来的消息后,消息响应函数获得控制权,做完相应的处理后将控制权交还给主程序继续消息循环的处理。用户的输入及对象的请求仅是向消息队列中添加相应的消息。 根据详细分析温室智能控制系统的功能,可以得到如表1所示的消息一览表。整个表列出了消息循环所能接收到的所有消息的ID、相应处理函数及其说明。 主控程序不仅仅是等待中断,还需要查询消息队列,并根据队列中的不同消息,调用相应的消息处理函数(在面向对象编程中,可理解为将消息分发给各个消息对象),在本系统中,消息队列表现为一个变量,通过给该变量置不同值来反映不同的消息。对于由中断触发的消息,由于消息处理函数已经脱离了中断处理过程,所以系统对消息处理不再象中断服务程序那样,在时间上有十分苛刻的要求;同时,在消息处理过程中,用户仍可通过键盘中断来与系统进行交互。 主控制程序消息处理主循环代码如下: 利用这种消息驱动机制来架构的程序和Windows程序一样具有很强的可扩展性。因为整个程序利用消息来驱动,即通过在中断服务程序中,向主程序的消息队列添加相应的消息,中断服务程序返回主程序后,再根据消息队列中的消息转向相应的消息处理函数。这样,只需在中断服务程序添加相应消息,同时在主控程序中给扩展的消息添加对应消息处理函数即可。 例如要增加功能Ex-Function,消息ID为20,具体步骤如下: (1)在需要扩展的中断的中断服务程序中添加相应消息 (3)在主程序中根据消息ID来调用该消息处理函数4结束语 总之,基于消息的单片机编程思想是从Windows操作系统中进行借鉴的一个有益尝试,实践表明,它能大大简化编程难度,合理利用系统资源,并且由于程序结构脉络清晰,

温馨提示

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

评论

0/150

提交评论