第4章80C51的汇编语言程序设计概要_第1页
第4章80C51的汇编语言程序设计概要_第2页
第4章80C51的汇编语言程序设计概要_第3页
第4章80C51的汇编语言程序设计概要_第4页
第4章80C51的汇编语言程序设计概要_第5页
已阅读5页,还剩33页未读 继续免费阅读

下载本文档

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

文档简介

第4章80C51的汇编语言程序设计概要第4章80C51的汇编语言程序设计程序编制的方法和技巧源程序的编辑和汇编基本及其调用I/O设备的并口直接驱动示例2023/2/62

单片机应用系统由硬件系统和应用程序构成

汇编语言高级语言

应用程序设计方法

汇编语言,生成的目标程序占内存空间少、运行速度快,具有效率高、实时性强。高级语言,对系统的功能描述与实现简单,程序阅读、修改和移植方便,适合于编写复杂的程序。2023/2/63程序编制的方法和技巧4.1.1程序编制的步骤

明确任务:功能要求、技术指标运行环境调研

任务分析

将实际问题转化为计算机处理的程序算法算法比较与优化(内存需求与运行速度)

算法设计2023/2/64

流程描述

流程图符号“循环”框架2023/2/65强化模块观念使程序占用空间减少、结构清晰循环初值和结束条件,避免“死机”现象子程序的现场保护(注意栈平衡、寄存器内容)程序模块(主程序模块、各种子程序模块)模块化优点:分块设计、便于阅读、调试方便4.1.2程序编制的方法和技巧采用循环和子程序对中断子程序还有注意保护PSW的内容2023/2/664.1.3汇编语言的语句格式非数字字符开头,后跟字母、数字、“-”、“?”等不能用已定义的保留字(指令助记符、伪指令等)后跟英文冒号“:”Keil(或其它)汇编器A51可以识别的语句形式为:标号(即符号地址)[标号:]指令助记符[操作数1,][操作数2,][操作数3,][;注释]指令助记符是指令功能的英文缩写。2023/2/67数据:二进制(B)十进制(D或省略D)十六进制(H),注意A~F开头时要加“0”ASCII码,如‘A’,‘1245’符号:符号名、标号或“$”(PC的当前值)表达式:由运算符和数据构成操作数注释英文分号“;”开头2023/2/68源程序的编辑和汇编目标程序的产生过程如下图:2023/2/694.2.1源程序的编辑和汇编源程序的编辑ORG0000HLJMPMAIN

ORG0040HMAIN:MOVR7,#16MOVR0,#60HMOVA,#55HLOOP:MOV@R0,AINCR0DJNZR7,LOOPSJMP$

END依据汇编语言规则用好伪指令符号不用中文SJMP$

用于调试以.ASM存盘2023/2/610源程序的汇编汇编源程序转为目标程序的过程叫汇编汇编通常在Windows下的集成开发环境完成用汇编生成.OBJ、.LIB及.LST目标程序的连接.OBJ、.LIB经生成无扩展名的绝对地址目标文件绝对地址目标文件可以用于仿真器调试调试无误的目标文件用转换为.HEX文件.HEX文件经编程器写入单片机存储器2023/2/6114.2.2伪指令伪指令,也叫汇编命令。仅对汇编过程进行指示伪指令无对应的单片机可执行代码起始地址设定伪指令ORGORG表达式表达式通常为十六进制地址,例:

ORG8000HSTART:MOVA,#30H……ORG可多次使用,但地址值的顺序要由小到大结束汇编伪指令ENDEND该伪指令位于源程序的最后一行。2023/2/612定义字节数据表伪指令DB定义字数据表伪指令DW1000H[标号:]DB字节数据表如:ORG1000HDB-2,-4,-6,8,10,18FEHFCHFAH08H0AH12H1001H[标号:]DW字数据表ORG1400HDATA1:DW324AH,3CH……1400H32H4AH00H3CH1401H1402H1403H2023/2/613定义常值为符号名伪指令EQU符号名EQU常值表达式

