第4章 程序设计.ppt
《第4章 程序设计.ppt》由会员分享,可在线阅读,更多相关《第4章 程序设计.ppt(78页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第第4章章程序设计程序设计教学目标教学目标介绍单片机汇编程序设计方法介绍单片机汇编程序设计方法介绍单片机汇编程序常用结构及设计方法介绍单片机汇编程序常用结构及设计方法介绍介绍典型智能仪表单片机系统应用软件设计典型智能仪表单片机系统应用软件设计介绍介绍目前流行的目前流行的MCS-51单片机高级语言单片机高级语言C51学习要求学习要求熟悉单片机编程的步骤、方法和技巧熟悉单片机编程的步骤、方法和技巧掌握单片机汇编程序的常用结构及设计方法掌握单片机汇编程序的常用结构及设计方法掌握典型汇编语言应用程序的编制掌握典型汇编语言应用程序的编制了解单片机高级程序设计语言了解单片机高级程序设计语言C51单片机系统
2、设计由硬件设计和软件单片机系统设计由硬件设计和软件设计两部分组成,设计两部分组成,后者就是设计程序、编制表格,以指挥单片机完成用户交付的任务。本章介绍MCS-51单片机汇编语言程序设计的基本步骤、方法和技巧,并在最后简单地介绍了C51高级程序设计。4.1编程的步骤、方法和技巧编程的步骤、方法和技巧单片机常用于工业测控装置和智能仪表等,这些应用场所往往对实时性提出了要求。使用汇编语言设计程序,虽然比高级语言烦琐,但它能最充分地发挥指令系统的功能与效率,获得最简练的目标程序,能满足实时性要求。用汇编语言设计单片机应用程序往往要经历以下几个步骤:(1)软件任务分析;(2)数据类型和数据结构规划;(3
3、)资源分配;(4)编程与调试。4.1.1软件任务分析软件任务分析软件任务分析是为软件设计作一个总体规划。从功能来看,软件可分为两大类:一类是执行软件,它能完成各种实质性的功能,如测量、计算、显示、打印、输出控制和通信等;另一类是监控软件,它是专门用来协调各执行模块和操作者的关系,在系统软件中充当组织调度角色的软件。这两类软件的设计方法各有特色,执行软件的设计偏重算法效率,与硬件关系密切。监控软件着眼全局,逻辑严密。软件任务分析时,应将各执行模块一一列出,并为每一个执行模块进行功能定义和接口定义(输入、输出定义)。在为各执行模块进行定义时,将要牵涉到的数据结构和数据类型的问题也一并规划好。各执行
4、模块规划好后,就可以规划监控程序了。首先根据系统功能和键盘设置选择一种最合适的监控程序结构。相对来讲,执行模块任务明确单纯,比较容易编程。而监控程序较易出问题。任务分析的另一个内容是如何安排监控软件和各执行模块。整个系统软件可分为后台程序和前台程序。后台程序指主程序及其调用的子程序,这类程序对实时性要求不是很高,延误几十毫秒甚至几百毫秒也没关系,故通常将监控程序(键盘管理程序)、显示程序和打印程序等与操作者打交道的程序放在后台程序中来执行。而前台程序安排一些实时性要求较高的内容,如定时系统和外部中断。在一些特殊场合,也可以将全部程序均安排在前台,后台为踏步等待循环或睡眠状态。4.1.2数据类型
5、和数据结构规划数据类型和数据结构规划前面的软件任务分析只是一个粗糙的分析和大体上的安排,还不能开始编程。为了避免系统中各个执行模块之间的脱节现象,就必须严格规定好各个接口条件,即各接口参数的数据结构和数据类型。从数据类型上来分类,可分为逻辑型和数值型,但通常将逻辑型数据归到软件标志中去考虑。而将数据类型分类理解为数值类型分类。数值类型可分为定点数和浮点数。如果一个参数的变化范围有限,就可用定点数来表示,以简化程序设计和加快运行速度;当参数的变化范围太宽时,只好采用浮点数来表示。如果某参数是一系列有序数据的集合,如采样信号系列,则不光有数据类型问题,还有一个数据存放格式问题,即数据结构问题。在单
6、片机应用系统中,数据结构比较简单,大多采用线性结构,这样有利于数据处理。由于受RAM空间的限制,队列结构广泛采用环行队列结构,为此应规划好两样东西:队列区域和队尾(首)指针,并计算出总共需要的RAM字节数。对于数组,一般采用顺序存放的格式。这样就可以用简单的下标运算来访问数组中的任何一个元素。4.1.3资源分配资源分配完成数据类型和数据结构的规划后,便可开始分配系统的资源了。在微机测控系统中,往往需要定时检测某个物理参数,或按一定的时间间隔来进行某种控制等。这种定时的获得常采用定时/计数器,它还可以对某种事件进行计数,然后根据计数结果来进行控制;单片机在及时处理实时测、控中的许多随机的参数和信
7、息、对外界异步事件包括故障的处理常使用中断,在任务分析时一般要将定时/计数器和中断源等资源分配好。ROM资源用来存放程序和表格,这也是明显的。系统资源ROM、RAM、定时/计数器、中断源等。因此,资源分配的主要工作是RAM资源的分配。片外RAM的容量比片内RAM大,通常用来存放大批量的数据,如采样数据系列。真正需要认真考虑的是片内RAM的分配。片内RAM指00H7FH单元。这128个字节的功能并不完全相同,分配时应注意充分发挥各自的特长,做到物尽其用。00H1FH这32个字节可以作为工作寄存器,其中00H0FH用来作为0区、1区工作寄存器。在一般的应用系统中,后台程序用0区工作寄存器,前台程序
8、用1区工作寄存器。如果有高级中断,则高级中断可用2区工作寄存器(10H17H)。如果前台程序中不使用工作寄存器,则系统只需0区工作寄存器。未作为工作寄存器的其它单元便可以转为其它目的使用了。系统上电复位时,自动定义0区为工作寄存器,1区为堆栈,并向2区、3区延伸。如果前台程序要用1区、2区作为工作寄存器,就应将堆栈空间重新规划。在工作寄存器的8个单元中,R0和R1具有指针功能,是编程的重要角色,应充分发挥其作用,尽量避免用来做其它事情。20H2FH这16个字节具有位寻址功能,用来存放各种软件标志、逻辑变量、位输入信息、位输出信息副本、状态变量、逻辑运算的中间结果等。当这些项目安排好后,保留一两
9、个字节备用,剩下的单元才可改作其它用途。30H7FH为一般通用寄存器,只能存入整字节信息。通常用来存放各种参数、指针、中间结果,或用作数据缓冲区。也常将堆栈安排在片内RAM的高端,如68H7FH。如果将系统的各种开销安排后,所剩单元很少,这往往不是好的兆头。应该留有足够的余地,因为现在还处于规划阶段,随着软件设计的发展进程,几乎都会出现新的资源要求。如果在规划阶段资源已经很紧张,建议修改硬件设计,增加RAM资源。RAM资源规划好后,应列出一张RAM资源的详细分配清单,作为编程依据。4.1.4编程与调试编程与调试 上述各项准备工作都完成后,就可以开始编程了。软件设计有两种方法:一种是自上而下,逐
10、步细化;一种是自下而上,先设计出每一个具体的模块(子程序),然后再慢慢扩大,最后组成一个系统。两种方法各有优缺点。单片机由于本身没有开发能力,故编程均在各种类型的开发系统上进行。基本过程是相同的:用编辑软件编辑出源程序,再用编译软件生成目标代码,如果源程序中有语法错误则返回编辑过程,修改源程序后再继续编译,直到通过这一关。然后对程序进行测试,纠正测试中发现的错误。接着就在开发系统上仿真运行,试运行中将会发现不少设计错误(不是语法错误),再从头修改源程序,如此反复直到基本成功,就可以投入实际环境中使用。4.24.2汇编语言源程序的编辑和汇编汇编语言源程序的编辑和汇编 用助记符和标号地址编写的程序
11、称为汇编语言源程序;而将助记符翻译成机器码以及将标号地址换算成实际地址的工作都由计算机通过一种称为汇编程序的软件完成,这种翻译和换算的过程一般就称为汇编。4.2.1汇编语言源程序的格式汇编语言源程序的格式一般来讲,汇编语言源程序由四部分组成,即标号、操作码、操作数和注释。每两个部分之间要用分隔符隔开,而每一部分内部不采用分割符。可以采用的分割符有:空格“”、冒号“:”、分号“;”,空格的数目可以不止一个。汇编语言源程序的一般形式为:标号:操作码操作数;注释方括号在实际程序中并不书写,也不输入到计算机里,只是表示方括号内的项是任选项,此项可有可无,若不需要时,在某一行可以不包括此项。故对每一行源
12、程序来说,只有操作码是必不可少的,其余三部分都可视情况而定。汇编程序只处理分号“;”以前的字符,对于注释部分,计算机在汇编时不予处理。注释部分便于程序的使用者更好地理解程序的功能,有助于程序的交流使用。软件工作者从一开始就要养成写好注释的良好习惯。对于有些指令,操作数不止一个,有两个甚至三个,在输入计算机时,各操作数之间要用逗号作分割符。一、标号一、标号标标号号由由8个个或或8个个以以下下的的字字母母数数字字构构成成,第第一一个个必必须须是是字字母母。另外还允许使用一个下横线符号“”。其它的符号都不允许在标号中使用。此外,系统中保留使用的字符或字符组不能用作标号,以免引起混淆。如各种特殊功能寄
13、存器名、各个位地址记忆符、各种伪指令等都不能用作标号。以下是一些合法的标号:A1,LOOP等。以下的字符串不能用作标号:4G,F-G,DB,EQU(后两种为保留字)。标号不是每一行都必须要有,而只是在需要时才使用。二、操作数二、操作数对于立即数#data来说,使用时,一般都在#后面跟一个具体的数。这个数可以是二进制数,应以字母“B”作为结束,如#10010011B;也可以是十六进制数,则以字母“H”结尾,如88H,但若最高位为AF之中的字母,则前面还要加一个数字“0”,如#0ABH。如果这个0忘了加上,汇编程序将认为所写的是一个编号。如果数字的最后没有结束字母,则认为是十进制数,如#10。立即
14、数的data也可以用定义过的标号来代替,这种定义要用到伪指令EQU等。对于直接地址direct来说,在实际使用时,也可以有多种选择:1.二进制数,十进制数或十六进制数,如:MOVA,30H等;2.标号地址,如:MOVA,SUM等,SUM应该在程序中某处加以定义;3.带加减的表达式,如:MOVA,SUM+9,SUM为已定义的符号地址;4.特殊功能寄存器名,如:MOVA,SP等。对于偏移量rel,除了可以采用上面提到的各种数值、标号地址以及表达式之外,还可以采用一个专门的符号“$”,它表示相对转移指令所在的地址,例如:LJMP$这条指令实际上是一条自身跳转的死循环。在实际 编 程 时,凡 是 指
15、令 中 用 到 地 址 的 地 方(rel,addr11,addr16)都用标号地址代替实际地址,而将复杂的地址运算交给汇编程序完成。4.2.2伪指令伪指令 每种汇编语言都会定义若干伪指令,用来对汇编过程进行某种控制,或对符号、标号赋值。伪指令和指令是完全不同的。在汇编过程中,由于伪指令并不执行可执行的目的代码,因而大部分伪指令甚至不会影响存储器中的内容。对不同版本的汇编语言,伪指令的符号和含义可能不同,但基本的用法是相似的。下面就介绍一些常用的伪指令。一、一、ORG(汇编起始命令汇编起始命令)其功能是规定下面的目标程序的起始地址,指令格式为:标号:ORG addr16其中括号内是任选项,可以
16、没有,例如:ORG 1000HLAB:MOV A,#3H即,规定了标号LAB所在的起始地址为1000H,第一条指令就从1000H开始存放。一般在一个汇编语言源程序的开始,都用一条ORG伪指令来规定程序存放的起始位置,故称为汇编起始命令。二、二、END(汇编结束命令)汇编结束命令)END是汇编语言源程序的结束标志,在END以后所写的指令,汇编程序都不予处理。一个源程序只能有一个END命令。在同时包含有主程序和子程序的系统中,也只能有一个END命令,并存放到所有指令的最后,否则,就有一部分指令不能被汇编。其格式为:标号:END三、三、EQU(等值命令)等值命令)其功能是将一个数或者特定的汇编符号赋
17、予规定的符号名称,其格式为:字符名称EQU数或汇编符号例如:INPEQUP1MOV A,INP这里将INP等值为汇编符号P1,在指令中INP就可以代替P1来使用。四、四、DATA(数据地址赋值命令)数据地址赋值命令)其功能是将数据地址或代码地址赋予规定的字符名称,其格式为:字符名称DATA表达式DATA伪指令的功能和EQU有些相似,使用时要注意它们的差别:(1)EQU伪指令定义的符号必须先定义后使用,而DATA伪指令的符号可以先使用后定义;(2)用EQU伪指令可以把一个汇编符号赋给一个字符名称,而DATA伪指令则不能。(3)DATA伪指令可将一个表达式的值赋给一个字符名称,所定义的字符名称也可
18、以出现在表达式中,而用EQU定义的字符则不能这样使用。(4)DATA伪指令常在程序中用来定义数据地址。五、五、DB(定义字节指令)定义字节指令)其功能是从规定的地址单元开始,定义若干个8位内存单元的内容,其格式为:标号:DB8位数据表这个伪指令是在程序存储器的某一部分存入一组规定好的8位二进制数,或者是将一个数据表格存入程序存储器。这个伪指令在汇编后,将影响程序存储器的内容。例如:TAB1:DB3FH,55,8,CTAB2:DB10100B设TAB1的对应地址为2000H,则以上伪指令经汇编以后,将对2000H开始的若干内存单元赋值:(2000H)=3FH(2001H)=37H(2002H)=
19、38H(2003H)=43H (2004H)=14H六、六、DW(定义字命令)定义字命令)其功能是从指定地址开始,定义若干个16位数据,其格式为:标号:DW16位数据表每个16位数据要占ROM的两个单元,在MCS-51系统中,16位二进制数的高8位先存入低地址字节,低8位后存入高地址字节。这和MCS-51指令中的16位数据存放的方式一致。例如:ORG1000HDW3964H,6H,20汇编以后结果为:(1000H)=39H(1001H)=64H(1002H)=00H(1003H)=6H(1004H)=00H(1005H)=14H七、七、BIT(位地址符号命令)位地址符号命令)其功能是将位地址赋
20、予所规定的字符名称,其格式为:字符名称 BIT位地址例如:RECORD BITP2.2PLAYBITP2.3这样就把两位位地址分别赋给两个变量RECORD和PLAY,在编程中它们可当作位地址来使用。但不是所有的MCS-51汇编程序都有这条伪指令。当不具备BIT命令时,可以使用EQU命令来定义位地址变量,但这时所赋的值应该是具体的位地址,例如P1.0就要具体地用90H来代替。4.2.3源程序的编辑和汇编源程序的编辑和汇编源程序的编辑可以使用任何可编辑和存储文本格式的文件编辑器,如Windows操作系统提供的写字板(Wordpad)和笔记本(Notebook)、Word文字处理器和各种单片机集成开
21、发软件如MEDWIN、MPLAB、WAVE等。用文本文件编辑器编辑和汇编单片机程序的过程如下:(1)用文件编辑器编辑汇编语言源程序,它的扩展名为.ASM;(2)经检查无明显的语法错误后,再采用单片机汇编程序ASM51进行汇编,产生扩展名为.LST的列表输出文件和扩展名为.HEX的目标代码文件;列表输出文件:包含源程序语句所汇编成的代码,以及有关的地址、语句和符号表等;目标代码文件:包含源程序语句所汇编成的代码,不包含任何符号信息或助记符。用单片机集成开发软件编辑和汇编单片机程序的过程如下:(1)在集成开发环境中编辑器编辑汇编语言源程序,它的扩展名为.ASM;(2)在集成开发环境中设置编译所采用
22、的正确汇编程序(一般为ASM51)后,用鼠标点击编译工具条或菜单可直接进行汇编。若源程序无语法错误,会产生扩展名为.LST的列表输出文件和扩展名为.BIN(或.HEX)的目标代码文件;若源程序有语法错误,一般不会产生列表输出文件和目标代码文件,但会弹出一个信息窗口,指示出错位置和错误类型。用鼠标点击出错指示信息,会直接跳到源程序出错语句,修改正确后,再一次编译,则会弹出信息窗口指示汇编成功,源程序无语法错误,并产生相应的目标代码文件和列表输出文件。4.34.3汇编语言程序设计汇编语言程序设计4.3.14.3.1程序流程图设计及子程序设计程序流程图设计及子程序设计一、程序流程图一、程序流程图1概
23、述概述编制程序的正确做法是先画程序流程图,再开始编程,而不是编完程序后再补画程序流程图。程序流程图在“高级语言程序设计”相关课程中大家已熟悉,它是一种以框图形式表示程序结构的。画程序流程图的过程是进行程序的逻辑设计过程,这中间的任何错误或忽视将会导致程序出错或可靠性下降。可以认为真正的程序设计过程是流程图设计,而上机编程是将设计好的程序流程图转换成程序设计语言而已。2.程序流程图的画法程序流程图的画法正确的流程图画法是先粗后细、一步一个脚印,只考虑逻辑结构和算法,不考虑或少考虑具体指令。这样画流程图就可以集中精力考虑程序的结构,从根本上保证程序的合理性和可靠性,剩下来的任务只是进行指令代换,这
24、时只要消除语法错误,一般就能顺利编出源程序,并且很少大返工。下面用一个例子来说明流程图的画法:有一数据采集系统,将采集到的一批数据存放在片外RAM中,数据类型为双字节十六进制整数,存放格式为顺序存放,高字节在前(低地址),低字节在后(高地址),数据块的首址已知,数据总个数(不超过256)也已知。现要设计一个程序,计算下列公式的值:式中,n为数据总个数,Xi为某个数据,为这n个数据的平均值。要求最后结果以BCD码百分数表示,并精确到0.1%。第第一一步步,先进行最原始的规划,画第一张程序流程图,如图4-2所示。在画第一张程序流程图时,将总任务分解成若干个子任务,安排好它们之间的相互关系,暂不管各
25、个子任务如何完成。这一步看起来简单,但千万不能出错,这一步错误是属于宏观决策错误,有可能造成整体推倒重来。图4-2开始求X求求开平方求V结束第第二二步步,将第一张流程图的各个子任务进行细化。决定每个子任务采用哪种算法,而暂不考虑如何为数据指针、计数器、中间结果配置存放单元等具体问题。由于内容比第一张详细,如果全图画在一起不方便,可以分开画,但要注意各分图之间的连接关系。第二张流程图如图4-3所示。图图4-3开始初始化累加和SUM=0;数据指针i=1;计数器m=nSUM=SUM+Xii=i+1M=m-1M=0?初始化SUM=0;i=1;m=ni=i+1;M=m-1M=0?调开平方子程序V=100
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第4章 程序设计
限制150内