片机的程序设计与调试.ppt
《片机的程序设计与调试.ppt》由会员分享,可在线阅读,更多相关《片机的程序设计与调试.ppt(141页珍藏版)》请在三一办公上搜索。
1、1,第4章 单片机的程序设计与调试,【本章内容】本章主要介绍伪指令、源程序汇编以及常用程序的设计方法。【项目驱动的学习要点】应用项目中各段程序功能分析。应用项目中的程序流程图分析。应用项目中各段程序设计方法分析。,2,第4章 单片机的程序设计与调试,4.1 源程序的设计与汇编4.2单片机开发系统与源程序的调试4.3 顺序和分支程序设计4.4 循环和查表程序设计4.5 子程序和中断程序设计练习题,END,3,4.1 源程序的设计与汇编,4.1.0 几个概念4.1.1 伪指令4.1.2 源程序的设计4.1.3 源程序的汇编,4,二进制形式的机器指令称为机器语言,采用机器语言编写的程序能直接被计算机
2、识别和执行。由于机器语言不容易理解和记忆,所以人们通常用符号指令来编写源程序。采用符号指令编写的程序必须通过编译软件(也叫汇编程序)或手工翻译(汇编)成机器指令的形式才能被计算机执行。前者称为机器汇编,后者称为手工汇编。,4.1.0 几个概念,5,用符号指令的计算机语言称汇编语言。符号指令也称为汇编语言指令;采用汇编语言指令编写的程序叫做汇编语言源程序。汇编的反过程称为反汇编。,几个概念,6,图4-1 源程序的汇编与反汇编,源程序的汇编与反汇编,7,4.1.1 伪指令,为了使编译软件能按设计者的要求汇编源程序,编写汇编语言源程序时,还要用到伪指令。伪指令是供汇编程序识别和执行并对汇编过程进行某
3、种控制的指令性语句。它不是真正的单片机指令,无对应的机器码。所以汇编后产生的目标程序中不会出现伪指令。,8,指令格式:ORG 表达式指令功能:用于向汇编程序说明下面紧接的程序段或数据段存放从表达指定的起始地址开始存放。表达式通常为十六位地址或自定义的标号地址。通常每一个汇编语言源程序的开始,都要设置一条ORG伪指令来指定该程序在ROM中存放的起始位置。可以在源程序中使用多条ORG伪指令来规定不同程序段或数据段存放的起始地址,但要求地址值由小到大顺序排列,不允许空间重叠。,1起始汇编伪指令,9,1ORG0000H2LJMPMAIN;转主程序3 ORG 0003H4LJMP BREAK0;转 中断
4、5 ORG 000BH6LJMP CLOCK;转定时器T0中断7ORG 0013H8LJMP BREAKl;转 中断;主程序:9ORG0050H10 MAIN:MOVA,#03H;8155初始化;控制字码表:137ORG1010H138DB0FEH,06H,20H,00H,0FFH,06H,20H,15H,【项目应用】以下是应用项目中使用的ORG伪指令,请分析各条ORG指令的作用。,10,解:,(1)第一条ORG伪指令用于说明整个程序的起始地址为0000H,其后的LJMP MAIN指令的机器码便从ROM的0000H单元开始存放。这是单片机开机或复位时的PC初值,所以单片机在开机或复位时总是从这
5、个地址开始读出程序。(2)第二至第四条ORG指令中的地址分别对应系统规定的3个中断入口地址,用于使其后的中断服务程序能存放在正确的位置(详见第5章)。(3)第五条ORG伪指令用于说明从标号为MAIN的指令往后的程序存放在0050H开始的ROM单元中。于是应用项目中的主程序,便由0000H单元通过无条件长转移指令LJMP MAIN转移到0050H往后的ROM单元,从而防止系统设定的中断入口地址被占用。(4)第六条ORG伪指令用于指定作为控制字码表的一个数据区的起始地址为1010H。从应用项目的反汇编源程序可以看出,ORG伪指令指定的地址没有发生重叠。,11,指令格式:END指令功能:结束汇编。放
6、置于汇编源程序的末尾,当汇编程序遇到END伪指令时,即结束汇编。处于END之后的程序,汇编程序不会进行处理。,2结束汇编伪指令,12,指令格式:符号名 EQU 表达式指令功能:将表达式的值赋给指定的符号名。表达式通常是8位或16位的地址、数据或汇编符,如果是位地址,则必须采用位的物理地址。符号的命名与标号的命名规定相同:可以由18个ASCII字符组成。首字符必须是字母,其余字符可以是字母、数字或其他特定字符,不能使用汇编语言已经定义了的符号,如指令助记符、寄存器符号名称等。“符号名”一旦被赋值,就可以在源程序的任意地方使用,汇编时,汇编程序自动用表达式的值进行代真。使用EQU伪指令有两个优点,
7、一是当源程序中有多处引用“符号名”的地方要修改时,只要修改为“符号名”赋值的指令即可;二是当“符号名”具有见字明义的名称时,可增加程序的可读性。,3通用赋值伪指令,13,符号的命名与标号的命名规定相同:可以由18个ASCII字符组成。第一个字符必须是字母,其余字符可以是字母、数字或其他特定字符,不能使用汇编语言已经定义了的符号,如指令助记符、寄存器符号名称等。“符号名”必须先赋值后使用,一旦“符号名”被赋值,它就可以在源程序的任意地方使用,汇编时,汇编程序自动用表达式的值进行代真。使用EQU伪指令有两个优点,一是当源程序中有多处引用“符号名”的地方要修改时,只要修改为“符号名”赋值的指令即可;
8、二是当“符号名”具有见字明义的名称时,可增加程序的可读性。,说明:,14,ORG 0100H;起始汇编 LEN EQU 10;LEN=“10”UM EQU 20H;SUM=“20H”BLOCK EQU 30H;BLOCK=“30H”START:CLR A;A清0 MOV R2,LEN;计数初值送R2 MOV R0,BLOCK;指针初值送R0LOOP:ADD A,R0;累加 INC R0;指针加1 DJNZ R2,LOOP;未完继续 MOV SUM,A;保存结果 HERE:SJMP$;动态停机 END;结束汇编,【例4-1】如下一段程序的功能是将BLOCK单元开始存放的10个无符号数进行求和,并
9、将结果存入SUM单元中(假设结果小于255)。,15,可见,若要改变BLOCK单元、SUM单元或累加数据个数,则只要改变相应的EQU指令便可。细心的读者可以发现,程序中每条指令都加了注释,而且注释的不是单纯的指令功能,而是指令的程序功能,旨在给读者一个示范,希望读者从本章开始,逐步学习单片机的程序设计并学会注释指令的程序功能。,说明:,16,指令格式:符号名 BIT 位地址指令功能:用于将位地址赋给指定的符号名。其中,位地址可用位名、物理位地址、“字节地址位序号”、“寄存器名位序号”等形式表示(详见位寻址)。例如:MARK BIT F0 其中的位地址是PSW中的用户标志位F0,它也可以用0D5
10、H、0D0H5、PSW5等形式表示。,4位地址赋值伪指令,17,指令格式:标号:DB 单字节数据表指令功能:用于从标号(即汇编程序为该指令分配的首地址)对应的地址单元开始,将“单字节数据表”中的数据按从左到右的顺序依次存入ROM中,一个数据占一个存储单元。单字节数据表可以是一个或多个单字节数据、字符串或表达式(其值为单字节),表项之间用逗号分隔。项数多于一行时,可使用多条DB伪指令。,5单字节定义伪指令,18,(详见指令格式)。十六进制数:加上后缀H表示,以字母AF开头时,在它的前面加一个前导“0”。二进制数:加上后缀B表示。十进制数:加上后缀D表示,也可以省略后缀。ASCII码:用“单引号”
11、括起来表示,如A,ABC,1,123。,数据的表示方法,19,134 DONE2:RET;字形码表:135 SEGTAB:DBFH,06H,5BH,4FH,66H,6DH,7DH136 DB07H,7FH,6FH;控制字码表:137 CODE:ORG1010H138 DB0FEH,06H,20H,00H,0FFH,06H,20H,15H139 DB0EFH,06H,25H,00H,0FFH,06H,40H,00H,【项目应用】以下是应用项目中使用的DB伪指令,20,编号为135的DB伪指令的功能是指示汇编程序从上一条指令(RET)存放完成后的下一个ROM单元开始,依次存入10个字形码。该条伪指
12、令一行写不下,所以分成两条DB伪指令来书写;编号为138的DB伪指令的功能则是从它上一条ORG伪指令指定的1010H单元开始,依次存入数据表中的控制码。表项较多,所以用多条DB伪指令来书写。,说明:,21,指令格式:标号:DW 双字节数据表 指令功能:与DB伪指令类似,只是指令中数据表的表项应为双字节,即16位二进制数。存入ROM中时,高8位存放在低地址单元中,低8位存放在高地址单元中,对于不足16位的表项数据,存放时在前面补0。例如:ORG0759HDATA:DW3295H,2800H,0BDH,汇编后,在ROM中的数据为:(0759H)=32H,(075AH)=95H,(075BH)=28
13、H,(075CH)=00H,(075DH)=00H,(075EH)=BDH。,6双字节定义伪指令,22,指令格式:标号:DS 表达式 指令功能:用于从标号对应的地址单元开始,在程序存储器中预留出一段存储单元作为备用空间,预留单元数量由表达式确定。例如:ORG0800H SPARE:DS20H 汇编后,从ROM中地址为0800H的单元开始,预留32个空的存储单元作为备用单元。,7空间定义伪指令,23,4.1.2 源程序的设计,1源程序设计的步骤2源程序设计的基本要求3源程序设计注意事项,24,1源程序设计的步骤,(1)明确设计任务(2)选择适当的算法(3)确定系统规划(4)确定程序结构(5)绘制
14、程序流程图(6)编写源程序(7)汇编和调试,25,(1)明确设计任务,在开始源程序设计前,首先要对所要设计的单片机应用系统进行深入地分析,明确应用系统所要实现的功能和技术要求,综合考虑应用系统的可行性、先进性、可靠性、可维护性、成本及经济效益等。选择合适的器件,设计出合理的硬件电路。因为单片机的程序设计与硬件电路的结构是紧密联系在一起的,面板的开关、按键、显示、输入/输出引脚的定义等也与程序设计密切相关,所以要事先作好准备。,26,算法是解决具体问题的方法。明确设计任务后,设计者应把应用系统所要实现的功能和技术要求利用严密的数学方法或数学模型来描述,从而把一个实际问题转化成由计算机进行处理的问
15、题。同一个问题的算法可能有多种,实现方案也可能不尽相同,所以应对各种算法进行分析、比较,合理优化,从中找出一种切合实际的最佳算法。,(2)选择适当的算法,27,系统规划包括合理地选择和分配内存工作区及有关端口地址,规划好寄存器和存储器的使用;确定数据和工作单元,分配存储单元;对数据暂存区、堆栈区、显示缓冲区、标志单元等作好统一安排;根据程序区、数据区、字形表等预计所占字节的多少,对程序存储器ROM做出空间规划,合理分配并确定每个区域的首地址,以及系统主程序、子程序的入口地址,中断服务程序的存放地址等。,(3)确定系统规划,28,程序结构的设计是把算法转化为程序的准备阶段。如果算法比较简单,这一
16、步可以省略,直接按算法编写程序。如果算法比较复杂,则需要进行程序结构的设计。程序的基本结构通常有顺序结构、分支结构、循环结构、子程序及中断服务程序等5类。程序结构的设计一般通过绘制程序流程图来实现。,(4)确定程序结构,29,(5)绘制程序流程图,程序流程图是用规定的图形符号配以文字说明来表示算法或处理问题的步骤,它具有直观、易懂的特点,是程序结构设计的有力工具。,30,常用的程序流程图符号如图4-2所示。,图4-2 常用的程序流程图符号,程序流程图符号,31,端点框:表示程序的起止。在端点框中可输入开始、结束、程序名、起始地址等相应的文字。处理框:表示一种处理功能或者过程,处理框中的文字简要
17、说明一段程序的功能或处理过程。判断框:表示一个判定点,从该点产生分支,在判断框内应注明测试条件,而测试结果则在各分支流程线上注明。连接框:表示流程中止而并非流程结束,通常用来连接同一页的流程,以避免流程线的交叉,也可以用来连接不同页上的流程,以避免流程线的跨页中断。绘图时,表示连在一起的连接框内的标识符要相同 流程线:表示程序执行的流向。,程序流程图符号说明:,32,源程序的编写是根据绘制好的程序流程图,运用单片机指令集中的合法指令和伪指令编写出能实现流程图规定功能的程序。所编写的源程序要力求简单明了、层次清晰、可靠、高效。,(6)编写源程序,33,汇编是将源程序翻译成能被单片机识别和执行的目
18、的程序。调试则是检验所编写的程序是否正确,能否正常运行。如果这两步不能通过,则需要重复以上步骤,对程序进行反复修改,直到获得正确的结果为止。,(7)汇编和调试,34,(1)正确性:要求严格按指令格式书写指令,不能臆造非法指令。(2)可靠性:由于单片机主要用于控制,所以程序的可靠性很重要。(3)可读性:为了增加程序的可读性,可在程序段前或每条指令后添加注释。(4)有效性:要求程序占用存储空间尽量小,执行时间尽可能短。,2源程序设计的基本要求,35,(1)采用模块化的程序设计方法(2)尽量采用循环结构和子程序(3)合理分配内存单元(4)正确使用转移指令,3源程序设计注意事项,36,模块化的程序设计
19、方法具有如下优点:单个模块的程序功能单一,结构层次一目了然,易于编写、调试和修改。便于分工,从而可使多个程序员同时进行程序的编写和调试工作,加快软件研制进度。程序可读性好,便于程序的优化、扩充和版本升级。对程序可进行局部修改,其他部分可以保持不变。对于使用频繁的子程序可以建立子程序库,便于多个模块调用。,(1)采用模块化的程序设计方法,37,采用循环结构和子程序可以使程序所占用的存储空间大大减少,节省了存储空间单元,提高程序的运行效率。对于循环程序尤其是多重循环程序,要注意循环初值的设置和循环结束条件的判断,避免出现程序无休止循环的“死循环”现象。对于通用的子程序,考虑到其通用性,除了用于存放
20、子程序入口参数的寄存器外,程序中用到的其他寄存器的内容应压入堆栈,即保护现场。但要特别注意恢复现场的出栈顺序要与入栈顺序相反,符合堆栈的操作规则。对于中断处理子程序也要注意类似的问题。,(2)尽量采用循环结构和子程序,38,工作寄存器R0和R1具有地址指针功能,应充分发挥其作用,避免用作其他寄存器。20H2FH单元具有位寻址功能,通常用来存放各种软件标志、逻辑变量、状态信息等。30H7FH单元作为一般寄存器区域,通常用来存放各种参数、指针、中间结果或作为数据缓冲区。如果程序中需要使用08H单元以后的工作寄存器组,通常把堆栈设置在内部RAM的高端处,即30H7FH单元。,(3)合理分配内存单元,
21、39,(4)正确使用转移指令,尽量少用无条件转移指令。这样可以使程序的条理更加清楚,从而减少错误。子程序内部的转移最好使用相对转移指令,使所编写的子程序可以放在64KB程序存储器ROM的任何地方,增加子程序的通用性,便于主程序调用。,40,4.1.3 源程序的汇编,1手工汇编2机器汇编,41,1手工汇编,是指程序设计者通过手工方式,对照指令代码表(见附录B)将汇编语言源程序中的每一条符号指令转换成对应机器码的过程。对于无分支源程序可以一次性完成汇编;对于包含转移指令和标号在内的源程序,通常需要进行两次汇编才能完成整个汇编过程:第一次汇编完成指令码的“代真”,第二次汇编完成地址偏移量的“代真”。
22、举例说明如下。,42,ORG0100H;起始汇编LENEQU10;LEN=10SUMEQU20H;SUM=20HBLOCK EQU 30H;BLOCK=30HSTART:CLR A;A清0 MOV R2,LEN;计数初值送R2 MOV R0,BLOCK;指令初值送R0LOOP:ADDA,R0;累加 INCR0;指针加1 DJNZ R2,LOOP;未完继续 MOV SUM,A;保存结果HERE:SJMP$;动态停机 END;结束汇编,【例4-2】请对例4-1的源程序进行手工汇编。该源程序的功能是将BLOCK单元开始存放的10个无符号数进行求和,并将结果存入SUM单元中(假设结果小于255)。,4
23、3,根据起始汇编伪指令,确定源程序的起始地址,对照指令表(见附录B),依次找出每条指令的机器码,并确定它们的起始地址,对于无法确认的标号和地址偏移量,把它们按原样抄录在指令码的相应位置上。第一次手工汇编的结果如表4-1所列。,解:(1)第一次汇编,44,表41第一次手工汇编结果:,45,确定指令码中的标号或地址偏移量,即需要计算出表4-1中的有关标号LOOP、$(HERE)的实际值,结果为负数时用补码表示,计算公式为:地址偏移量=目标地址(转移指令始址+转移指令字节数)求得为:LOOP=0105H(0107H+2)=4补码为:FCH$(HERE)=010BH(010BH+2)=2 补码为:FE
24、H 用计算结果置换表4-1中的地址偏移量,结果如表4-2所列,从而完成汇编。,(2)第二次汇编,46,表42第二次手工汇编结果:,47,机器汇编是指在微机上利用编辑软件编写好单片机的汇编语言源程序后,再通过运行于微机中的汇编程序(编译软件)对源程序进行汇编,把汇编语言源程序翻译成目标程序。最后经调试、仿真成功后,通过编程器(或称为烧写器)将目标代码写入ROM中,提供给单片机执行。,2机器汇编,48,4.2 单片机开发系统 与源程序的调试,4.2.1 开发系统的组成4.2.2 开发系统的功能4.2.3 源程序的调试,49,4.2.1 开发系统的组成,单片机开发系统通常由PC机、仿真机、编程器、擦
25、除器等组成,如图4-3所示。,图4-3 单片机开发系统,50,用于运行由产品制造商提供的包括编辑程序、汇编程序、调试程序等在内的单片机开发系统集成操作软件,构成一个集成的开发平台,使开发系统具有各种所需的单片机开发功能,或者用于运行编程器支持软件,使编程器可以将汇编好的目标代码下载(写入)到程序存储器ROM中。,1PC机,51,仿真机本身也是一个已开发好的单片机系统,它具有模拟目标系统中的单片机、ROM、RAM和I/O端口的功能,而且基本上不占用目标系统单片机的任何资源。有些仿真机上还提供部分独立的单元电路或扩展单元,通过适当的连接就可以在仿真机上构成与目标系统相同的硬件电路,使仿真目标系统的
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 程序设计 调试

链接地址:https://www.31ppt.com/p-6588946.html