单片微型计算机第讲机械_第1页
单片微型计算机第讲机械_第2页
单片微型计算机第讲机械_第3页
单片微型计算机第讲机械_第4页
单片微型计算机第讲机械_第5页
已阅读5页,还剩52页未读 继续免费阅读

下载本文档

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

文档简介

单片微型计算机第讲机械第一页,共五十七页,编辑于2023年,星期五练习已知累加器A当前的内容为23H,进位位C为1,执行下列指令后,累加器A和进位位C各为多少?ANLA,#7FHORLA,#35XRLA,#FFHRLCACJNEA,#40H,AAINCASJMPBBAA:ADDA,#23HBB:SJMP$第二页,共五十七页,编辑于2023年,星期五第8-9讲教学目的和要求【教学目标】通过讲述MCS-51单片机的汇编语言程序设计的基本步骤、基本方法,使学生对指令系统有进一步的认识和理解,同时使得学生掌握使用汇编语言进行程序设计的方法,通过实例加以巩固。【教学重点】①单片机程序设计的基本方法;②查表、差值运算、译码等简单程序设计方法;【教学难点】如何将实际问题转换成单片机能识别和解决的问题第三页,共五十七页,编辑于2023年,星期五第五章MCS-51的汇编语言程序设计第四页,共五十七页,编辑于2023年,星期五5.1

汇编语言程序设计概述语言的发展机器语言(MachineLanguage):二进制表示指令和数据,能被机器直接识别的计算机语言。速度快、占用内存少。汇编语言(AssemblyLanguage):采用助记符表示的程序设计语言。内存空间少,而且执行速度快,但移植性差。高级语言(HighLevelLanguage):高级语言则是面向用户的语言,移植性较好。MCS51单片机支持用汇编语言和C高级语言进行编程,在单片机内部最终转换成机器语言存储和运行。第五页,共五十七页,编辑于2023年,星期五源程序的编辑与汇编解决实际问题时,往往需要根据业务逻辑和支持的指令,完成程序的编写、调试、编译、烧制等过程。第六页,共五十七页,编辑于2023年,星期五汇编语言程序的结构汇编语言程序的四分段书写格式标号字段操作码字段操作数字段注释字段START:MOVA,#00H;0→AMOVR1,#10;10→R1MOVR2,#00000011B;3→R2LOOP:ADDA,R2;(A)+(R2)→ADJNZR1,LOOP;R1减1,若不为0则循环NOP;延迟1个机器周期HERE:SJMPHERE;原地跳转END;程序结束第七页,共五十七页,编辑于2023年,星期五5.1.1

指令的格式注意:标号:表示该指令所在的符号地址,一般由字母和数字组成,第一位为字母,其余位为字母、数字任选。操作助记符不能缺少;操作数个数可为:1、2、3个,根据指令本身而定;2个操作数的指令,目的操作数在左边;一般格式[标号:]操作助记符[目的操作数][,源操作数][;注释]汇编程序设计中,每一行书写一条指令。第八页,共五十七页,编辑于2023年,星期五指令的补充说明所有的符号均为英文符号,尤其注意常用的”,”、”;”。若书写错误,编译程序将提示“不能识别的符号”。标号的书写标号后必须跟冒号。标号最大支持18个字符,且必须以字母开头同一标号在一个程序中只能定义一次不允许用系统保留字作为标号一般只有别的指令需要访问的语句才有标号汇编时,汇编程序自动将标号转换成地址。第九页,共五十七页,编辑于2023年,星期五指令的补充说明立即数和直接地址的书写若是十进制数,后缀可无,也可以写D;其他进制必须带后缀。二进制B、八进制O、十六进制H。可以是字符串,如’A’、’YU’,编译时自动转换成其ASCII可以是指令的标号美元符号$的使用。$符号表示当前地址,一般在程序结束或原地跳转时使用,以下两条指令等价:HERE:SJMPHERESJMP

$第十页,共五十七页,编辑于2023年,星期五5.1.2伪指令伪指令,也称汇编命令。仅对汇编过程进行指示,方便汇编程序将代码转换成机器代码。伪指令无对应的单片机可执行代码伪指令具有控制汇编程序的输入输出、定义数据和符号、条件汇编,分配存储空间等功能。快速理解伪指令:如分配存储空间伪指令,汇编程序在编译时,根据伪指令的指示,完成存储空间的划分、初值的置入等工作。无需单片机去执行。第十一页,共五十七页,编辑于2023年,星期五5.1.2.1ORG伪指令起始地址设定伪指令用于指定接下来指令在ROM中的存放位置使用格式:ORG

