单片微型计算机C第8-9讲(机械).ppt_第1页
单片微型计算机C第8-9讲(机械).ppt_第2页
单片微型计算机C第8-9讲(机械).ppt_第3页
单片微型计算机C第8-9讲(机械).ppt_第4页
单片微型计算机C第8-9讲(机械).ppt_第5页
已阅读5页,还剩56页未读 继续免费阅读

下载本文档

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

文档简介

1、,Microcontrollers Principle and Applications,单片机原理及应用,C,上节内容回顾,MCS51单片机的指令 数据传送类(28条) 算术运算类(24条) 逻辑运算类(25条) 控制转移类(17条) 位操作类(17条),练习,已知累加器A当前的内容为23H,进位位C为1,执行下列指令后,累加器A和进位位C各为多少? ANL A,#7FH ORL A,#35 XRL A,#FFH RLC A CJNE A,#40H,AA INC A SJMP BB AA:ADD A,#23H BB:SJMP $,第8-9讲教学目的和要求,【教学目标】通过讲述MCS-51单片

2、机的汇编语言程序设计的基本步骤、基本方法,使学生对指令系统有进一步的认识和理解,同时使得学生掌握使用汇编语言进行程序设计的方法,通过实例加以巩固。 【教学重点】单片机程序设计的基本方法; 查表、差值运算、译码等简单程序设计方法; 【教学难点】如何将实际问题转换成单片机能识别和解决的问题,第五章 MCS-51的汇编语言程序设计,5.1 汇编语言程序设计概述,语言的发展 机器语言(Machine Language):二进制表示指令和数据,能被机器直接识别的计算机语言。速度快、占用内存少。 汇编语言(Assembly Language):采用助记符表示的程序设计语言。内存空间少,而且执行速度快,但移

3、植性差。 高级语言(High Level Language):高级语言则是面向用户的语言,移植性较好。 MCS51单片机支持用汇编语言和C高级语言进行编程,在单片机内部最终转换成机器语言存储和运行。,源程序的编辑与汇编,解决实际问题时,往往需要根据业务逻辑和支持的指令,完成程序的编写、调试、编译、烧制等过程。,汇编语言程序的结构,汇编语言程序的四分段书写格式,5.1.1 指令的格式,注意: 标号:表示该指令所在的符号地址,一般由字母和数字组成,第一位为字母,其余位为字母、数字任选。 操作助记符不能缺少; 操作数个数可为:1、2、3个,根据指令本身而定; 2个操作数的指令,目的操作数在左边;,一

4、般格式 标号:操作助记符 目的操作数,源操作数;注释,汇编程序设计中,每一行书写一条指令。,指令的补充说明,所有的符号均为英文符号,尤其注意常用的”,”、”;”。若书写错误,编译程序将提示“不能识别的符号”。 标号的书写 标号后必须跟冒号。 标号最大支持18个字符,且必须以字母开头 同一标号在一个程序中只能定义一次 不允许用系统保留字作为标号 一般只有别的指令需要访问的语句才有标号 汇编时,汇编程序自动将标号转换成地址。,指令的补充说明,立即数和直接地址的书写 若是十进制数,后缀可无,也可以写D;其他进制必须带后缀。二进制B、八进制O、十六进制H。 可以是字符串,如A、YU,编译时自动转换成其

5、ASCII 可以是指令的标号 美元符号$的使用。$符号表示当前地址,一般在程序结束或原地跳转时使用,以下两条指令等价: HERE:SJMP HERE SJMP $,5.1.2 伪指令,伪指令,也称汇编命令。仅对汇编过程进行指示,方便汇编程序将代码转换成机器代码。 伪指令无对应的单片机可执行代码 伪指令具有控制汇编程序的输入输出、定义数据和符号、条件汇编,分配存储空间等功能。 快速理解伪指令:如分配存储空间伪指令,汇编程序在编译时,根据伪指令的指示,完成存储空间的划分、初值的置入等工作。无需单片机去执行。,5.1.2.1 ORG伪指令,起始地址设定伪指令 用于指定接下来指令在ROM中的存放位置

6、使用格式:ORG 16位地址(以四位十六进制方式书写) 举例:有如下指令段 ORG 2000H START:MOV A,#00H 注意 ORG可以多次使用 使用顺序必须由小到大,ORG 伪指令, ORG 2500H ORG 2000H ORG 3000H, ORG 2000H ORG 2500H ORG 3000H,错误的书写方式,正确的书写方式,5.1.2.2 END伪指令,汇编终止伪指令 用于告诉汇编程序,将某一段源程序翻译成机器指令的工作到此为止。后面的指令将忽略。 在整个源程序的最后添加END语句。 举例 MOV A,#12H MOV A,#23H END MOV A,#45H,5.1

