您好,欢迎访问三七文档
当前位置:首页 > 办公文档 > 述职报告 > 第7讲51单片机汇编语言程序设计
1标题:第四部分汇编语言程序设计教学目标与要求:1、理解源程序、目标代码、编辑、汇编等含义2、了解汇编过程3、掌握伪指令的使用4、掌握顺序结构、分支结构及循环结构程序的编写方法授课时数:8学时教学重点:伪指令的使用教学内容及过程:一、程序设计概念1、汇编程序设计步骤:分析题意;资源分配;程序流程图编写程序调试程序2、程序编写规则:结构清晰,易读、易于移植占用存储空间少;运行时间短;程序的编制、调试及排错所需时间短;3、汇编程序功能汇编指令与机器码指令有一一对应的关系。汇编程序是一种翻译程序,将源程序翻译成目标程序。4、汇编程序的汇编过程汇编有两种方法:手工汇编、机器汇编。1、手工汇编:2第一次汇编:确定地址,翻译成各条机器码,字符标号原样写出;第二次汇编:标号代真,将字符标号用所计算出的具体地址值或偏移量代换。源程序地址目标程序第一次汇编第二次汇编ORG1000HSTART:MOVR0,BUFFER-11000A82FA82FMOVR2,#00H10027A007A00MOVA,@R01004E6E6MOVR3,A1005FBFBINCR310060B0BSJMPNEXT100780NEXT8005LOOP;INCR010090808CJNE@R0,#44H,NEXT100AB644NEXTB64401INCR2100D0A0ANEXT:DJNZR3,LOOP100EDBLOOPDBF9MOVRESULT,R210108A2A8A2ASJMP$101280FE80FEBUFFERDATA30HRESULTDATA2AHEND2、机器汇编两次扫描过程。第一次扫描:检查语法错误,确定符号名字;建立使用的全部符号名字表;每一符号名字后跟一对应值(地址或数)。第二次扫描:是在第一次扫描基础上,将符号地址转换成真地址(代真);利用操作码表将助记符转换成相应的目标码。二、伪指令伪指令是告诉汇编程序,如何汇编源程序的指令。伪指令既不控制机器的操作,也不能被汇编成机器代码,故称为伪指令。1、起始地址伪指令ORGORGaddr16用于规定目标程序段或数据块的起始地址,设置在程序开始处。2、汇编结束伪指令END告诉汇编程序,对源程序的汇编到此结束。一个程序中只出现一次,在末尾。33、赋值伪指令EQU告诉汇编程序,将汇编语句操作数的值赋予本语句的标号。格式:标号名称EQU数值或汇编符号“标号名称”在源程序中可以作数值使用,也可以作数据地址、位地址使用。先定义后使用,放在程序开头。4、定义字节伪指令DB告诉汇编程序从指定的地址单元开始,定义若干字节存储单元并赋初值。格式:[标号:]DB字节数据或字节数据表5、定义字伪指令DW从指定地址开始,定义若干个16个位数据,高八位存入低地址;低八位存入高地址。例、ORG1000HPIOI:DW7654H,40H、12、‘AB’6、数据地址赋值伪指令DATA将表达式指定的数据地址赋予规定的字符名称格式:字符名称DATA表达式注:该指令与EQU指令相似,只是,可先使用后定义,放于程序开头、结尾均可。7、定义空间伪指令DS从指定地址开始,保留由表达式指定的若干字节空间作为备用空间。格式:[标号:]DS表达式例2、ORG1000HDS0AHDB71H,11H,11H;从100BH开始存放71H、11H、11H。注:DB、DW、DS只能用于程序存储器;而不能用于数据存储器。8、位地址赋值伪指令BIT将位地址赋予规定的字符名称。格式:字符名称BIT位地址例3、X1BITP12相当于X1EQU92H三、汇编程序的基本结构1、顺序程序举例例1、设在外RAM的60H单元存有1个字节代码,要求将其分解成两个4位字段,高4位存入原单元的低4位,其低4位存入61H单元的低4位,且要求这两个单元的高4位均为0,试编制完整程序。解:字节分解:4核心指令MODE:ANLORL1000HMODE:MOVR0,#60HMOVXA,@R0MOVB,AANLA,#0F0HSWAPAMOVX@R0,AANLB,#0FHMOVA,BINCR0MOVX@R0,AEND2、分支结构与分支程序设计结构:根据不同的条件,进行相应的处理。通常用条件转移指令形成简单分支结构。如:判(A)=Z或NZ,转移判(CY)=1或0,转移判(bit)=1或0,转移CJNE比较不相等转移例3、设a存放在累加器A中,b存放在寄存器B中,要求按下式计算Y值,并将结果Y存于累加器A中,试编写程序。解:本题关键是判a是正数,还是负数;由ACC7便知。5BR:MINUS:DONE:ORG1000HJBACC7,MINUSCLRCSUBBA,BSJMPDONEADDA,BSJMP$END例4、设有两个16位无符号数NA,NB分别存放在8031单片机内部RAM的40H、41H及50H、51H单元中,当NANB时,将内部RAM的42H单元清0;否则,将该单元置成全1,试编程。解法I:因为无16位数的比较指令,所以,只能用8位数的比较指令。(画出流程框图)CMP:CMP1:HIGHE:DONE:ORG2000HMOVA,50HCJNEA,40H,CMP1MOVA,51HCJNEA,41H,CMP1SJMPNHIGHEJCHIGHENHIGHE:MOV42H,#0FFHSJMPDONEMOV42H,#00HSJMP$END上述程序中多次用到SJMP语句,该语句为无条件转移语句。无条件语句应尽量少用,这样可使程序结构紧凑而易读,易理解。解法II:先假设NANB,再来判断是否NA≤NBCMP2:ORG3000HMOVR0,#00HMOVA,50HCJNEA,40H,CMP36CMP3:NHIGHE:HIGHE:MOVA,51HCJNEA,41H,CMP3SJMPNHIGHEJCHIGHEMOVR0,#0FFH;不大于标志MOV42H,R0SJMP$END3、循环程序1)、循环次数是已知的程序例1、已知片外RAM的10H单元存放8位二进制数,要求将其转移成相应的ASCII码,并以高位在前,低位在后的顺序,依次存放到片外RAM以11H为首地址的连续单元中,试编程。解:先将中间单元置成30H,然后判欲转换位是否为1,若是,则将中间单元内容加1;否则,中间单元内容保持不变。通过左移指令实现由高到低的顺序进行转换。ORG1000HSTART:MOVR2,#08H;循环计数初值(循环次数已知)MOVR0,#10H;地址指针初值MOVXA,@R0;取数MOVB,A;暂存B中LOOP:MOVA,#30H;将中间单元(A)置成30HJNBB.7,NA;判断转换的二进制位为0否?;若是转NAINCA;1的ASCII码“31H”NA:INCR0;修改地址指针MOVX@R0,A;存放转换的结果MOVA,BRLA,B;作好准备,判断下一位MOVB,A;暂存DJNZR2,LOOP;判断转换结束否?未完继续SJMP$END72)循环次数未知的程序例2、设用户用键盘输入长度不超过100字节的字符串放在8031单片机外部RAM以20H为首地址的连续单元,该字符串用回车符CR(‘CR’=0DH)作为结束标志,要求统计此字符串的长度并存入内部RAM的1FH单元中。解:从首单元开始取数,每取一数判断其是否为‘CR’,是则结束。STADASLANGCMCR2:CRLOP:ORG1000HDATA20HDATA1FHMOVR0,#STADA-1MOVB,#0FFHINCR0INCBMOVXA,@R0CJNEA,#0DH,CRLOPMOVSLANG,BSJMP$END3)、多重循环设计循环体中还包含着一个或多个循环结构,即双重或多重循环。例3、设8031使用12MHz晶振,试设计延迟100ms的延时程序。解:延时程序的延迟时间就是该程序的执行时间,通常采用MOV和DJNZ二指令。T=12/fosc=12/(12×106)=1us内循环延时:(1+2×CTR)T=500us(假设)则CTR=250实际延时:[1+2×250]×1us=501us8外循环延时:T+(501+2T)×CTS=100ms=100000us所以,CTS=198.8取199实际延时:[1+(501+2)×199]=1000.98ms例4、设在8031内部RAM中存一无符号数的数组,其长度为100,起始地址是30H,要求将它们从大到小排序,排序后仍存放在原区域中,试编者按程。这就是所畏的“冒泡法”。实际上大多情况,用不到99次循环,排序就结束。为了提高排序速度,程序中可设一交换标志位,如10H位,每次循环中:若有交换则SETB10H若无交换则CLR10H每次循环结束时,测10H位,判断排序是否结束。BUBBLE:LOOP:BUEU:ORG1000HMOVR0,#30HMOVB,#64HCLR10HDECBMOVA,@R0MOV20H,AINCR0MOV21H,@R0CJNEA,21H,BUEU;长度计数;暂存,为交换作准备;若(20H)≠(21H)转移;(20H)≥(21H)转移9BUNEXT:JNCBUNEXTMOVA,@R0MOV@R0,20HDECR0MOV@R0,AINCR0SETB10HDJNZB,LOOPJB10H,BUBBLEEND;若(20H)(21H)则交换;使R0退格指向小地址;恢复R0指向大地址;置交换标志;判断标志位为1否?若为1,则继续小结:1、汇编程序有哪三种基本结构?2、构成循环程序、分支程序,常用到哪些判断语句?3、迟时较短的时间一般采取哪种方法?这种方法有什么缺陷?思考题(作业):课后小记::
本文标题:第7讲51单片机汇编语言程序设计
链接地址:https://www.777doc.com/doc-2198745 .html