合理的软件结构是设计出一个性能优良的应用程序的基础。单片机应用系统的软件(监控程序)设计是系统设计中最基本而且工作量较大的任务。与系统机上操作系统支持下的纯软件设计不同,单片机的软件设计是在裸机的条件下进行的,而且随应用系统的不同而不同。图9-2为软件设计流程图。在软件设计中一般需考虑以下几个方面:
(1)根据要求确定软件的具体任务细节,然后确定合理的软件结构。一般系统软件由主程序和若干个子程序及中断服务程序组成,详细划分主程序、子程序和中断服务程序的具体任务,确定各个中断的优先级。主程序是一个顺序执行的无限循环的程序,不停地顺序查询各种软件标志,以完成对事务的处理。在子程序和中断服务程序中,要考虑现场的保护和恢复以及它们和主程序之间的信息交换方法。
(2)程序的结构一般常用模块化结构,即把监控程序分解为若干个功能相对独立的较小的程序模块分别设计,以便于调试。具体设计时可采用自底向上或自顶向下的方法。
(3)在进行程序设计时,先根据问题的定义描述出各个输入变量和输出变量之间的数学关系,即建立数学模型,然后绘制程序流程图,再根据流程图用汇编语言或高级语言进行具体程序的编写。
(4)在程序设计完成后,利用相应的开发工具和软件进行程序的汇编(或编译),生成程序的机器码。
对于大多数简单的单片机应用系统,通常采用顺序设计方法,这种系统软件由主程序和若干个中断服务程序所构成。根据系统各个操作的性质,指定哪些操作由中断服务程序完成、哪些操作由主程序完成,并指定各个中断的优先级。
(1)中断服务程序对实时事件请求作必要的处理,使系统能实时地并行地完成各个操作。中断处理程序必须包括现场保护、中断服务、现场恢复、中断返回等4个部分。中断的发生是随机的,它可能在任意地方打断主程序的运行,无法预知这时主程序执行的状态。因此,在执行中断服务程序时,必须对原有程序状态进行保护。现场保护的内容应是中断服务程序所使用的有关资源(如PSW、ACC、DPTR等)。中断服务程序是中断处理程序的主体,它由中断所要完成的功能所确定,如输入或输出一个数据等。现场恢复与现场保护相对应,恢复被保护的有关寄存器状态,中断返回使CPU回到被该中断所打断的地方继续执行原来的程序。
(2)主程序是一个顺序执行的无限循环的程序,不停地顺序查询各种软件标志,以完成对日常事务的处理。图9-3给出了中断程序和主程序的结构。
图9-3 中断程序与主程序的结构
(3)主程序和中断服务程序间的信息交换一般采用数据缓冲器和软件标志(置位或清“0”位寻址区的某一位)方法。例如:定时中断到1s后置位标志SS[设(20 H).0],以通知主程序对日历时钟进行计数,主程序查询到SS=1时,清“0”该标志并完成时钟计数。又如:A/D中断服务程序在读到一个完整数据时将数据存入约定的缓冲器,并置位标志以通知主程序对此数据进行处理。再如:若要打印,主程序判断到打印机空时,将数据装配到打印机缓冲器,启动打印机并允许打印中断。打印中断服务程序将一个个数据输出打印,打印完后关打印中断,并置位打印结束标志,以通知主程序打印机已空。
因为顺序程序设计方法容易理解和掌握,也能满足大多数简单的应用系统对软件的功能要求,因此是一种用得很广的方法。顺序程序设计的缺点是软件的结构不够清晰、软件的修改扩充比较困难、实时性能差。这是因为当功能复杂的时候,执行中断服务程序要花较多的时间,CPU执行中断程序时不响应低级或同级的中断,这可能导致某些实时中断请求得不到及时的响应,甚至会丢失中断信息。如果多采用一些缓冲器和标志,让大多数工作由主程序完成,中断服务程序只完成一些必需的操作,从而缩短中断服务程序的执行时间,这在一定程度上能提高系统实时性,但是众多的软件标志会使软件结构杂乱,容易发生错误,给调试带来困难。对于复杂的应用系统,可采用实时多任务操作系统。
2.程序设计方法
(1)自顶向下模块化设计方法。随着单片机应用日益广泛,软件的规模和复杂性也不断增加,给软件的设计、调试和维护带来很多困难。自顶向下的模块化设计方法能有效解决这个问题。程序结构自顶向下模块化程序设计方法就是把一个大程序划分成一些较小的部分,每一个功能独立的部分用一个程序模块来实现。分解模块的原则是简单性、独立性和完整性,即:
1)模块具有单一的入口和出口。(www.xing528.com)
2)模块不宜过大,应让模块具有单一功能。
3)模块和外界联系仅限于入口参数和出口参数,内部结构和外界无关。
这样各个模块分别进行设计和调试就比较容易实现。
(2)逐步求精设计方法。模块设计采用逐步求精的设计方法,先设计出一个粗的操作步骤,只指明先做什么后做什么,而不回答如何做。进而对每个步骤细化,回答如何做的问题,每一步越来越细,直至可以编写程序时为止。
(3)结构化程序设计方法。按顺序结构、选择结构、循环结构模式编写程序,见图9-4。
图9-4 自顶向下模块化设计方法
算法和数据结构有密切的关系。明确了算法才能设计出好的数据结构,反之选择好的算法又依赖于数据结构。
算法就是求解问题的方法,一个算法由一系列求解步骤完成。正确的算法要求组成算法的规则和步骤的含义是唯一确定的,没有二义性的,指定的操作步骤有严格的次序,并在执行有限步骤以后给出问题的结果。
求解同一个问题可能有多种算法,选择算法的标准是可靠性、简单性、易理解性以及代码效率和执行速度。
描述算法的工具之一是流程图又称框图,它是算法的图形描述,具有直观、易理解的优点。前面章节中许多程序算法都用流程图表示。流程图可以作为编写程序的依据,也是程序员之间的交流工具。流程图也采用由粗到细,逐步细化,足够明确后就可以编写程序。
数据结构是指数据对象、相互关系和构造方法。不过单片机中数据结构一般比较简单,多数只采用整型数据,少数采用浮点型或构造性数据。
4.程序设计语言选择和编写程序
单片机中常用的程序设计语言为汇编语言和C51语言。对于熟悉指令系统并且有经验的程序员,喜欢用汇编语言编写程序,根据流程图可以编制出高质量的程序。对于指令系统不熟悉的程序员,喜欢用C51语言编写程序,用C51语言编写的结构化程序易读易理解,容易维护和移植。因此程序设计语言的选择是因人而异的。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。