第4章80C51的汇编语言程序设计

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

2020/1/231第4章80C51的汇编语言程序设计程序编制的方法和技巧4.1源程序的编辑和汇编4.2基本程序结构4.3子程序及其调用4.4简单I/O设备的并口直接驱动示例4.52020/1/232单片机应用系统由硬件系统和应用程序构成汇编语言高级语言应用程序设计方法汇编语言,生成的目标程序占内存空间少、运行速度快,具有效率高、实时性强,汇编针对端口控制。高级语言,对系统的功能描述与实现简单,程序阅读、修改和移植方便,适合于编写复杂的程序。2020/1/2334.1程序编制的方法和技巧4.1.1程序编制的步骤明确任务:功能要求、技术指标运行环境调研任务分析将实际问题转化为计算机处理的程序算法算法比较与优化(内存需求与运行速度)算法设计2020/1/234流程描述流程图符号开始或结束符号工作任务符号判断分支符号程序连接符号程序流向符号程序流向符号“超级循环”框架初始化开始循环扫描、处理2020/1/235对上述51单片机指令系统,要认清以下几点:1)指令按用户规定排列形成程序,顺序存放在ROM中2)每条指令的机器码占若干字节,一旦存放就有确定的地址3)PC实时指向该地址,使CPU按用户所编程序顺序执行指令4)跳转就是把新的目的地址送给PC4.1.2程序编制的方法2020/1/236强化模块观念使程序占用空间减少、结构清晰循环初值和结束条件,避免“死机”现象子程序的现场保护(注意栈平衡、寄存器内容)程序模块(主程序模块、各种子程序模块)模块化优点:分块设计、便于阅读、调试方便4.1.2程序编制的技巧采用循环和子程序对中断子程序还有注意保护PSW的内容ORG0000HLJMPMAINORG0040HMAIN:MOVA,#0FEHLOOP:MOVP2,ALCALLD_1sRLAAJMPLOOPD_1s:MOVR6,#100D10ms:MOVR5,#40DL:MOVR4,#123NOPDJNZR4,$DJNZR5,DLDJNZR6,D10msRETEND2020/1/2372020/1/2384.1.3汇编语言的语句格式非数字字符开头,后跟字母、数字、“-”、“?”等不能用已定义的保留字(指令助记符、伪指令等)后跟英文冒号“:”Keil的汇编器A51可以识别的语句形式为:标号(即符号地址)[标号:]指令助记符[操作数1,][操作数2,][操作数3,][;注释]指令助记符是指令功能的英文缩写。2020/1/239数据:二进制(B)十进制(D或省略D)十六进制(H),注意A~F开头时要加“0”ASCII码,如‘A’,‘1245’符号:符号名、标号或“$”(PC的当前值)表达式:由运算符和数据构成(见表4.1)操作数注释英文分号“;”开头2020/1/23104.2源程序的编辑和汇编目标程序的产生过程如下图:汇编器A51.EXE编译器C51.EXE目标文件(浮动地址).OBJC源文件.C汇编源文件.ASM连接器BL51.EXE调试目标文件(绝对地址)无扩展名转换器OH51.EXE可烧写目标文件.HEX.LST.LST.M51库文件.LIB映像文件仿真调试写入芯片MCS-51单片机汇编语言,包含两类不同性质的指令。(1)基本指令(指令性语句):即指令系统中的指令。它们都是机器能够执行的指令,每一条指令都有对应的机器码。源程序的主要功能都是由指令性语句完成。(2)伪指令(指示性语句):汇编时用于控制汇编的指令。它们都是机器不执行的指令,无机器码。伪指令主要用于指定源程序存放地址、定义符号、指定数据存储区、汇编结束等。2020/1/23124.2.2伪指令伪指令,也叫汇编命令。仅对汇编过程进行指示伪指令无对应的单片机可执行代码起始地址设定伪指令ORGORG表达式表达式通常为十六进制地址,例:ORG8000HSTART:MOVA,#30H……ORG可多次使用,但地址值的顺序要由小到大ORG可多次使用,但地址值不能重叠MOVDPTR,STRT标号为符号地址其值为8000H2020/1/2313ORG8000HSTART:MOVA,#30HMOVR2,#20HORG8001HMOVA,#40H结束汇编伪指令ENDEND该伪指令位于源程序的最后一行。2020/1/2314定义字节数据表伪指令DB1000H[标号:]DB字节数据表如:ORG1000HDB-2,-4,-6,8,10,18DB‘howareyou’DB‘4’,‘6’FEHFCHFAH08H0AH12H1001H该指令的功能是用于定义字节,将项或项表中的一个字节或字符串数据存入标号开始的连续单元中。项与项之间用逗号隔开,项或项表若用英文单引号’’括起来时表示为ASCII码字符串。2020/1/2315[标号:]DW字数据表ORG1400HDATA1:DW324AH,3CH……1400H32H4AH00H3CH1401H1402H1403H定义字数据表伪指令DW大端模式该指令是用于定义字,将项或项表中的一个字(即两个字节)的字符串数据存入标号开始的连续单元中。项或项表之间用逗号隔开。使用方法与DB类同。2020/1/2316定义常值为符号名伪指令EQU符号名EQU常值表达式LENEQU10SUMEQU21HBLOCKEQU22HCLRAMOVR7,#LENMOVR0,#BLOCKLOOP:ADDA,@R0INCR0DJNZR7,LOOPMOVSUM,A符号名可代表:地址常数段名字符串寄存器名位名比较:标号只能是地址2020/1/2317定义位地址为符号名伪指令BIT符号名BIT位地址表达式如:STBITP1.0;将P1.0的位地址赋给符号名STCFBIT0D7H;将位地址为D7H的位定义为符号名用BIT定义的“符号名”一经定义便不能重新定义和改变2020/1/23184.3.1顺序程序(无分支、无循环)4.3基本程序结构【例4-1】片内RAM的21H单元存放一个十进制数据十位的ASCII码,22H单元存放该数据个位的ASCII码。编写程序将该数据转换成压缩BCD码存放在20H单元。开始结束取十位的ASCII码保留低半字节移至高半字节,存回取个位的ASCII码保留低半字节合并到结果单元2020/1/2319ORG0040HSTART:MOVA,21H;取十位ASCII码ANLA,#0FH;保留低半字节SWAPA;移至高半字节MOV20H,A;存于20H单元MOVA,22H;取个位ASCII码ANLA,#0FH;保留低半字节ORL20H,A;合并到结果单元SJMP$END例:MOVA,30H;取数ANLA,#0FH;屏蔽高4位MOV40H,A;存低4位MOVA,30H;再取ANLA,#0F0H;屏蔽低4位SWAPA;高低4位交换MOV41H,A;存高4位压缩BCD码拆成单字节BCD码设30H单元内容为56H,将高低四位拆开存放在40H,和41H拆字程序06H05H40H41H42H00000110B06H————————————————01010110B56H∧00001111B0FH01010000B50H—————————————————01010110B56H∧11110000BF0H与操作:例、利用取反指令,对40H单元内容求补。MOVA,40HCPLAINCAMOV40H,A例、试编写程序,完成两个16位数的减法:7F4DH-2B4EH,结果存入内部RAM的30H和31H单元,30H单元存差的高8位,31H单元存差的低8位。CLRCYMOVA,#4DHSUBBA,#4EHMOV31H,A;保存低字节相减结果MOVA,#7FHSUBBA,#2BHMOV30H,A;保存高字节相减结果2020/1/2322例、将外部数据存储器3000H和3001H的低4位取出来拼成一个字,送入3002H2020/1/2323ORG2000HMOVDPTR,#3000HMOVXA,@DPTRANLA,#0FHSWAPAMOVR1,AINCDPTRMOVXA,@DPTRANLA,#0FHORLA,R1INCDPTRMOVX@DPTR,ASJMP$END例、试编写程序,将R1中的低4位数与R2中的高4位数合并成一个8位数,并将其存放在R1中2020/1/2324MOVA,R1ANLA,#0FHMOVR1,AMOVA,R2ANLA,#0F0HORLA,R1ORG0000HMOVR1,#10HMOV30H,R1MOVR1,#30HMOVR2,#56HMOVA,R2XCHDA,@R1SJMP$END查表法求平方值例a=b2,设b是0~9之间的一个数,存放在30H单元,用查表法求平方值a存入31H单元。解:1、确定算法1)计算平方值2)平方值的地址取30H单元的数作序号,用查表指令查表得表地址中的数,存入31H单元。3)查表(MOVCA,@A+DPTR)表地址=表首地址+序号(索引号)将0~9共10个数的平方值依次存入连续的存储区,用伪指令DB来确定,存放在ROM区。b的值平方值表┇419016ORG0000HMOVA,30H;取数bAMOVDPTR,#TAB;表首地址送DPTRMOVCA,@A+DPTR;查表求平方MOV31H,A;存平方值SJMP$TAB:DB0,1,4,9,16DB25,36,49,64,81;0~9的平方END1630H31H42、源程序TABROM0的平方┇1的平方2的平方3的平方4的平方(TAB+A)A+A16二翻十例设二进制数在30H单元,转换后的十进制数存入31H和32H单元(设个位十位在31H,百位在32H中)解:1、确定算法1)背景知识2)解题思路先除以100,得百位,余数再除以10得十位余数为个位8位二进制数表示的十进制数范围为0~255(00H~FFH),转换后为3位十进制数,用两个字节存放。8位二进制数转换成十进制数(BCD码)30H31H80H32H28H01H取数÷100商为百位余数÷10商为十位余数为个位80H=128ORG0000HMOVA,30H;取数MOVB,#64H;64H=100DIVAB;÷100,A商B余MOV32H,A;存百位MOVA,B;余数→AMOVB,#0AH;0AH=10DIVAB;÷10,A商B余SWAPA;交换到高四位ADDA,B;拼成压缩BCD码MOV31H,A;存个和十位SJMP$END2、源程序还有除10取余法30H31H80H32H28H01H分支程序的结构特点:根据条件的成立与否执行不同的程序段,程序有两个或两个以上分支。P1.0=0?点亮所有8个灯Y8个灯交叉点亮N二分支三分支散转,分支很多分为:例如:根据P1.0的值决定执行不同的操作4.3.2分支程序(单分支、双分支、多分支)2020/1/2330从P1口输入一个数,若为正则存入30H单元,若为负则将其取反后存入30H单元。例:MOVA,P1JNBACC.7,ST;为正转移CPLA;求反ST:MOV30H,A;存数2020/1/2331【例4-2】设变量x以补码的形式存放在片内RAM的30H单元,变量y与x的关系是:当x大于0时,y=x;当x=0时,y=20H;当x小于0时,y=x+5。编制程序,根据x的大小求y并送回原单元。开始结束取x至累加器X=0?X+05H送Y20H送YNX0?NYYX当X0Y=20H当X=0X+5当X02020/1/2332ORG0040HSTART:MOVA,30H;取x至累加器JZNEXT;x=0,转NEXTANLA,#80H;否,保留符号位JZDONE;x0,转结束MOVA,#05H;x0处理ADDA,30HMOV30H,A;X+05H送YSJMPDONENEXT:MOV30H,#20H;x=0,20H送YDONE:SJMPDONEEND三分支例设X、Y为带符号数,求分段函数的值:解:1、确定算法取XA,先判A=0?再判A的符号位ACC.740HXY41H1当X0Y=0当X=0-1当X0A=0?A=0,转移X=0A0ACC.7=0,X0ACC.7=1,X0都是判A,用JZ判0,用JB或

1 / 70
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功