16位地址(以四位十六进制方式书写)举例:有如下指令段

ORG2000HSTART:MOVA,#00H注意ORG可以多次使用使用顺序必须由小到大ROMMOVA,#00H74H2000H00H第十二页,共五十七页,编辑于2023年,星期五ORG

伪指令…ORG2500H……ORG2000H……ORG3000H…ORG2000H……ORG2500H……ORG3000H×错误的书写方式√正确的书写方式第十三页,共五十七页,编辑于2023年,星期五5.1.2.2END伪指令汇编终止伪指令用于告诉汇编程序,将某一段源程序翻译成机器指令的工作到此为止。后面的指令将忽略。在整个源程序的最后添加END语句。举例MOVA,#12HMOVA,#23HENDMOVA,#45HROMMOVA,#12H74H12H74H23HMOVA,#23H第十四页,共五十七页,编辑于2023年,星期五5.1.2.3DB

伪指令定义字节数据表伪指令用于从指定地址开始,在ROM的连续单元中定义字节数据格式:[标号:]DB

字节数据表。用”,”分割表中的多个数举例:ORG1000HTABLE:DB20H,32,’A’,’8’编译时:十进制等自动转换成十六进制字符转换成ASCII码ROM1000H20H20H41H38H1001H1002H1003H第十五页,共五十七页,编辑于2023年,星期五ASCII码表‘0’~’9’:30H~39H‘A’~’Z’:41H~5AH‘a’~’z’:61H~7AH第十六页,共五十七页,编辑于2023年,星期五5.1.2.4DW

伪指令定义字数据表伪指令从指定地址开始,在ROM的连续单元中定义16位的数据字格式:[标号:]DW

字数据表。用”,”分割表中的多个字举例:ORG2000HTABLE:DW1246H,10ROM2000H12H46H00H0AH2001H2002H2003H第十七页,共五十七页,编辑于2023年,星期五5.1.2.5EQU伪指令用于给标号赋值赋值后,后续程序中可用此标号表示对应的数据格式:标号

EQU数据或汇编表达式。举例:LENEQU10*3SUMEQU21HMOVR7,#LENMOVSUM,A对于常用的常量,采用此种方式后,当该常量发生变化时,无需频繁更改主程序内容,只需修改之前的赋值语句即可。第十八页,共五十七页,编辑于2023年,星期五5.1.2.6BIT伪指令将位地址定义成为符号名指令赋值后,后续程序中位地址可直接用符号名表示,增加程序的可读性。格式:符号名BIT

位地址表达式。举例:STBITP1.0;将P1.0的位地址赋给符号名STCFBIT0D7H;将位地址为D7H的位定义为符号名注意:用BIT定义的“符号名”一经定义便不能重新定义和改变第十九页,共五十七页,编辑于2023年,星期五5.2汇编语言程序设计步骤分析问题根据任务的要求,确定程序的功能要求、输入输出、解决步骤等问题。算法设计将实际问题转化为计算机处理的程序算法算法比较与优化(内存需求与运行速度)第二十页,共五十七页,编辑于2023年,星期五汇编语言程序设计步骤流程描述将算法的内容用流程图的形式表示,更加直观。典型外设查询程序流程第二十一页,共五十七页,编辑于2023年,星期五汇编语言程序设计步骤分配内存等资源将片内RAM资源合理分配,把内存区、堆栈区、各种缓冲区进行合理分配。确定每个区域的首地址,便于编程使用。程序的编写与调试根据以上工作,结合MCS51单片机的指令系统,完成源代码的编写,并上机调试,考查各种边界情况。第二十二页,共五十七页,编辑于2023年,星期五源程序的编辑依据汇编语言规则用好伪指令符号不用中文SJMP$