7、.2.3 DB 伪指令,定义字节数据表伪指令 用于从指定地址开始,在ROM的连续单元中定义字节数据 格式:标号: DB 字节数据表。用”,”分割表中的多个数 举例: ORG 1000H TABLE:DB 20H,32,A,8 编译时: 十进制等自动转换成十六进制 字符转换成ASCII码,ASCII码表,09 :30H39H AZ:41H5AH az :61H7AH,5.1.2.4 DW 伪指令,定义字数据表伪指令 从指定地址开始,在ROM的连续单元中定义16位的数据字 格式:标号: DW 字数据表。用”,”分割表中的多个字 举例: ORG 2000H TABLE:DW 1246H,10,5.1

8、.2.5 EQU 伪指令,用于给标号赋值 赋值后,后续程序中可用此标号表示对应的数据 格式:标号 EQU 数据或汇编表达式。 举例: LEN EQU 10*3 SUM EQU 21H MOV R7,LEN MOV SUM, A,对于常用的常量,采用此种方式后,当该常量发生变化时,无需频繁更改主程序内容,只需修改之前的赋值语句即可。,5.1.2.6 BIT 伪指令,将位地址定义成为符号名指令 赋值后,后续程序中位地址可直接用符号名表示,增加程序的可读性。 格式:符号名 BIT 位地址表达式。 举例: ST BIT P1.0 ;将P1.0的位地址赋给符号名ST CF BIT 0D7H ;将位地址为

9、D7H的位定义为符号名 注意: 用BIT定义的“符号名”一经定义便不能重新定义和改变,5.2汇编语言程序设计步骤,分析问题 根据任务的要求,确定程序的功能要求、输入输出、解决步骤等问题。 算法设计 将实际问题转化为计算机处理的程序算法 算法比较与优化(内存需求与运行速度),汇编语言程序设计步骤,流程描述 将算法的内容用流程图的形式表示,更加直观。,典型外设查询程序流程,汇编语言程序设计步骤,分配内存等资源 将片内RAM资源合理分配,把内存区、堆栈区、各种缓冲区进行合理分配。确定每个区域的首地址,便于编程使用。 程序的编写与调试 根据以上工作,结合MCS51单片机的指令系统,完成源代码的编写,并

10、上机调试,考查各种边界情况。,源程序的编辑,依据汇编语言规则 用好伪指令 符号不用中文 SJMP $ 用于调试 以 .ASM存盘,ORG 0000H LJMP MAIN ORG 0040H MAIN:MOV R7,#16 MOV R0,#60H MOV A,#55H LOOP:MOV R0,A INC R0 DJNZ R7,LOOP SJMP $ END,程序汇编及连接,源程序的汇编 汇编源程序转为目标程序的过程叫汇编 汇编通常在Windows下的集成开发环境完成 用A51.EXE汇编生成.OBJ、.LIB及.LST 目标程序的连接 .OBJ、.LIB经BL51.EXE生成无扩展名的绝对地址目

11、标文件 绝对地址目标文件可以用于仿真器调试 调试无误的目标文件用OH51.EXE转换为.HEX文件 .HEX文件经编程器写入单片机存储器,注意事项,强化模块观念 程序模块(主程序模块、各种子程序模块) 模块化优点:分块设计、便于阅读、调试方便 采用循环和子程序 使程序占用空间减少、结构清晰 循环初值和结束条件,避免“死机”现象 子程序的现场保护(注意栈平衡、寄存器内容),5.3汇编语言程序基本结构,汇编语言程序主要包含四种结构 顺序结构 分支结构 循环结构 子程序结构,5.3.1 顺序结构,指令执行时,其执行顺序按照指令在存储器中的存放顺序进行的。,【特点】 顺序执行,程序通常简单; 无分支、

12、无循环、无转移 图中无判断框;,顺序结构举例1,数据传送:内部RAM的2AH2EH单元中存储的数据如图所示。试编写程序实现图示的数据传送结果。,方法1,内部RAM的2AH2EH单元内容传递至2BF2EF、A中。,MOV A,2EH ;2字节,1个机器周期 MOV 2EH,2DH ;3字节,2个机器周期 MOV 2DH,2CH ;3字节,2个机器周期 MOV 2CH,2BH ;3字节,2个机器周期 MOV 2BH,#00H ;3字节,2个机器周期,使用14个字节的指令代码,执行时间为9个机器周期,78H,56H,34H,12H,00H,方法2,内部RAM的2AH2EH单元内容传递至2BF2EF、

