您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 51系列单片机程序设计解析
2010/5/18单片机原理与接口技术第四章MCS-51系列单片机程序设计4.1汇编语言程序设计概述计算机是仿照人的思维方式顺序执行一条条指令来完成特定任务的机器,计算机程序因此被定义为指令或语句的“有序集合”,程序设计是指编写计算机程序的过程。汇编语言是用指令助记符等表示的计算机指令,采用汇编语言编写的程序被称为汇编语言程序。汇编语言程序具有代码效率高(编译后的指令代码占用存储空间小)和执行时间短等优势和特点。由于单片机的存储器等资源有限,单片机应用程序中经常需要面对硬件操作,且对程序执行的时间有较为严格的要求或限制。因此,汇编语言程序设计是单片机应用系统设计的重要基础之一。4.1汇编语言程序设计概述1、汇编语言的特点:汇编语言的特点归纳如下:◇助记符指令与机器指令一一对应;◇程序代码效率高,占用存储空间小,运行速度快,汇编语言程序往往是最优化的程序;◇助记符指令(汇编指令)与计算机硬件联系紧密,要求编程人员对计算机硬件较为熟悉;◇汇编语言程序缺乏通用性,移植性较差。4.1.1汇编语言的特点及语句格式4.1汇编语言程序设计概述2、汇编语言的语句格式MCS-51系列单片机汇编语言的语句格式如下:[标号]:操作码[操作数];[注释]◇[标号]——标号是汇编语句地址的符号表示。◇操作码——用于规定该语句所执行的操作。◇[操作数]——操作数为汇编指令的操作提供数据或地址◇[注释]——注释是指对一条汇编语句或一段汇编语言程序的说明,以增加汇编语言程序的可读性。4.1.1汇编语言的特点及语句格式4.1汇编语言程序设计概述1、起始地址定位伪指令ORG格式:[标号]:ORG操作数说明:其功能是指出紧接其后的指令的目标代码的第一个字节在程序存储器中的绝对地址。例如:ORG0030HSTART:MOVA,#33H......即定义标号START表示的起始地址值为0030H,该段程序的指令代码从该地址开始顺序存放。4.1.2汇编语言伪指令4.1汇编语言程序设计概述2、赋值伪指令EQU格式:字符名称EQU操作数说明:该指令用于字符名称赋值。在同一个源程序中,任何一个字符名称只能赋值一次。且一旦赋值之后,整个源程序中该字符的值就固定不变了。例如:ADPORTEQU1001H即给字符名称ADPORT赋值16进制数1001H。4.1.2汇编语言伪指令4.1汇编语言程序设计概述3、数据地址赋值伪指令DATA格式:字符名称DATA操作数说明:DATA伪指令的功能与EQU伪指令相似,不同之处在于DATA伪指令所定义的字符名称可先使用后定义(赋值),也可先定义(赋值)后使用。在程序中它常用来定义(赋值)数据地址。4.1.2汇编语言伪指令4.1汇编语言程序设计概述4、字节数据赋值伪指令DB格式:[标号:]DB数据表(字节)说明:该伪指令用于定义(赋值)若干字节数据表(固定常数),并存放在指定地址单元开始的程序存储器中。例如:ORG0050HTABLE:DB99H,88H即表示在地址0050H(标号TABLE)开始定义(赋值)两个字节数据(99H,88H)。4.1.2汇编语言伪指令4.1汇编语言程序设计概述5、双字节数据赋值伪指令DW格式:[标号:]DW数据表(双字节)说明:该伪指令与DB伪指令的不同之处在于DW定义(赋值)的是双字节数据,而DB定义(赋值)的是单字节数据。高8位数据安排在低地址单元,低8位数据安排在高地址单元。6、预留空间定义伪指令DS格式:[标号:]DS操作数说明:该伪指令的作用是通知汇编程序,从指定的地址单元开始(通常由标号指定首地址),保留由操作数(常数或表达式)规定的字节空间。4.1.2汇编语言伪指令4.1汇编语言程序设计概述7、位地址赋值伪指令BIT格式:字符名称BIT位地址说明:该伪指令给字符名称赋予位地址(片内RAM和SFR中的位地址),常用于位操作程序中。例如:FLAGBIT20H即将位地址20H赋予字符名称FLAG。8、定义汇编结束伪指令END格式:[标号:]END说明:汇编结束伪指令END的作用是通知汇编程序,汇编源程序到此结束。在一个汇编程序中,只允许出现一条END伪指令,且必须安排在整个源程序的末尾处。4.1.2汇编语言伪指令4.1汇编语言程序设计概述4.2基本程序结构1、顺序结构程序2、分支结构程序3、循环结构程序4、子程序5、中断程序基本程序结构4.2基本程序结构顺序结构是各类程序中最简单的,也是最基本的程序结构。顺序结构程序的特征是整个程序段没有任何转移指令。主要由数据传递类指令和数据运算类指令组成,通常用于执行数据传送和较为简单的算术或逻辑运算任务。4.2.1顺序结构4.2基本程序结构例4-1,将内部RAM中20H单元和30H单元的无符号数相加,存入R0(高位)和R1(低位)中。源程序如下:MOVA,20H;取出被加数ADDA,30H;两数相加MOVR1,A;低位存入R1CLRA;ADDCA,#00H;取进位标志MOVR0,A;高位存入R0RET4.2.1顺序结构4.2基本程序结构分支结构程序利用条件转移指令,使程序在执行某一指令后(产生测试条件),根据所规定的条件满足与否改变其后程序执行的顺序(产生分叉),即根据判断条件的成立与否来确定程序的走向。分支结构程序的特征是程序段中有控制转移类指令(条件转移指令)。依据程序分叉的数目,可将分支结构程序细分为单分支选择结构和多分支选择结构两类。4.2.2分支结构4.2基本程序结构1、单分支选择结构当程序的判断仅有两个出口(分叉),即两者选一时,称为单分支结构。通常用条件判断指令来选择并确定程序的出口。例4-3.设内部RAM40H和41H单元中存放2个8位无符号二进制数,试编程找出其中的大数存人30H单元中。源程序如下:MOVA,40HCJNEA,41H,LOOP;取2个数进行比较LOOP:JNCLOOP1;根据CY值,判断单分支出MOVA,41H;41H单元中是大数LOOP1:MOV30H,A;40H单元中是大数RET4.2.2分支结构4.2基本程序结构2、多分支选择结构当程序的判别部分有两个以上的出口(分叉)时,称为多分支选择结构。例4-4,设变量X的值存放在内部RAM的30H单元中,编程求解下列函数式,将求得的函数值Y存人40H单元。X+1(X≥100)Y=0(10≤X100)X一1(X10)4.2.2分支结构4.2基本程序结构MOVA,30H;取自变量X值CJNEA,#10,LOOP;与10比较,A中值不改变LOOP:JCLOOP2;若X10,转LOOP2CJNEA,#100,LOOP1;与100比较LOOP1:JNCLOOP3;若X100,转LOOP3MOV40H,#00H;因10≤X100,故Y=0SJMPEXITLOOP2:DECA;因X10,故Y=X一1MOV40H,ASJMPEXITLOOP3:INCA;若X100,故Y=X+1MOV40H,AEXIT:RET4.2基本程序结构在程序设计中,遇到一段程序需要多次重复执行的情况,通常应该采用循环结构程序。1、循环结构程序组成循环结构程序由初始化、循环处理、循环控制和循环结束4部分组成。(1)初始化部分初始化部分设置循环处理之前的初始状态,如循环次数、变量初值、地址指针初值等。(2)循环处理部分循环处理部分又称循环体,是重复执行的数据处理程序段,它是循环程序的核心部分(功能主体)。4.2.3循环结构4.2基本程序结构(3)循环控制部分控制部分控制循环继续与否。(4)结束部分结束部分对循环程序全部执行结束后的结果进行分析、处理和保存。循环结构程序一般分为“单重循环”和“多重循环”两类,循环次数的控制有多种方式,当循环次数已知时,可采用循环次数计数器控制循环;若循环次数未知时,可按条件满足与否控制循环。4.2.3循环结构4.2基本程序结构2.循环程序设计在一个循环程序的循环体中不包含另外的循环结构称为单重循环。例4-5,设某字符串以回车符(0DH)为结束标志,并存放在内部RAM40H单元开始的连续存储单元之中,编写测试字符串长度的汇编语言程序。编程思路——为测试字符串(0DH)的长度,应使用逐个字符依次与回车符(ODH)比较的方法。为此需要设一个字符串指针和一个长度计数器,字符串指针用于指定字符,长度计数器用于累加字符串的长度。如比较不相等,则长度计数器和字符串指针都加1,以继续往下比较;如果比较相等,则表示该字符为回车符,字符串结束,长度计数器的值就是字符串的长度。4.2.3循环结构4.2基本程序结构2.循环程序设计◇程序如下:MOVR7,#0FFH;设长度计数器初值MOVR0,#3FH;字符串指针初值LOOP:INCR7INCR0CJNE@R0,#ODH,LOOPRET4.2.3循环结构4.2基本程序结构4.2.4子程序结构在编写程序过程中,如果遇到在几个程序段中都需要执行某段相同程序的情况(功能独立),为减少编程工作量和节省程序存储空间,就应该采用子程序结构,将重复执行的相同程序段编写成为一个子程序(功能子程序)。返回调用断点子程序主程序4.2基本程序结构MAIN:……;进入主程序MOVR0,#03H;设置入口参数(延时1)ACALLSUBPRO;调用子程序……;子程序返回,继续执行主程序;###################################;子程序入口地址(子程序名称):SUBPRO;功能:延时子程序(延时时间由R0初值设置);入口参数:R0内存放延时计数初值;出口参数:无;使用寄存器:R0、R1;###################################SUBPRO:MOVR1,#03HDJNZR1,$DJNZR0,SUBPRORET;子程序返回END4.2.3子程序结构4.2基本程序结构单片机中断程序设计主要有以下三个方面:1、中断向量设置2、中断初始化3、中断服务程序4.2.5中断程序结构4.2基本程序结构例4-7,设89C51单片机外中断0(EX0)下降沿有效,每次进入中断服务程序,要求将89C51单片机的P1.7~P1.0取反。主程序如下:ORG0000HSTAR:AJMPMAIN;主程序原始入口ORG0003H;外部中断0中断向量AJMPEXTR;跳转到EX0中断服务子程序实际入口地址ORG0030HMAIN:SETBIT0;主程序实际入口,边沿触发设置SETBEX0;外部中断0允许SETBEA;总中断允许HERE:AJMPHERE;等待再次进入中断服务程序4.2.5中断程序结构4.2基本程序结构中断服务子程序:ORG1200HEXTR:PUSHPSW;保护现场CPLA;累加器A数据取反MOVP1,A;数据输出至P1端口POPPSW;恢复现场RETI;中断返回4.2.5中断程序结构4.3汇编语言程序设计实践汇编语言程序设计的一般步骤如下:◇建立数学模型——用适用的数学方法描述所需要解决的问题;◇确定算法——将数学模型转化为适合单片机处理(顺序执行)的形式,采用绘制程序流程图等方法表示程序设计的思路和依据。◇编写源程序——采用模块化设计方法,合理划分功能模块,分配存储器和I/O端口(依据硬件电路)等资源,确定各模块内各程序段的结构,编写源程序文件。◇汇编及调试——在集成开发环境的支持下,汇编语言源程序经汇编生成目标程序文件,并通过调试以及对运行结果的分析,修正源程序中的错误,达到预期的设计目标。所谓查表,就是根据变量x在表格中查找y,使y=f(x)。函数值y事先根据变量x的取值范围计算出,并按一定规律编成表格存放在计算机的程序存储器中。当用户程序中需要用这些数据时,直接按编排的索引值(或程序号)寻找答案。这样编写的程序称为查表程序。查表程序是一种常用程序,广泛应用于LED显示器控制、智能化仪表控制、打印机打印以及数据转换等功能程序中,具有程序简单、执行速度快等优点。查表程序有多种结构形式,下面举例介绍一种常用的查表程序。4.3.1查表程序4.3汇编语言程序设计实践4.3.1查表程序例4-8,
本文标题:51系列单片机程序设计解析
链接地址:https://www.777doc.com/doc-5496998 .html