用于调试以.ASM存盘ORG0000HLJMPMAINORG0040HMAIN:MOVR7,#16MOVR0,#60HMOVA,#55HLOOP:MOV@R0,AINCR0DJNZR7,LOOPSJMP$END……ROMLJMP0040H02H0000H00H40H7FH0040H10HMOVR7,#1680H004BHFEHSJMP$第二十三页,共五十七页,编辑于2023年,星期五程序汇编及连接源程序的汇编汇编源程序转为目标程序的过程叫汇编汇编通常在Windows下的集成开发环境完成用A51.EXE汇编生成.OBJ、.LIB及.LST目标程序的连接.OBJ、.LIB经BL51.EXE生成无扩展名的绝对地址目标文件绝对地址目标文件可以用于仿真器调试调试无误的目标文件用OH51.EXE转换为.HEX文件.HEX文件经编程器写入单片机存储器第二十四页,共五十七页,编辑于2023年,星期五注意事项强化模块观念程序模块(主程序模块、各种子程序模块)模块化优点:分块设计、便于阅读、调试方便采用循环和子程序使程序占用空间减少、结构清晰循环初值和结束条件,避免“死机”现象子程序的现场保护(注意栈平衡、寄存器内容)第二十五页,共五十七页,编辑于2023年,星期五5.3汇编语言程序基本结构汇编语言程序主要包含四种结构顺序结构分支结构循环结构子程序结构第二十六页,共五十七页,编辑于2023年,星期五5.3.1

顺序结构指令执行时,其执行顺序按照指令在存储器中的存放顺序进行的。开始语句1语句n结束……【特点】顺序执行,程序通常简单;无分支、无循环、无转移图中无判断框;第二十七页,共五十七页,编辑于2023年,星期五顺序结构举例1数据传送:内部RAM的2AH~2EH单元中存储的数据如图所示。试编写程序实现图示的数据传送结果。2EH78H56H34H12H2DH2CH2BH00H2AHACC2EH56H34H12H00H2DH2CH2BH00H2AHACC78H第二十八页,共五十七页,编辑于2023年,星期五方法1内部RAM的2AH~2EH单元内容传递至2BF~2EF、A中。MOVA,2EH;2字节,1个机器周期MOV2EH,2DH;3字节,2个机器周期MOV2DH,2CH;3字节,2个机器周期MOV2CH,2BH;3字节,2个机器周期MOV2BH,#00H;3字节,2个机器周期使用14个字节的指令代码,执行时间为9个机器周期2EH78H56H34H12H2DH2CH2BH00H2AHACC78H56H34H12H00H2EH56H34H12H00H2DH2CH2BH00H2AHACC78H第二十九页,共五十七页,编辑于2023年,星期五方法2内部RAM的2AH~2EH单元内容传递至2BF~2EF、A中。CLRA

;1字节,1个机器周期XCHA,2BH;2字节,1个机器周期XCHA,2CH;2字节,1个机器周期XCHA,2DH;2字节,1个机器周期XCHA,2EH;2字节,1个机器周期使用9个字节的指令代码,执行时间为5个机器周期2EH78H56H34H12H2DH2CH2BH00H2AHACC00H12H00H34H12H56H34H78H56H2EH56H34H12H00H2DH2CH2BH00H2AHACC78H第三十页,共五十七页,编辑于2023年,星期五顺序结构举例2码制转换:片内RAM的21H单元存放一个十进制数据十位的ASCII码,22H单元存放该数据个位的ASCII码。编写程序将该数据转换成压缩BCD码存放在20H单元。20H36H34H21H22H数字字符的ASCII码为30H+数如字符3的ASCII码为33H。右侧表示存放的为数据64。64H程序第三十一页,共五十七页,编辑于2023年,星期五ASCII到压缩BCD码的转换分析取21H单元低位数据,移至高位取22H单元内容,去掉高位上述结果组合,传送至20H单元20H36H34H21H22H64H程序第三十二页,共五十七页,编辑于2023年,星期五ASCII到压缩BCD码的转换程序ORG0040HSTART:MOVA,21H;取十位ASCII码ANLA,#0FH;保留低半字节SWAPA;移至高半字节MOV20H,A;存入20H单元MOVA,22H;取个位ASCII码ANLA,#0FH;保留低半字节ORL20H,A;合并到结果单元SJMP$END20H36H34H21H22HACC36H06H60H60H34H04H64H第三十三页,共五十七页,编辑于2023年,星期五20HX21H程序平方表区顺序结构举例3查表程序:有一变量存放在片内RAM的20H单元,其取值范围为:00H~05H。要求编制一段程序,使用查表指令,根据变量值求其平方值,并存入片内RAM的21H单元。X2开始A→(21H)(20H)→A表格首地址→DPTRMOVCA,@A+DPTR结束第三十四页,共五十七页,编辑于2023年,星期五查表操作程序