13、A中。,CLR A ;1字节,1个机器周期 XCH A,2BH ;2字节,1个机器周期 XCH A,2CH ;2字节,1个机器周期 XCH A,2DH ;2字节,1个机器周期 XCH A,2EH ;2字节,1个机器周期,使用9个字节的指令代码,执行时间为5个机器周期,00H,12H,00H,34H,12H,56H,34H,78H,56H,顺序结构举例2,码制转换:片内RAM的21H单元存放一个十进制数据十位的ASCII码,22H单元存放该数据个位的ASCII码。编写程序将该数据转换成压缩BCD码存放在20H单元。,数字字符的ASCII码为30H+数 如字符3的ASCII码为33H。 右侧表示存

14、放的为数据64。,64H,程序,ASCII到压缩BCD码的转换,分析 取21H单元低位数据,移至高位 取22H单元内容,去掉高位 上述结果组合,传送至20H单元,64H,程序,ASCII到压缩BCD码的转换程序,ORG 0040H START: MOV A,21H ;取十位ASCII码 ANL A,#0FH ;保留低半字节 SWAP A ;移至高半字节 MOV 20H,A ;存入20H单元 MOV A,22H ;取个位ASCII码 ANL A,#0FH ;保留低半字节 ORL 20H,A ;合并到结果单元 SJMP $ END,36H,06H,60H,60H,34H,04H,64H,顺序结构举

15、例3,查表程序:有一变量存放在片内RAM的20H单元,其取值范围为:00H05H。要求编制一段程序,使用查表指令,根据变量值求其平方值,并存入片内RAM的21H单元。,X2,查表操作程序,ORG 1000H START:MOV DPTR,#TABLE MOV A,20H MOVC A,A+DPTR MOV 21H,A SJMP $ ORG 2000H TABLE:DB 00,01,04,09,16,25 END,练习,根据累加器A的值(0 7FH)查平方表,求平方值,结果放在BA中。,TABLE:DW 0000H,0001H,0004H,0009H DW 0010H,0019H,MOV DPT

16、R,#TABLE MOVC A,A+DPTR MOV B,A INC A MOVC A,A+DPTR,RL A PUSH ACC,POP ACC,MOV DPTR,#TABLE RL A PUSH ACC MOVC A,A+DPTR MOV B,A POP ACC INC A MOVC A,A+DPTR,5.3.2 分支结构,指令执行时,根据不同的情况执行不同的程序段。,单分支 双分支 多分支,单分支结构,设累加器A中存储有符号数的原码,编程转换成补码,CMPT:JNB Acc.7, RETURN MOV C,Acc.7 CPL A ADD A,#1 MOV Acc.7,C RETURN:SJ

17、MP $ END,双分支结构,设变量x以补码的形式存放在片内RAM的30H单元,变量y与x的关系是: 当x0时,y=x; 当x=0时,y=20H; 当x0时,y=x+5。 编制程序,根据x的大小求y并送回30H单元。,判断结果为0,可通过执行JZ rel来实现 判断补码的正负,可通过最高位来判断 先与,保留最高位,再判断结果是否为零来实现,双分支结构,设变量x以补码的形式存放在片内RAM的30H单元,变量y与x的关系是: 当x0时,y=x; 当x=0时,y=20H; 当x0时,y=x+5。 编制程序,根据x的大小求y并送回30H单元。,双分支结构,START:MOV A, 30H ;取x至累加

18、器 JZ NEXT ;x = 0,转NEXT NEXT:MOV 30H,#20H DONE: SJMP $ END,ANL A, #80H ;否,保留符号位 JZ DONE ;x 0,转结束,MOV A, #05H ;x 0处理 ADD A, 30H MOV 30H, A ;X+05H送Y,SJMP DONE,5.3.3 循环结构,按某种控制规律重复执行的程序称为循环程序。循环程序有先执行后判断和先判断后执行两种基本结构。,例1 延时程序,编写一段延时50ms的程序 若晶振频率为12MHz,则一个机器周期为1s,延时50ms,则程序的执行时间为50000个机器周期。 立即数取指在0255之间,