LENEQU10SUMEQU21HBLOCKEQU22HCLRAMOVR7,#LENMOVR0,#BLOCKLOOP:ADDA,@R0INCR0DJNZR7,LOOPMOVSUM,A符号名为:地址常数字符串寄存器名比较:标号只能是地址2023/2/614定义位地址为符号名伪指令BIT符号名BIT位地址表达式如:STBITP1.0;将的位地址赋给符号名STCFBIT0D7H;将位地址为D7H的位定义为符号名用BIT定义的“符号名”一经定义便不能重新定义和改变其它一些伪指令参见教材

2023/2/615基本程序结构一般不影响标志寄存器PSW的状态。传送类指令有两大类

一般传送(MOV)特殊传送,如:MOVCMOVXPUSH、POPXCH、XCHDSWAP

2023/2/6164.3.1顺序程序(无分支、无循环)基本程序结构【例4-1】片内RAM的21H单元存放一个十进制数据十位的ASCII码,22H单元存放该数据个位的ASCII码。编写程序将该数据转换成压缩BCD码存放在20H单元。2023/2/617ORG0040HSTART:MOVA,21H;取十位ASCII码ANLA,#0FH;保留低半字节SWAPA;移至高半字节MOV20H,A;存于20H单元MOVA,22H;取个位ASCII码ANLA,#0FH;保留低半字节ORL20H,A;合并到结果单元SJMP$END2023/2/6184.3.2分支程序(单分支、双分支、多分支)【例4-2】设变量x以补码的形式存放在片内RAM的30H单元,变量y与x的关系是:当x大于0时,y=x;当x=0时,y=20H;当x小于0时,y=x+5。编制程序,根据x的大小求y并送回原单元。2023/2/619

ORG0040HSTART:MOVA,30H;取x至累加器

JZNEXT;x=0,转NEXTANLA,#80H;否,保留符号位

JZDONE;x>0,转结束

MOVA,#05H;x<0处理

ADDA,30HMOV30H,A;X+05H送YSJMPDONENEXT:MOV30H,#20H;x=0,20H送YDONE:SJMPDONEEND2023/2/6204.3.3循环程序(2种:先执行,后判断;先判断,后执行)【例4-4】将内部RAM的30H至3FH单元初始化为00H。MAIN:MOVR0,#30H;置初值

MOVA,#00H;MOVR7,#16;LOOP:MOV@R0,A;循环处理

INCR0;DJNZR7,LOOP;循环修改,判结束

SJMP$;结束处理2023/2/621【例4-5】将内部RAM起始地址为60H的数据串传送到外部RAM中起始地址为1000H的存储区域,直到发现‘$’字符停止传送。MAIN:MOVR0,#60H;置初值

MOVDPTR,#1000HLOOP0:MOVA,@R0;取数据CJNEA,#24H,LOOP1;循环结束?SJMPDONE;是LOOP1:MOVX@DPTR,A;循环处理

INCR0;循环修改

INCDPTRSJMPLOOP0;继续循环DONE:SJMPDONE;结束处理2023/2/622子程序及其调用完成通用功能、反复使用的程序设计成子程序。使应用程序结构清晰紧凑,便于阅读和调试

执行要由其它程序来调用,执行完后要返回到调用程序

结构上仍然采用一般程序的3种结构调用时注意:一是现场的保护和恢复;二是主程序与子程序间的参数传递。2023/2/6234.4.1现场保护与恢复在主程序中实现(结构灵活)PUSHPSW;保护现场(含当前工作寄存器组号)PUSHACC;PUSHB;MOVPSW,#10H;切换当前工作寄存器组LCALLaddr16;子程序调用,POPB;恢复现场POPACC;POPPSW;含当前工作寄存器组切换2023/2/624在子程序中实现(程序规范、清晰)SUB1:PUSHPSW;保护现场(含当前工作寄存器组号)

PUSHACC;PUSHB;MOVPSW,#10H;切换当前工作寄存器组

……POPB;恢复现场

POPACC;POPPSW;内含当前工作寄存器组切换

RET2023/2/6254.4.2参数传递利用累加器或寄存器(简单、快速,但参数个数不多)【例4-6】实现两个8位的十六进制无符号数求和的子程序。SADD:MOVA,R3;取加数(在R3中)

CLRCADDA,R4;被加数(在R4中)加AJCPP1MOVR3,#00H;结果小于255时,高字节R3内容为00HSJMPPP2PP1:MOVR3,#01H;结果大于255时,高字节R3内容为01HPP2:MOVR4,A;结果的低字节在R4中