ORG1000HSTART:MOVDPTR,#TABLEMOVA,20HMOVCA,@A+DPTRMOV21H,ASJMP$ORG2000HTABLE:DB00,01,04,09,16,25END开始A→(21H)(20H)→A表格首地址→DPTRMOVCA,@A+DPTR结束第三十五页,共五十七页,编辑于2023年,星期五练习根据累加器A的值(0–7FH)查平方表,求平方值,结果放在BA中。TABLE:DW0000H,0001H,0004H,0009H DW0010H,0019H,……MOV DPTR,#TABLEMOVCA,@A+DPTRMOV B,AINC AMOVCA,@A+DPTR…………TABLE00H00H00H01HTABLE+100HROM04HTABLE+2TABLE+3TABLE+4TABLE+5RLAPUSHACCPOPACCMOV DPTR,#TABLERLAPUSHACCMOVCA,@A+DPTRMOV B,APOPACCINC AMOVCA,@A+DPTR第三十六页,共五十七页,编辑于2023年,星期五5.3.2

分支结构指令执行时,根据不同的情况执行不同的程序段。单分支双分支多分支第三十七页,共五十七页,编辑于2023年,星期五单分支结构设累加器A中存储有符号数的原码,编程转换成补码开始保存A最高位结束最高位为0NA数据位取反+1恢复符号位YCMPT:JNBAcc.7,RETURN

MOVC,Acc.7

CPLA ADDA,#1

MOVAcc.7,C RETURN:SJMP$END第三十八页,共五十七页,编辑于2023年,星期五双分支结构设变量x以补码的形式存放在片内RAM的30H单元,变量y与x的关系是:当x>0时,y=x;当x=0时,y=20H;当x<0时,y=x+5。编制程序,根据x的大小求y并送回30H单元。判断结果为0,可通过执行JZrel来实现判断补码的正负,可通过最高位来判断先与,保留最高位,再判断结果是否为零来实现第三十九页,共五十七页,编辑于2023年,星期五双分支结构设变量x以补码的形式存放在片内RAM的30H单元,变量y与x的关系是:当x>0时,y=x;当x=0时,y=20H;当x<0时,y=x+5。编制程序,根据x的大小求y并送回30H单元。第四十页,共五十七页,编辑于2023年,星期五双分支结构START:MOVA,30H;取x至累加器

JZNEXT;x=0,转NEXTNEXT:MOV30H,#20HDONE:SJMP$

ENDANLA,#80H;否,保留符号位JZDONE;x>0,转结束MOVA,#05H;x<0处理ADDA,30HMOV30H,A;X+05H送YSJMPDONE第四十一页,共五十七页,编辑于2023年,星期五5.3.3

循环结构按某种控制规律重复执行的程序称为循环程序。循环程序有先执行后判断和先判断后执行两种基本结构。第四十二页,共五十七页,编辑于2023年,星期五例1

延时程序编写一段延时50ms的程序若晶振频率为12MHz,则一个机器周期为1μs,延时50ms,则程序的执行时间为50000个机器周期。立即数取指在0~255之间,可考虑200*250=50000。需要用到减1,结果不为0则重复的指令。执行一条DJNZ指令需要2个机器周期,即2μs。采用循环计数法实现延时,需要用到双重循环。第四十三页,共五十七页,编辑于2023年,星期五延时程序DEL:MOVR7,#200;1μsDEL1:NOP;1

μsDEL1:MOVR6,#?;1μsNOP ;1μsDEL2:DJNZR6,DEL2;2μsDJNZR7,DEL1;2μs

DEL1:MOVR6,#123;1μs共计

[(2×123+2+2)×200+1]μs,即50.001ms第四十四页,共五十七页,编辑于2023年,星期五例2

未知次数的循环将内部RAM中起始地址为data的数据串传送到外部RAM中起始地址为buffer的存储区域内,直到发现‘$’字符停止传送。…………data??H??Hdata+1……内部RAM‘$’??…………bufferbuffer+1……外部RAM问题何时终止传送?对取出的数进行与’S’进行比较,判断是否相等。用CJNE