19、可考虑200*250=50000。 需要用到减1,结果不为0则重复的指令。 执行一条DJNZ指令需要2个机器周期,即 2s。采用循环计数法实现延时,需要用到双重循环。,延时程序,DEL: MOV R7,#200 ;1 s DEL1:NOP ; 1 s DEL1: MOV R6,#? ;1 s NOP ;1 s DEL2:DJNZ R6,DEL2 ;2s DJNZ R7,DEL1 ;2s,DEL1: MOV R6,#123 ;1 s,共计 (21232 2)200+1 s,即50.001ms,例2 未知次数的循环,将内部RAM中起始地址为data的数据串传送到外部RAM中起始地址为buffer的

20、存储区域内,直到发现$ 字符停止传送。,问题 何时终止传送? 对取出的数进行与S进行比较,判断是否相等。 用CJNE,例2 未知次数的循环程序,将内部RAM中起始地址为data的数据串传送到外部RAM中起始地址为buffer的存储区域内,直到发现$ 字符停止传送。,MOV R0,#data MOV DPTR,#buffer LOOP: MOV A,R0 CJNE A,$,继续执行地址 结束,LP:MOVX DPTR,A INC R0 INC DPTR SJMP LOOP LP2: SJMP $ END,SJMP LP2,CJNE A,$,LP,5.4 子程序及其调用,在实际应用中,经常会遇到一

21、些带有通用性的问题,在一个程序中可能要使用多次。这时可以将其设计成通用的子程序供随时调用,减少代码冗余。 一个程序中可以多次调用一个子程序 多个程序可以调用一个子程序 子程序可以调用子程序,最多支持8级 调用子程序时,单片机能自动保存PC内容,遇RET返回时,能自动恢复PC,子程序结构,子程序编写完成后,使用 ACALL 函数名(短距离调用) LCALL 函数名(整个ROM区调用) 此处的函数名,实际上是一个标号,编译后形成具体的地址。 子程序的处理过程中,可能要影响PSW、ACC,以及其他的一些功能寄存器,若这些影响是子程序功能的一部分,则无需保护;否则,一定要保护现场,使得主程序得以正确执

22、行。,通过堆栈进行现场的保护,SUB1:PUSH PSW ;保护现场 PUSH ACC ; PUSH B ; MOV PSW,#10H ;换当前工作寄存器组 POP B ;恢复现场 POP ACC ; POP PSW ; RET,注意: 保护和恢复的工作在子程序中进行。 保护与恢复的顺序要对应。,子程序结构,子程序参数的传递。 调用子程序时,语句中无法携带子程序运行所需的参数。 明确子程序的功能后,对子程序使用的参数,应在调用之前完成数据的赋值等工作。 类似乘法指令MUL AB,必须在此指令之前将AB赋值,运算才有意义。,子程序举例,编写程序,实现c=a2+b2 。设a,b,c分别存于内部RA

23、M的30H,31H,32H三个单元中 如何求数的平方 MUL AB 左移 查表,方法1:直接相乘,START:MOV A,30H ;取a ACALL SQR ;调用乘法 MOV R1,A ;a2 暂存于R1中 MOV A,31H ;取b ACALL SQR ;调用查平方表 ADD A,R1 ;a2+b2 存于A中 MOV 32H,A ;存结果 SJMP $ SQR :PUSH PSW MOV B,A MUL AB; POP PSW RET,方法2:左移1次,START:MOV A,30H ;取a ACALL SQR ;调用乘法 MOV R1,A ;a2 暂存于R1中 MOV A,31H ;取b

24、 ACALL SQR ;调用查平方表 ADD A,R1 ;a2+b2 存于A中 MOV 32H,A ;存结果 SJMP $ SQR :PUSH PSW RL A POP PSW RET,方法3:查表,START:MOV A,30H ;取a ACALL SQR ;调用乘法 MOV R1,A ;a2 暂存于R1中 MOV A,31H ;取b ACALL SQR ;调用查平方表 ADD A,R1 ;a2+b2 存于A中 MOV 32H,A ;存结果 SJMP $ SQR :MOV DPTR,#TAB ;子程序 MOVC A,A+DPTR ; RET TAB :DB 0,1,4,9,16 ,25,36,49,64,81 DB ,5.5 综合举例,设有一串字符,依次存放在内部RAM从30H单元开始的连续单元中,该字符串以0AH为结束标识(0AH不计入字符长度),编写程序,统计该字符串个数,将该数放入累加器A中。,MOV R1,#30H MOV R0,#00H LP:CJNE R1,#0AH,NE SJMP ED NE:INC R0 INC R1 SJMP LP ED: MOV A,R0 SJMP $ END,改进,MOV R1,#30H MOV R0,#00H LP:CJNE R1,#0AH,NE SJMP ED

温馨提示

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

评论

0/150

提交评论