




已阅读5页,还剩74页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第4章 汇编程序的设计与调试 一、汇编语言程序设计概述 二、实用程序设计 三、 C51介绍 程序设计语言 1. 机器语言(Machine Language) 这是一种用二进制代码“0”和“1”表示指令和数据的 程序设计语言。计算机只能识别二进制代码,这种语言是能 被计算机直接识别和执行的机器级语言。 特点:机器语言能够被计算机立即识别并加以执行,具有执行 速度快、占用内存少等优点。但对于使用者来说,用机器语 言编写程序具有编写难、识别难、记忆难、查错难、交流难 等缺点。 2. 汇编语言(Assembly Language) 汇编语言是一种用助记符来表示的面向机器的程序设计 语言。不同的机器所使用的汇编语言一般是不同的。但计算 机的CPU不能直接识别汇编语言,所以计算机不能立即执行 汇编语言程序。用汇编语言编写的源程序,在由计算机执行 之前,必须将它翻译成机器语言程序。 特点:这种语言弥补了机器语言的不足,用汇编语言编写程序 比用机器语言方便、直观、易懂、易用、易记。可以编写出 结构紧凑、运行时间精确的程序。所以,这种语言非常适合 于实时控制的需要。 3. 高级语言(High-Level Language) 高级语言是面向过程并能独立于计算机硬件结构的通用 程序设计语言,是一种接近人类语言和数学表达式的计算机 语言。比如:BASIC、FORTRAN、COBOL、PASCAL、C语言等。 高级语言不能被计算机直接识别和执行,需要用编译程序或 解释程序将高级语言编写的源程序翻译为机器语言。 特点:它比汇编语言易学、易懂,具有通用性强、易于移植等 优点。高级语言的语句功能强,它的一条语句往往相当于许 多条指令,因而用于翻译的程序要占用较多的存储空间,而 且执行时间长,且不易精确掌握,故在高速实时控制中一般 是不适用的。 基本概念 n在目前单片机的开发应用中,经常采用C51语言和汇编语言共同编 写程序。要想很好地掌握和应用单片机首先要掌握汇编语言。 n汇编语言是面向机器的程序设计语言,对于CPU不同的单片机,其 汇编语言一般是不同的。用汇编语言编写的程序称为汇编语言源程 序 。 n汇编语言源程序是由汇编语言语句构成的。汇编语言语句可分为两 大类:指令性语句和指示性语句。 指令性语句是由指令组成的由CPU执行的语句, 指示性语句是由伪指令组成的,它不被CPU执行,用来告诉汇编程 序如何对程序进行汇编的指令;由于它不能生成机器语言,故又被 称为伪指令语句。 一、汇编语言程序设计概述 1.指令性语句格式 标号: 操作码助记符 目的操作数 ,源操作数 ;注释 每条汇编语句一般由若干部分组成,每一部分称为一个字段。 每个字段之间应该严格地用分界符加以分隔。 分界符包括冒号、空格符、逗号、分号等。标号段与操作码之间要加 冒号“:”;操作码与操作数之间要用空格相隔;各操作数之间要用 逗号“,”相隔;操作数与注释段之间要加分号“;”相隔。 标号是语句所在地址的标志符号 (1)标号后边必须跟以冒号“:” (2)由1-8个ASCII字符组成 (3)同一标号在一个程序中只能定义一次 (4)不能使用汇编语言已经定义的符号作 为标号 必须以分号“;”开头,换行书写, 但必须注意也要以分号“;”开头。 汇编时,注释字段不会产生机器代码 。 操作字段: (1)十六进制,后缀“H” 例:MOV A,#23H 二进制,后缀“B” 例:MOV A,#01010101B 十进制,后缀“D”,也可省略。 (2)若十六进制的操作数以字符A-F中的某个开头时,则需在它前面加一 个 “0”,以便在汇编时把它和字符A-F区别开来。 例:MOV A,#0FCH (3)采用工作寄存器和特殊功能寄存器的代号来表示,也可用其地址来 表示。 例:程序状态子可用PSW表示,也可用D0H来表示 (4)美元符号$的使用 用于表示该转移指令操作码所在的地址。例如,如下指令: HERE:SJMP HERE 可写为: SJMP $ 2.伪指令的指示性语句格式 标号: 伪操作 操作数,操作数, ;注释 伪指令不是真正的指令,是在汇编时供汇编程序识别的指令,又称为汇 编指令。 它不属于指令系统,也无对应的机器码,只是用来对汇编过程进行某种 控制。利用伪指令告诉汇编程序如何进行汇编,为编程提供方便。 常用伪指令常用伪指令 n n 定位伪指令定位伪指令ORGORG n n 定义字节数据伪指令定义字节数据伪指令DBDB n n 定义字数据伪指令定义字数据伪指令DWDW n n 定义空间伪指令定义空间伪指令DSDS n n 符号定义伪指令符号定义伪指令EQUEQU或或 n n 定义标号伪指令定义标号伪指令DLDL n n 数据赋值伪指令数据赋值伪指令DATADATA n n 数据地址赋值伪指令数据地址赋值伪指令XDATAXDATA n n 汇编结束伪指令汇编结束伪指令ENDEND ORG(Origin)汇编起始指令 ORG是程序汇编起始地址定位伪指令, 功能:是规定对汇编语言源程序进行汇编时,目的程序在程序存储器中存 放的起始地址。 格式:标号: ORG 16位地址或标号 注意:在一个源程序中,可多次使用ORG指令,以规定不同程序段的起始位 置,地址应从小到大顺序排列,不允许重叠。 例如: ORG 0000H START:SJMP MAIN ORG0030H MAIN: MOV SP,# 30H END(End)汇编结束指令 END是汇编语言程序结束伪指令。 功能:是表示程序已结束,汇编程序对END后面的指令不再汇编。 格式:标号: END 注意:在一个源程序中,只能有一条END指令,而且必须放在整个程序的末 尾。 EQU(Equate)赋值指令 EQU是赋值(也称等值)伪指令 。 功能:把操作数段中的数据或地址赋值给标号字段中的字符名称 。 格式:字符名称 EQU 数值或汇编符号 注意:字符名称必须先赋值后使用,故EQU指令通常放在源程序 的开头。 EQU可定义8位或16位的数据或地址, 例如: ORG 8500H AA EQUR1 A10 EQU10H DELAY EQU87E6H MOVR0,A10;R0(10H) MOVA,AA;A(R1) LCALL DELAY ;调用起始地址为87E6H的子程序 END DATA(Data)数据地址赋值指令 DATA是数据地址赋值伪指令 。 功能:把操作数段中的表达式的值赋给标号字段中的字符名称。 格式:字符名称 DATA 表达式 注意:DATA指令功能与EQU指令类似,它们的主要区别如下: lDATA定义的字符名称可以先使用后定义,DATA指令可以放在源程序的任何 位置,使用灵活。 lDATA只能用来定义8位的数据或地址。 lEQU可以把汇编符号赋给字符名称,而DATA只能把数据赋给字符名称。 lDATA可以把表达式的值赋给字符名称,这个表达式是可以进行求值运算 例:A1 DATA 345H A1 DATA A1+1 XDATA数据地址赋值指令 XDATA是数据地址赋值伪指令 。 功能:把操作数段中的表达式的值赋给标号字段中的字符名称 。 格式:字符名称 XDATA 表达式 注意:XDATA指令功能与DATA指令类似,它们的主要区别是XDATA可定 义16位的数据或地址。 BIT(Bit)位地址赋值指令 BIT是位地址赋值伪指令 。 功能:把位地址赋给字符名称 。 格式:字符名称 BIT 位地址 例如: AB BIT 30H ;AB与30H等值 AC BIT P1.0 ;AC与P1.0等值 MOV C,AB ;把位地址区30H单元中的数据送入 位累加器C中 CLR AC ;把P1.0中的内容清零 DB(Define Byte)定义字节指令 DB是定义字节伪指令 。 功能:从程序存储器指定地址单元开始存放若干个字节的数值或ASCII 码字符 。 格式:标号: DB 字节数据或ASCII码字符 注意:多个字节数据或ASCII码字符之间要用逗号相隔,DB指令常用于 定义8位的数据常数表。 例如: ORG 7F00H TAB: DB 01110010B,16H,45,8,A 汇编后存贮单元内容为: (7F00H)= 72H、(7F01H)= 16H、(7F02H)= 2DH (7F03H)= 38H、(7F04H)= 41H DW(Define Word)定义字指令 DW是定义字伪指令 。 功能:从程序存储器指定地址单元开始存放若干个字的数值 。 格式:标号: DW 字节数据或ASCII码字符 注意:多个字数据之间要用逗号相隔,DW指令常用于定义16位的地址表。 例如: ORG 6000H TAB: DW1254H,32H,161 汇编后存贮单元内容为: (6000H)= 12H (6001H)= 54H (6002H)= 00H (6003H)= 32H (6004H)= 00H (6005H)= 0A1H DS(Define Space)定义存储空间指令 DS是定义存储空间伪指令 。 功能:从程序存储器指定地址单元开始保留表达式的值所规定的存储单 元 。 格式:标号: DS 表达式 例如: ORG 1000H TAB: DS 06H DB 25H,35H 在上述源程序中,程序存储器从1000H单元开始保留6个单元, 1006H单元存放25H,1007H单元存放35H。 注:对8051单片机,DB、DW、DS等伪指令只能用于程序存 储器,而不能对数据存储器使用。 3. 汇编语言源程序的汇编 汇编语言源程序必须要转换为机器码(即目的程序),计算机才能 执行,这个转换过程称为汇编。 汇编语言源程序的汇编可分为手工汇编和机器汇编两类。 手工汇编是指用人脑通过查指令编码表(见附录中的指令表)把汇编语 言源程序翻译成机器码的过程,又称为人工代真。 机器汇编是用机器代替人脑并由专门的程序来进行的,这种程序称为 汇编程序(不同的指令系统汇编程序不同)。机器汇编由计算机自动完 成,汇编程序把用汇编语言编写的源程序翻译成由机器语言表示的目 的程序。用编辑软件进行源程序的编辑。编辑完成后,生成一个ASCII 码文件,扩展名为“.ASM”。 反汇编是在分析程序存储器已有的程序时,将机器语言翻译成汇编语 言的转换过程。 无论是高级语言还是汇编语言写的源程序都必须转换 成目标程序,单片机才能执行。目前很多公司都将编辑 器、汇编器、编译器、连接/定位器、符号转换程序做 成了软件包,称为集成开发环境,如Keil uVision、 Silicon Laboratories IDE等。 二、实用程序设计 n程序设计方法和技巧 n源程序的基本格式 n汇编语言程序设计举例 程序设计方法和技巧 1. 程序设计的一般步骤 (1) 分析工作任务,明确要达到的工作目的、技术指标等。 (2) 确定解决问题的算法。算法就是如何将实际问题转化成程序模块来处 理,要对不同的算法进行分析、比较,找出最适宜的算法。 (3) 画程序流程图。其图形的符号规定均与高级语言流程图相同,如桶形 框表示程序的开始或结束,矩形框表示需要进行的工作,菱形框表示需 要判断的事情,指向线表示程序的流向等。 (4) 分配内存工作单元,确定程序与数据的存放地址。 (5) 编写源程序。 (6) 上机调试、修改源程序。 2.程序设计的一般原则 按照尽可能使程序简短和缩短运行时间两个原则编写程序。 应用程序一般都由一个主程序(包括若干个功能模块)和多个子程序构 成,即采用模块化的程序设计方法。 每一功能模块或子程序都能完成一个明确的任务,实现某个具体功能 ,如检测输入信号、码制转换、输出控制信号、发送数据、接收数据 、延时、显示、打印等。 3. 模块化程序设计方法的特点 单个模块结构的程序功能单一,易于编写、调试和修改。 对程序的局部修改,可以使无关的部分保持不变。 程序可读性好,便于功能扩展和版本升级。 对于使用频繁的子程序可以建立子程序库,便于多个模块调用。 可实现多人同时进行程序的编写和调试工作,缩短程序编写时间。 4. 划分模块应遵循的原则 高内聚性。每个模块应具有独立的功能,能产生一个明确的结果。 低耦合性。模块之间的控制耦合应尽量简单,数据耦合应尽量少。控 制耦合是指模块进入和退出的条件及方式,数据耦合是指模块间的信 息交换(传递)方式、交换量的多少及交换的频繁程度。 模块长度适中。模块语句的长度为20100条的范围较合适。模块太长 时,分析和调试比较困难,失去了模块化程序结构的优越性;过短则 模块的连接太复杂,信息交换太频繁。 源程序的基本格式 ORG 0000H LJMP START ;转向主程序 ORG 0003H LJMP INTIE0 ;转向外部中断服务程序 ORG 0050H START:MOV A,#00H ORG 4500H INTIE0: DBLO:DB 43H,64H, ;表格参量 END ;结束 分支结构程序 循环结构程序 简单结构程序 查表程序 子程序 汇编语言程序设计举例 关键字查找程序设计 数据极值查找程序设计 数据排序程序设计 子程序设计 主要内容: 1. 主程序与子程序的关系 2. 子程序嵌套 3. 子程序的参数传递 n子程序是指完成某一专门任务并能被其他程序反复调用的 程序段。调用子程序的程序称为主程序或调用程序。使用 子程序的过程称为调用子程序。子程序执行完后返回主程 序的过程称为子程序返回。 n主程序和子程序是相对的,同一程序既可以作为另一程序 的子程序,也可以有自己的子程序。也就是说,子程序是 允许嵌套的,嵌套深度和堆栈区的大小有关。 n采用子程序能使整个程序结构简单,缩短程序设计时间, 减少对存储空间的占用。 主程序与子程序的关系 子程序SUB 主程序MAIN 返回 LCALL SUB 调用子 程序 子程序入 口地址 RET MAIN: ;MAIN为主程序或调用程序标号 LCALL SUB ;调用子程序SUB SUB:PUSH PSW;现场保护 PUSH ACC; 子程序处理程序段 POP ACC;现场恢复 POP PSW; RET;最后一条指令必须为RET 典型的子程序的基本结构 注意: n子程序的第一条指令的地址称为子程序的入口地址,该指 令前应有标号。 n在子程序末尾用RET返回指令从子程序返回主程序。 n根据需要保护现场和恢复现场。在子程序的开始,使用压 栈指令把需要保护的内容压入堆栈;在返回主程序前,使 用弹出指令把堆栈中保护的内容送回原来的存储单元中。 子程序中有可能要使用累加器A或工作寄存器,在子程序使 用它们之前,把它们中可能存有的主程序的中间结果保存 起来,这一过程称为保护现场。在子程序执行完并将返回 主程序之前,再将这些中间结果取出,送回到累加器A或原 来的工作寄存器中,这一过程称为恢复现场。 n子程序中应尽量使用相对转移指令而不使用其他转移指令 ,以便子程序放在内存的任何区域都能被主程序调用。 n要正确地设置堆栈指针,以避免堆栈区与工作寄存器或其 他存储单元发生冲突。 ORG0000H MAIN:MOVA,#0FEH ;送显示初值 LP:MOVR0,#10;送闪烁次数 LP0:MOVP1,A;点亮LED LCALLDELAY;延时 MOVP1,#0FFH;熄灭灯 LCALLDELAY;延时 DJNZR0,LP0 RLA SJMPLP END 实例:P1口连接的8个LED依次循环闪烁10次 延时 次数-1=0 点亮相应的LED Y N 熄灭相应的LED 延时 初值左移1位 指向下一个LED 设闪烁次数 送显示初值 开始 子程序嵌套 子程序嵌套(或称多重转子)是指在子程序执行过程中, 还可以调用另一个子程序。 问题:问题:子程序调用、返回到主程序中的正确位置,并接 着执行主程序中的后续指令呢? 为了解决这个问题,我们采用了堆栈技术。 子程序嵌套 子程序SUB1 主程序MAIN RET 子程序SUB2 RET 2010 2013 2110 2113 21002200 20 13 20 13 PC 21 13 13 21 堆栈指针SP堆栈 LCALL SUB1 LCALL SUB2 21 1320 13 子程序嵌套范例:LED灯闪烁(二) ORG 0000H MAIN: MOV A,#0FEH;送显示初值 COUN: ACALL FLASH;调闪烁子程序 RL A;A左移,下一个灯闪烁 SJMP COUN ;循环不止 FLASH: MOV R0,#10;送闪烁次数 FLASH1: MOV P1,A;点亮LED LCALL DELAY;延时 MOV P1,#0FFH;熄灭灯 LCALL DELAY;延时 DJNZ R0,FLASH1;闪烁次数不够10次,继续 RET DELAY: MOV R3,#0FFH ;延时子程序 DEL2: MOV R4,#0FFH DEL1: NOP DJNZ R4,DEL1 DJNZ R3,DEL2 RET END 子程序的参数传递 范例:计算平方和范例:计算平方和c=ac=a 2 2 +b+b 2 2 ,a,a存放在存放在31H 31H,b b存放在存放在32H32H,结果 ,结果c c存放在存放在33H33H ORG0000H ;主程序 MOVSP,#3FH ;设置栈底 MOVA,31H ;取数a存放到累加器A中作为入口参数 LCALL SQR ;计算a a 2 2 MOVR1,A ;出口参数平方值存放在A中 MOVA,32H ;取数b存放到累加器A中作为出口参数 LCALL SQR ;计算b b 2 2 ADDA,R1 ;求和 MOV33H,A ;存放结果 SJMP$ ; ;子程序:子程序:SQRSQR ; ;功能:通过查表求出平方值功能:通过查表求出平方值y=xy=x 2 2 ; ;入口参数:入口参数:x x存放在累加器存放在累加器A A中中 ; ;出口参数:求得的平方值出口参数:求得的平方值y y存放在存放在A A中中 ; ;占用资源:累加器占用资源:累加器A A,数据指针数据指针DPTRDPTR SQR:PUSH DPH ;保护现场,将主程序中DPTR的高八位放入堆栈 PUSH DPL ;保护现场,将主程序中DPTR的低八位放入堆栈 MOV DPTR,#TABLE ;在子程序中重新使用DPTR,表首地址DPTR MOVC A, A+DPTR ;查表 POP DPL ;恢复现场,将主程序中DPTR的低八位从堆栈中弹出 POP DPH ;恢复现场,将主程序中DPTR的高八位从堆栈中弹出 RET TABLE: DB 0,1,4,9,16,25,36,49,64,81 n传送子程序参数的方法 l利用寄存器或片内RAM传送参数。可以把入口参数存放到寄 存器或片内RAM中传送给子程序,也可以把出口参数存放到 寄存器或片内RAM中传送给主程序。 l利用寄存器传送参数的地址。把存放入口参数的地址通过 寄存器传送给子程序,子程序根据寄存器中存放入口参数 的地址便可找到入口参数并对它们进行相应操作;出口参 数的地址也可通过寄存器传送给主程序。 l利用堆栈传送参数。可以用压栈指令PUSH把入口参数压入 堆栈传送给子程序,也可以使用压栈指令PUSH把出口参数 压入堆栈传送给主程序。 子程序设计注意事项 (1)要给每个子程序起一个名字,也就是入口地址的代号。 (2)要能正确地传递参数。即首先要有入口条件,说明进入 子程序时,它所要处理的数据放在何处(如:是放在A中还是放 在某个工作寄存器中等)。另外,要有出口条件,即处理的结 果存放在何处。 (3)注意保护现场和恢复现场。在子程序使用累加器、工作 寄存器等资源时,要先将其原来的内容保存起来,即保护现场 。当子程序执行完毕,在返回主程序之前,要将这些内容再取 出,送还到累加器、工作寄存器等原单元中,这一过程称为恢 复现场。 n在单片机的实际应用中,经常要对一些数据进行函数运算, 例如求平方、正弦函数等,为了提高单片机执行程序的速度 ,一般将某函数的全部函数值按一定的规律编成表格存放到 程序存储器中。 n查表程序就是根据某数据的函数运算要求,按索引号从程序 存储器中查找与之相对应的函数值的程序结构。 n设计查表程序时,主要通过两条查表指令实现查表功能。 MOVC A,A+DPTR MOVC A,A+PC 查表程序 例 用查表法计算平方(1) ORG 0000H MOV DPTR,#TABLE ;表首地址送DPTR MOV A,#05;被查数字05A MOVC A,A+DPTR ;查表求平方 SJMP $ TABLE:DB 0,1,4,9,16,25,36,49,64,81 END 例 用查表法计算平方(2) ORG 0000H MOV A,#05 ;05 A ADDA,#02 ;修正累加器A MOVC A,A+PC ;查表求平方 SJMP $ DB 0,1,4,9,16,25,36,49,64,81 END 74H 05H 24H 02H 83H 80H FEH 00H 01H 04H 09H 10H 19H 24H 31H 40H 51H 00H 0000H 0001H 0002H 0003H 0004H 0005H 0006H 0007H 0008H 0009H 000AH 000BH 000CH 000DH 000EH 000FH 0010H 0011H 例:设有一巡回检测报警装置,需对16路输入量进行测量控制,每 路有一个最大允许值。控制时根据测量的路数,找出该路的最大允 许值。测量的路数保存在R2中,最大值结果保存在R3R4中。 解:利用查表程序完成。 LTB:MOVA,R2 ADDA,R2 MOVR3,A ADDA, #6 MOVC A,A+PC XCHA,R3 ADDA, #3 MOVC A, A+PC MOVR4,A RET MAX:DW1520,3721,445,7850 DW3483,32657,883,9943 DW1101,40511,6756,331 DW4468,5871,13224,9981 解:利用查表程序完成。 LTB:MOVA,R2 ADDA,R2 MOVR3,A MOVDPTR,#MAX MOVC A,A+DPTR XCHA,R3 INCA MOVC A,A+DPTR MOVR4,A RET MAX:DW1520,3721,445,7850 DW3483,32657,883,9943 DW1101,40511,6756,331 DW4468,5871,13224,9981 数据极值查找程序设计 在指定的数据区中找出最大值(或最小值)。 进行数值大小的比较,从这批数据中找出最大值(或最小值 )并存于某一单元中。 例 片内RAM中存放一批数据,查找出最大值并存放于首地址 中。设R0中存首地址,R2中存放字节数。 MOV R2,n;n为要比较的数据字节数 MOV A,R0;存首地址指针 MOV R1,A DEC R2 MOV A,R1 LOOP:MOV R3, A DEC R1 CLR C SUBB A,R1;两个数比较 JNC LOOP1;C=0,A中的数大,跳LOOP1 MOV A,R1;C=1,则大数送A SJMP LOOP2 LOOP1:MOV A,R3 LOOP2:DJNZ R2, LOOP ;是否比较结束? MOV R0, A ;存最大数 RET 例 片内RAM中存放一批数据,查找出最大值并存放于首地 址中。设R0中存首地址,R2中存放字节数。 n分支程序是根据程序的要求改变程序的执行顺序,并根据条 件对程序的流向进行判断的程序结构。 n程序中有转移指令包括无条件转移(AJMP、SJMP、LJMP)、条 件转移(JZ、JC、JB等)和散转指令(JMP A+DPTR) n分支程序一般有两个或两个以上的出口。 n分支程序又分为单分支和多分支结构。 分支结构程序 单分支选择结构 多分支选择结构 程序如下: ORG 0000H AJMP MAIN ORG 0100H MAIN:MOV A,30H CJNE A,#24H,DY31 ; 不是“$”,转去 DY31 MOV 40H,A ;是“$”,存入40H单 元 AJMP END0 DY31:MOV 31H,A ; 不是$,存入31H单元 END0:SJMP $ END 1单分支程序 单分支程序 例: 已知内RAM30H单元存有一个ASCII码,试对其进行判断,如 果是“$”(24H),将其存入40H,否则存入31H单元。 例 已知某信号灯电路如图所示,试编程实现如下功能: S0单独按下,红灯亮,其余灯灭; S1单独按下,绿灯亮,其余灯灭; S0、S1均按下,红、绿、黄灯全亮; 都不按下黄灯亮。 参考程序如下: ORG 0000H LJMP START ORG 0100H START:ORL P1,#11000111B ;P1.6、P1.7设为输入,红绿黄灯灭 多分支程序 SS0: JB P1.7,SS1 ;S0未按,转判S1 JB P1.6,RED ;S0按下,S1未按,转红灯亮 DL:CLR P1.2 ;红灯亮 CLR P1.1 ;绿灯亮 CLR P1.0 ;黄灯亮 SJMP SS0 ;重新检测 SS1:JB P1.6,YELLOW ;S0未按,S1未按,转黄灯亮 GREEN:CLR P1.1 ;绿灯亮 SETB P1.2 ;红灯灭 SETB P1.0 ;黄灯灭 SJMP SS0 RED:CLR P1.2 ;红灯亮 SETB P1.1 ;绿灯灭 SETB P1.0 ;黄灯灭 SJMP SS0 YELLOW:CLR P1.0 ;黄灯亮 SETB P1.2 ;红灯灭 SETB P1.1 ;绿灯灭 SJMP SS0 END 说明:如果真要实现信号灯的点亮,还要在每段灯 亮灭指令后加一段延时程序。 n循环程序的结构一般包括以下几部分。 l循环初始化是进入循环处理前必须要有的一个环节,用于完成循 环前的准备工作。循环初始化包括给工作寄存器(或其他存储单元)设 置计数初值、地址指针、数据块长度等。 l循环处理是需要多次重复执行的程序段。循环处理是循环程序的 核心,用于完成主要的计算和操作任务。 l循环控制是用条件转移指令控制循环是否继续。每循环一次,根 据循环结束条件进行一次判断;当满足条件时,停止循环,继续执行 其他程序;否则,再作循环。 l循环结束用于存放循环程序的执行结果,同时恢复相关工作单元 的初值。 循环结构程序 n循环程序的特点和设计方法。 l程序结构紧凑,占用存储单元较少,程序中间有分支,循 环程序本质上是分支程序的一种特殊形式。 lDJNZ指令使用得较多,凡是分支程序中可以使用的控制转 移类指令,循环程序一般都可以使用。 l循环控制的形式有多种。计数循环是最常用的一种,它先 预置计数初值,再用 DJNZ指令控制循环次数;条件循环也 是较常用的一种,它先预置结束循环的条件,再用CJNE指 令、JZ指令或JB指令控制循环的结束。 先判断后处理 先处理后判断 两重循 循环程序流程图 循环程序流程图 程序流程图 开始 循环控制 循环结束 循环处理 循环初始化 结束 Y N 条件满足? 循环控制2 循环结束 循环处理1 循环初始化1 结束 Y N 循环处理2 循环初始化2 Y N 循环控制1 开始 条件满足? 条件满足? 多重循环程序中的各重循环不能有交叉,不 能从外循环跳入内循环,只能外循环内嵌套 内循环。 【例】 片内RAM中存放有10个数据,首地址为30H,编程将数 据块传送到片外RAM以1000H为首地址的存储单元中。 解:该程序是单重循环程序,片内RAM首地址30H、片外RAM首 地址1000H和数据块长度10都是循环初始化的内容。 循环控制是对数据块长度进行判断,每传送一个数据 ,存放数据块长度的寄存器减1;10个数据传送完,存放数 据块长度的寄存器内容正好为零,退出循环。 ORG 0000H LJMP MAIN ORG 0100H MAIN: MOV R1,#30H;置片内RAM地址指针针30H MOV DPTR,#1000H;置片外RAM地址指针针1000H MOV R2,#10;数据块块的长长度 LOOP: MOV A,R1;从片内RAM取数据 MOVX DPTR,A;数据传传送到片外RAM INC R1;修改片内RAM地址指针针 INC DPTR;修改片外RAM地址指针针 DJNZ R2,LOOP;循环环次数未到10次,转转移 SJMP $ END 【例】 片内RAM中存放有10个数据,首地址为30H,编程将数 据块传送到片外RAM以1000H为首地址的存储单元中。 例 工作单元清零。 在应用系统程序设计时, 有时经常需要将存储器中各部分 地址单元作为工作单元, 存放程序执行的中间值或执行结果 , 工作单元清零工作常常放在程序的初始化部分中。 设有50个工作单元, 其首址为外部存储器8000H单元, 则 其工作单元清零程序如下: 单片机与一般集成电路的区别在于可编程应用,程序是单 片机应用系统的灵魂.由于汇编语言是面向机器的语言,因此 对单片机系统进行程序设计时必须考虑硬件资源的配置。 程序设计的方法和技巧 尽量采用模块化程序设计方法 ; 这种设计方法是把一个完整的程序分成若干个功能 相对独立的、较小的程序模块,对各个程序模块分别进行 设计、编制程序和调试,最后把各个调试好的程序模块装 配起来进行联调,最终成为一个有实用价值的程序。 模块化程序设计的优点是:对单个程序模块设计和 调试比较方便、容易完成,一个模块可以被多个任务共用 。 尽量采用循环结构和子程序结构 ; 采用循环结构和子程序结构,可以使程序的总容量 减小,提高程序的效率,节省内存。 尽量少用无条件转移指令 ; 少用无条件转移指令,可以保证程序的条理更加清晰, 从而减少错误发生。 充分利用累加器; 累加器是主程序和子程序之间信息传递的桥梁,利用累 加器传递入口参数或返回参数比较方便。这时,一般不要把 累加器内容压入堆栈。 对于通用子程序要保护现场; 由于子程序的通用性,除了保护子程序入口参数的寄存 器内容外,还要对子程序中用到的其它寄存器内容一并入栈 保护。 对于中断处理,还要保护程序状态字 在中断处理程序中,既要保护处理程序中用到的寄存器 内容,还要保护程序状态字PSW。否则,当中断服务程序执 行结束返回主程序时,整个程序的执行可能会被打乱。 单片机 C 语言程序设计 C51语言 nC语言是一种编译型程序设计语言,它兼顾 了多种高级语言的特点,并具备汇编语言的 功能。目前,使用C语言进行程序设计已经 成为软件开发的一个主流。用C语言开发系 统可以大大缩短开发周期,明显增强程序的 可读性,便于改进和扩充。而针对8051的C 语言日趋成熟,成为了专业化的实用高级语 言。 C语言作为一种非常方便的语言而得到广泛的支持 ,国内最通用的是Keil C51. C语言程序本身不依赖于机器硬件系统,基本上不 作修改就可将程序从不同的单片机中移植过来。 C提供了很多数学函数并支持浮点运算,开发效率 高,故可缩短开发时间,增加程序可读性和可维护 性。 C-51的特点 C-51与ASM-51相比,有如下优点: 1. 对单片机的指令系统不要求了解,仅要求对 8051 的存贮器结构有初步了解; 2. 寄存器分配、不同存贮器的寻址及数据类型 等细节可由编译器管理; 3. 程序有规范的结构,可分成不同的函数,这 种方式可使程序结构化; 4. 提供的库包含许多标准子程序,具有较强的 数据处理能力; 5. 由于具有方便的模块化编程技术,使已编好 程序可容易地移植; C51程序结构 n 同标准C一样,C51的程序由一个个函数组成,这里 的函数和其他语言的“子程序”或“过程 ”具有相同的 意义。其中必须有一个主函数main(),程序的执行从 main()函数开始,调用其 他函数后返回主函数main(), 最后在主函数中结束整个程序而不管函数的排列顺序如何 。 数据的存贮类型和存贮模式 n C51是面向8XX51系列单片机及硬件控制系 统的开发语言,它定义的任何变量必须以一定 的存贮类型的方式定位在8XX51的某一存贮区 中,否则便没有意义。因此在定义变量类型时 ,还必须定义它的存贮类型。 存储器 类型 存储区域大小对应 的汇编语 句描述 code程序存储区64KB MOVC A,A+DPTR 用来说明常量 data 直接寻址的内 部数据存储区 128B MOV XX,#ADDR 访问 速度快 idata 间接寻址的内 部数据区 256BMOV XX,Rn 可访问 整个内部数 据区域 bdata 位寻址的内部 数据存储区 16B 可使用位寻址或字 节寻 址来访问这 一 区域 xdata 外部数据存储 或 64KB MOVX A,DPTR 使用DPTR来访问 外 部数据存储器 far 扩充的RAM和 ROM 使用用户定义的专 用例程或特殊芯片指 令扩展命令 pdata 分页的外部数 据存储区 256BMOVX A,Rn 利用R0,R1来访问 分 页的外部数据存储 器 ndata char var; /*字符变量var定位在片内数据存贮区*/ nchar code MSG=PARAMETER:; /*字符数组MSG 定位在程序存 贮区*/ nunsigned long xdata array100; /*无符号长型数组定位在 片外RAM区*/ nfloat idata x,y,z; /*实型变量x,y,z,定位在 片内用间址访问的内部RAM区*/ nunsigned int pdata sion;/*无符号整型变量sion定位在分页的外部 RAM*/ nunsigned char xdata vector1044 /*无符号字符型三维数 组, 定位在片外RAM区*/ nchar bdata flags; /*字符变量flags定位在可位寻址内部RAM区*/ C51数据类型(1) 数据类型C51专 用 长度取值范围 signed char单字节-128 to +127 unsigned char单字节0 to 255 signed short2字节-32768 to +32767 unsigned short2字节0 to 65535 signed int2字节-32768 to +32767 unsigned int2字节0 to 65535 signed long4字节-2147483648 to +214746483647 unsigned long4字节0 to 4294967295 float4字节1.175494E-38 to 3.402823E+38 *13字节对象的地址 enum 1或2字 节 -128 to +127 或 -32768 to +32767 C51数据类型(2) sfr:特殊功能寄存器声明 sfr16:sfr的16位数据声明 sbit:特殊功能位声明 bit:位变量声明 C51对SFR、可寻址位、存储器和I/O口的定义 n特殊功能寄存器SFR定义 nC51提供了一种自主形式的定义方式,使用特定关键字sfr 如 sfr SCON=0x98; /*串行通信控制寄存器地址 98H*/ sfr TMOD=0x89; /*定时器模式控制寄存器地址 89H*/ sfr ACC=0xe0; /*A累加器地址E0H*/ sfr P1=0x90; /*P1端口地址90H*/ 定义了以后,程序中就可以直接引用寄存器名。 n C51也建立了一个头文件reg51.h (增强型为reg52.h),在 该文件中对所有的特殊功能寄存器的进行了sfr定义, 对 特殊功能寄存器的有位名称的可寻址位进行了sbit定义, 因此,只要用包含语句#include,就可以直接引 用特殊功能寄存器名,或直接引用位
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年数字化技术在服饰零售门店顾客体验提升中的应用报告
- 2025年数字人民币跨境支付技术演进与支付风险控制报告
- 2025年绿色消费教育对消费者行为引导的影响及绿色产品营销效果报告
- 文明乡风培训课件
- 2025年短视频平台内容监管与市场规范研究报告
- 2025年生态农业循环经济示范园农业废弃物资源化利用与循环经济模式研究
- 车间监控培训课件内容
- 机械厂消防安全知识培训课件
- MTP3-ligand-1-生命科学试剂-MCE
- 论语中的交友之道
- 食堂自带碗筷管理制度
- 延期退休协议书范本
- 2025会计基础工作规范
- 老年防诈骗知识讲座课件
- 兽药生产经营使用管理
- 护理安全警示:跌倒与坠床
- 2025年全家岗前培训考试题及答案
- 知识产权管理评审报告
- 尿毒症伴心梗个案护理
- 化学实验室通风柜安装安全操作规程
- 【川剧剧本欣赏】《白蛇传》
评论
0/150
提交评论