第四十五页,共五十七页,编辑于2023年,星期五例2

未知次数的循环程序将内部RAM中起始地址为data的数据串传送到外部RAM中起始地址为buffer的存储区域内,直到发现‘$’字符停止传送。

MOVR0,#dataMOVDPTR,#bufferLOOP:MOVA,@R0

CJNEA,’$’,继续执行地址结束

LP:MOVX@DPTR,AINCR0INCDPTRSJMPLOOPLP2:SJMP$END

SJMPLP2

CJNEA,’$’,LP

第四十六页,共五十七页,编辑于2023年,星期五5.4

子程序及其调用在实际应用中,经常会遇到一些带有通用性的问题,在一个程序中可能要使用多次。这时可以将其设计成通用的子程序供随时调用,减少代码冗余。一个程序中可以多次调用一个子程序多个程序可以调用一个子程序子程序可以调用子程序,最多支持8级调用子程序时,单片机能自动保存PC内容,遇RET返回时,能自动恢复PC程序1……子程序RET……程序2……第四十七页,共五十七页,编辑于2023年,星期五子程序结构子程序编写完成后,使用ACALL

函数名(短距离调用)LCALL

函数名(整个ROM区调用)此处的函数名,实际上是一个标号,编译后形成具体的地址。子程序的处理过程中,可能要影响PSW、ACC,以及其他的一些功能寄存器,若这些影响是子程序功能的一部分,则无需保护;否则,一定要保护现场,使得主程序得以正确执行。保护现场……子程序处理……恢复现场RET子程序函数名:第四十八页,共五十七页,编辑于2023年,星期五通过堆栈进行现场的保护SUB1:PUSHPSW;保护现场

PUSHACC;

PUSHB;

……MOVPSW,#10H;换当前工作寄存器组

……POPB;恢复现场

POPACC;

POPPSW;

RET注意:①保护和恢复的工作在子程序中进行。②保护与恢复的顺序要对应。第四十九页,共五十七页,编辑于2023年,星期五子程序结构子程序参数的传递。调用子程序时,语句中无法携带子程序运行所需的参数。明确子程序的功能后,对子程序使用的参数,应在调用之前完成数据的赋值等工作。类似乘法指令MULAB,必须在此指令之前将AB赋值,运算才有意义。保护现场……子程序处理……恢复现场RET子程序函数名:第五十页,共五十七页,编辑于2023年,星期五子程序举例编写程序,实现c=a2+b2

。设a,b,c分别存于内部RAM的30H,31H,32H三个单元中如何求数的平方MULAB左移查表开始调用求平方子程序结束a2→R1(31H)→A(30H)→AA+R1→A调用求平方子程序A→32H第五十一页,共五十七页,编辑于2023年,星期五方法1:直接相乘START:MOVA,30H;取aACALLSQR;调用乘法

MOVR1,A;a2暂存于R1中

MOVA,31H;取bACALLSQR;调用查平方表

ADDA,R1;a2+b2存于A中

MOV32H,A;存结果

SJMP$SQR:PUSHPSWMOVB,AMULAB;POPPSW

RET开始调用求平方子程序结束a2→R1(31H)→A(30H)→AA+R1→A调用求平方子程序A→32H第五十二页,共五十七页,编辑于2023年,星期五方法2:左移1次START:MOVA,30H;取aACALLSQR;调用乘法

MOVR1,A;a2暂存于R1中

MOVA,31H;取bACALLSQR;调用查平方表

ADDA,R1;a2+b2存于A中

MOV32H,A;存结果

SJMP$SQR:PUSHPSWRLAPOPPSW

RET开始调用求平方子程序结束a2→R1(31H)→A(30H)→AA+R1→A调用求平方子程序A→32H第五十三页,共五十七页,编辑于2023年,星期五方法3:查表START:MOVA,30H;取aACALLSQR;调用乘法

MOVR1,A;a2暂存于R1中

MOVA,31H;取bACALLSQR;调用查平方表

ADDA,R1;a2+b2存于A中

MOV32H,A;存结果

SJMP$SQR:MOVDPTR,#TAB;子程序

MOVCA,@A+DPTR;

RE

温馨提示

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

评论

0/150

提交评论