RET入口:(R3)=加数;(R4)=被加数。出口:(R3)=和的高字节;(R4)=和的低字节。2023/2/626利用存储器(个数多,用R0或R1及DPTR为参数表指针)【例4-7】将内部RAM中两个4字节无符号整数相加,和的高字节由R0指向。入口:(R0)=加数低字节地址;(R1)=被加数低字节地址。出口:(R0)=和的高字节起始地址。NADD:MOVR7,#4;字节数4送计数器

CLRC;NADD1:MOVA,@R0;利用指针,取加数低字节

ADDCA,@R1;利用指针,被加数低字节加AMOV@R0,A;DECR0DECR1DJNZR7,NADD1INCR0;调整指针,指向出口

RET2023/2/6274.4.3常用子程序示例8位二进制数转换成BCD码。功能:0~FFH范围内的二进制数转换为BCD码(0~255)。入口:(A)为二进制数。出口:(R0)为十位数和个位数地址指针(压缩的BCD码)。BINBCD1: MOV B,#100DIV AB;(A)=百位数MOV @R0,A;存入RAMINC R0MOV A,#10XCH A,BDIV AB;(A)=十位数,(B)=个位数SWAPAADD A,B ;合成到(A)MOV @R0,A ;存入RAMRET2023/2/628功能:查最大数片内RAM中存放一批数据,查找出最大值并存放于首地址中。设R0中存首地址,R2中存放字节数,程序框图如图2023/2/629

BIGNUM:MOVR2,n ;n为要比较的数据字节数

MOVA,R0 ;存首地址指针

MOVR1,A DECR2 ;

MOVA,@R1LOOP: MOVR3,ADECR1 CLRC SUBBA,@R1 ;两个数比较

JNCLOOP1 ;C=0,A中的数大,跳LOOP1 MOVA,@R1 ;C=1,则大数送A SJMPLOOP2LOOP1:MOVA,R3LOOP2:DJNZR2,LOOP ;是否比较结束?

MOV@R0,A ;存最大数

RET2023/2/630功能:比较大小比较内部RAM21H22H中两个无符号的大小把大数存入31H中,小数存入32H中,若两数相等时,则将内部RAM位127为1,程序如下:COMP:

MOVA,21H;取一个比较的数

CJNEA,22H,BIG;若不相等则转移(对CY有影响)SETB127BIG:JCLESS;若(21H)<(22H)则转移

MOV31H,AMOV32H,22HRETLESS:MOV32H,AMOV31H,22HRET2023/2/631【功能】多字节无符号数的减法。【入口参数】DATA1=被减数的低位地址,DATA2=减数的低位地址,N字节相减。【出口参数】DATA2=差数低位地址MSUB:MOVR0,#DATA1 ;置被减数

MOVR1,#DATA2 ;置减数

MOVR7,#N ;置字节数

CLR C;清进位位LOOP:MOVA,@R0 SUBBA,@R1 ;求差

MOV @R1,A ;存结果

INC R0 ;修改指针

INC R1 DJNZR7,LOOP ;循环判断

RET 2023/2/6324.5简单I/O设备的并口直接驱动示例4.5.1独立式键盘与LED显示示例【例4-17】数据端与P0口正序连接。编写程序,分别实现功能:上电后数码管显示“P”,按下任何键后,显示从“0”开始每隔1秒加1,加至“F”后,数码管显示“P”,进入等待按键状态。2023/2/633TEMPEQU30H ORG0000H JMPSTARTORG0100HSTART:MOVSP,#5FHMOVP0,#8CH;显示"P" MOVP3,#0FFHNOKEY:MOVA,P3 CPLA JZNOKEY;无键按下

MOVTEMP,P3;有键按下

CALLD10ms MOVA,P3 CJNEA,TEMP,NOKEY;去抖

MOVR7,#16 MOVR2,#0LOOP:MOVA,R2MOVDPTR,#CODE_P0MOVCA,@A+DPTRMOVP0,AINCR2SETBRS0;切换组CALLD_1SCLRRS0DJNZR7,LOOP JMPSTARTD_1S:(子程序)D10ms:(子程序)

CODE_P0:DB0C0H,0F9H,0A4H,0B0HDB99

温馨提示

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

评论

0/150

提交评论