您好,欢迎访问三七文档
当前位置:首页 > 办公文档 > 述职报告 > 单片机汇编语言程序设计
1汇编语言程序及其设计1252汇编语言程序设计通过前面的学习,我们已经了解了单片机内部的结构,MCS-51指令系统的寻址方式、各类指令的格式及功能。下面我们就是要如何利用MCS-51的指令系统,来编写高效、充分利用其特点的程序。3§4.1概述4.1.1程序设计语言1.机器语言在单片机中,用二进制代码表示的指令、数字和符号简称为机器语言。直接用机器语言编写的程序称为机器语言程序。缺点:程序不易看懂,不便于记忆,容易出错。目前,用于程序设计的语言基本上分为三种:42.汇编语言用助记符表示的指令称为符号语言或汇编语言。汇编语言程序(源程序)需要“汇编”(由专门的汇编程序完成)才能转换成机器语言。得到的机器语言程序称为目标程序。特点:•是面向机器的语言,必须对硬件有一定的了解。•助记符指令和机器指令一一对应。•能直接管理和控制硬件设备(功能部件)。程序设计语言53.高级语言高级语言不受具体机器的限制,都是参照一些数学语言而设计的,使用了许多数学公式和数学计算上的习惯用语,非常擅长于科学计算。常用的高级语言,如BASIC、FORTRAN、C语言等。特点:•通用性强,直观、易懂、易学、可读性好。•计算机不能直接识别和执行。(需要进行编译)•发展很快。64.1.2编制程序的步骤1.任务分析(硬件、软件系统分析)2.确定算法和工作步骤;3.程序总体设计和流程图绘制关于流程图符号:开始、结束----圆角矩形工作任务----矩形判断分支----菱形程序流向----开始结束74.分配内存,确定程序与数据区存放地址;5.编写源程序;6.调试、修改,最终确定程序。4.1.2编制程序的步骤84.1.3方法技巧1.模块化设计(按功能分:显示、键盘解读、中断、打印、输入、发送等)2.尽量采用循环及子程序结构(节省内存)3.在使用内存时谨防内存资源冲突94.1.4汇编语言的规范•汇编语言源程序由以下两种指令构成:汇编语句(指令语句)伪指令(指示性语句)•汇编语句的格式:标号:操作码操作数;注释•数据表示形式:二进制(B)、十六进制(H)、十进制(D或省略)、ASCII码(以单引号标识)10控制汇编用的特殊指令,这些指令不属于指令系统,即不会产生机器代码。通过使用伪指令向汇编程序发出指示信息,告诉它如何完成汇编工作。伪指令具有控制汇编程序的输入输出、定义数据和符号、条件汇编、分配存储空间等功能。伪指令11常用的伪指令ORG定位目的程序的起始地址。格式:ORG表达式如:ORG0000H•注:表达式必须为16位地址值。END汇编语言程序结束伪指令。注:一定放在程序末尾!12EQU赋值伪指令。格式:字符名称EQU数值或汇编符号例:AAEQU30HK1EQU40HMOVA,AA;(30H)→AMOVA,K1;(40H)→A常用的伪指令13DB(DefineByte)从指定单元开始定义(存储)若干个字节的数据或ASCII码字符,常用于定义数据常数表。格式:DB字节常数或ASCII字符例:ORG1000HDB34H,0DEH,“A”,“B”DB0AH,0BH,20常用的伪指令14常用的伪指令BIT位地址符号指令。把位地址赋于规定的字符名称。格式:字符名称BIT位地址例:GPBITP1.1QQBITP3.215§4.2汇编语言程序编辑和汇编1.编辑(源程序,以.ASM扩展名存盘);2.汇编(手工或机器汇编);如:MOVA,#88H;机器码7488MOV35H,58H;机器码753558又如:地址目标码源程序ORG1000H1000H747FMOVA,#7FH1002H7944MOVR1,#44HEND16§4.3程序设计基础与举例4.3.1顺序结构程序org1000hstart:movdptr,#2000hmova,20hmovca,@a+dptrmov21h,asjmp$org2000htable:db0,1,4,9,16,25end例1:变量存在内部RAM的20H单元中,其取值范围:0~5,编成,查表法求其平方值17开始表格首地址送DPTR变量送A(20H)A查平方表(A+DPTR)A结束结果送21H单元:A21H18例2:将20H单元的压缩(Packed)BCD码拆成两个ACSII码存入21H、22H单元。BCD012...9ASCII30H31H32H...39H19方法1(20H)A10HBA/B,A中为高4位BCD码,B中为低4位BCD码B+30HBB(21H)A+30HAA(22H)开始结束20周期数源程序ORG2000HMOVA,20HMOVB,#10HDIVABORLB,#30HMOV21H,BORLA,#30HMOV22H,AEND124221113;除以10H;高4位BCD码转换位ASCII码;低4位BCD码转换位ASCII码210(21H)(20H)AA与(21H)的低4位交换(21H)+30H(21H)A的高低半字节交换A+30HAA(22H)开始结束方法2:22ORG2000HMOVR0,#21HMOV@R0,#0MOVA,20HXCHDA,@R0ORL21H,#30HSWAPAORLA,#30HMOV22H,AEND;清21H单元;低4位BCD码送21H单元,;低4位BCD码转换位ASCII码;高4位BCD码转换位ASCII码111121119周期数源程序234.3.2分支程序分支程序可根据要求无条件或条件地改变程序执行流向。编写分支程序主要在于正确使用转移指令。分支程序有:单分支结构、双分支结构、多分支结构(散转)条件成立?下条指令程序段A单分支结构YN条件成立?程序段AYN程序段A双分支结构244.3.2分支程序分支程序可根据要求无条件或条件地改变程序执行流向。编写分支程序主要在于正确使用转移指令。分支程序有:单分支结构、双分支结构、多分支结构(散转)K=?程序段nn0程序段1多分支结构程序段0125例1:设变量x以补码形式存放在片内RAM30H单元中,变量y与x的关系是:编程根据x的值求y值并放回原单元。0,50,200,xxxHxxy26A=?y=x+500y=20Hy=x0取x即(30h)A开始存y即y20h结束27ORG1000HSTART:MOVA,30HJZNEXT;x=0,转移ANLA,#80H;保留符号位JZED;x0,转移MOVA,#05H;x0,不转移ADDA,30HMOV30H,ASJMPEDNEXT:MOV30H,#20HED:SJMP$28START:MOVDPTR,#TABMOVA,R7ADDA,R7;R7×2AMOVR3,A;暂存R3MOVCA,@A+DPTR;取高位地址XCHA,R3INCAMOVCA,@A+DPTR;取低位地址MOVDPL,AMOVDPH,R3;转移地址送入DPTRCLRAJMP@A+DPTRTAB:DWP0DWP1…DWPN例2:根据R7的内容,转至对应的分支程序。设R7的内容为0~N,对应的处理程序地址分别为P0~P7P0高位P0低位TABP1高位P1低位TAB+2294.3.3循环程序循环程序一般由:初始化部分循环体部分--处理部分、修改部分、控制部分结束部分其结构一般有两种:先进入处理部分,再控制循环•至少执行一次循环体先控制循环,再进入处理部分•循环体是否执行,取决于判断结果。30开始设置循环初值循环处理循环修改结束处理结束循环结束?开始设置循环初值循环处理循环修改结束处理结束循环结束?NYYN31循环控制的一般方法:循环次数已知利用循环次数控制循环次数未知利用关键字控制32例4-3-6:50ms延时子程序。设晶振频率为12MHz,则机器周期为1us。DEL:MOVR7,#200;1μsDEL1:MOVR6,#123;1μsNOP;1μsDJNZR6,$;2μsDJNZR7,DEL1;2μsRET;2μs延时时间:t=1+200[(1+1+2*123)+2]+2≈50000us=50ms334.3.4子程序问题子程序设计时注意事项:1.给子程序赋一个名字。实际为入口地址代号。2.要能正确传递参数:入口条件:子程序中要处理的数据如何给予。出口条件:子程序处理结果如何存放。(寄存器、存储器、堆栈方式)3.保护与恢复现场:保护现场:压栈指令PUSH恢复现场:弹出指令POP4.子程序可以嵌套34例4-3-9:利用查表法求平方和,设a、b、c分别存于内部RAM的DA、DB、DC三个单元中。MOVA,DA;取aACALLSQR;调用查表子程序MOVR1,A;a的平方暂存R1中MOVA,DB;取bACALLSQR;调用查表子程序ADDA,R1;求出平方和暂存阿A中MOVDC,A;结果存于DC中SJMP$SQR:MOVDPTR,#TAB;子程序MOVCA,@A+DPTRRETTAB:DB0,1,4,9,16,25,36,49,64,81END22bac利用累加器或寄存器传递参数354.3.5码型转换程序的设计一、十六进制数与ASCCII码之间的转换(对比BCD与ASCCI之间的转换—4.3.1中例2)表4-1十六进制数与ASCII码之间的关系十六进制数十六进制数十六进制数十六进制数030H434H838HC43H131H535H939HD44H232H636HA41HE45H333H737HB42HF46H36例4-3-15将一位十六进制数转换成ASCII码,设十六进制数存放在R0中,转换后的ASCII码放在R2中。HTASC:MOVA,R0;取十六进制数PUSHACC;保护CLRC;SUBBA,#0AH;判断是否大于十POPACC;JCLOOP;小于十,直接加30HADDA,#07H;大于十,加37HLOOP:ADDA,#30HMOVR2,ARET37例4-3-16利用外部中断计数每十次使LED灯“明”“暗”变化一次。INTO0:PUSHAcc;;现场保护PUSHPSWINC38HMOVA,38HCJNEA,#0AH,INTFWCPLP2.5;取反P2.5口使LED灯变化MOV38H,#00HINTFW:POPPSW;恢复现场POPAccRETI;中断返回38二、键盘矩阵的扫描解读附图2键盘矩阵电路结构图VCCMCU单片机Pm.0Pm.1Pm.2Pm.3Pm.4Pn.0Pn.1Pn.2Pn.3Pn.412346789111213141617181921222324510152025Pm.xPn.yPm.5262728293039开始键盘矩阵输出线扫描返回附图1键盘矩阵扫描程序流程简图各对应键具体处理有键按下吗?YN置键解读标志位=1消抖动延时了吗?YN输入那个口线有变?YN扫描那个口线输出?YN键解读标志位=0?YN清键解读标志位=040附图5键盘矩阵扫描程序跳转结构图键盘矩阵扫描Key_matrix_1:Key_matrix_2:Key_matrix_3:Key_matrix_4:Key_matrix_0:JNBPn.0,Key_matrix_0JNBPn.1,Key_matrix_1JNBPn.2,Key_matrix_2JNBPn.3,Key_matrix_3JNBPn.4,Key_matrix_4JBPm.0,Key_gloze_1JBPm.1,Key_gloze_6JBPm.2,Key_gloze_11JBPm.3,Key_gloze_16JBPm.4,Key_gloze_21JBPm.5,Key_gloze_26Key_gloze_i:(i=1、2、…、30)JBPm.0,Key_gloze_2JBPm.1,Key_gloze_7JBPm.2,Key_gloze_12JBPm.3,Key_gloze_17JBPm.4,Key_gloze_22JBPm.5,Key_gloze_27JBPm.0,Key_gloze_3JBPm.1,Key_gloze_8JBPm.2,Key_gloze_13JBPm.3,Key_gloze_18JBPm.4,Key_gloze_23JBPm.5,Key_gloze_
本文标题:单片机汇编语言程序设计
链接地址:https://www.777doc.com/doc-3355430 .html