单片机原理及应用电子教案 - 重庆广播电视大学_第1页
单片机原理及应用电子教案 - 重庆广播电视大学_第2页
单片机原理及应用电子教案 - 重庆广播电视大学_第3页
单片机原理及应用电子教案 - 重庆广播电视大学_第4页
单片机原理及应用电子教案 - 重庆广播电视大学_第5页
已阅读5页,还剩33页未读, 继续免费阅读

下载本文档

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

文档简介

《单片机原理与接口技术》

电子教案

重庆工商职业学院第四章

MCS-51汇编语言程序设计

[内容提要]

本章主要讲述MCS-51的程序设计方法和程序设计举例。单片机的学习不外乎就是两项内容,一项是学会构建硬件系统,另一项就是学会应用程序设计。本章讲述的程序设计只是最简单的基本程序设计。[学习要求]

掌握单片机汇编语言程序的基本结构以及加减乘除和数制转换等简单程序设计的方法,理解常用查表等典型程序设计方法。4.1汇编语言程序设计概述1.机器语言:机器语言是用二进制代码0和1表示指令和数据的最原始的程序设计语言。2.汇编语言:在汇编语言中,指令用助记符表示,地址、操作数可用标号、符号地址及字符等形式来描述。3.高级语言:高级语言是接近于人的自然语言,面向过程而独立于机器的通用语言。一、语言的分类4.1汇编语言程序设计概述

MCS-51单片机汇编语言,包含两类不同性质的指令。(1)基本指令:即指令系统中的指令。它们都是机器能够执行的指令,每一条指令都有对应的机器码。(2)伪指令:汇编时用于控制汇编的指令。它们都是机器不执行的指令,无机器码。二、汇编语言的指令类型4.1汇编语言程序设计概述汇编语言源程序是由汇编语句(即指令)组成的。其典型的汇编语句格式如下:[<标号>]: <操作码> [<操作数>] ;[<注释>]

如:START: MOV A,30H ;A←(30H)三、汇编语言的语句格式4.1汇编语言程序设计概述1.ORG:汇编起始地址其含义是指定下面目标程序的起始地址为表达式值。表达式常为一个双字节地址数。例如:ORG0100HSTART:MOVA,#00H汇编号,从START开始的目标程序,其起始地址从0100H开始。由于表达式0100H是立即型地址码所以隐含地指明该程序段属绝对地址段。一个源程序中,可能有多处设置程序段起始地址,因此定义地址空间应从低地址端向高地址设置,不能重叠,否则将出错。若程序段前无ORG伪指令,则汇编后的目标程序将从0000H地址开始或紧接前段程序后。若表达式为浮动程序段中定义过的标号,则由该标号定义的目标程序段首地址也将之浮动。四、MCS-51汇编语言的伪指令随着单片机的广泛应用和开发以装置功能的不断完善与发展,汇编语言源程序都借助系统机(PC等)进行编辑、汇编和调试。因此,在编制汇编语言源程序时,常需应用伪指令。伪指令又称汇编程序控制译码指令,属说明性汇编指令。“伪”字体现在汇编时不产生机器指令代码,不影响程序的执行,仅产生供汇编时用的某些命令,在汇编时执行某些特殊操作。4.1汇编语言程序设计概述四、MCS-51汇编语言的伪指令2.汇编结束伪指令——ENDEND伪指令是汇编语言源程序结束为标志。源程序在汇编过程中执行完END伪指令,即结束伪指令,为调试方便,可根据调试需要而设置。它有两种格式:格式1:〈标号:〉END〈表达式〉格式2:〈标号:〉END或者END其中标号不是必需的,有无表达式的区别在于前者在汇编结束后立即转向由表达式指定的起始地址开始执行程序。因此,只需在程序运行的入口处和END后的表达式以同一个标号设置,当汇编完源程序后就自动转向由标号指定的入口处开始执行。表达式也可以入口入的绝对地址,后者则汇编结束后立即停机。4.1汇编语言程序设计概述四、MCS-51汇编语言的伪指令3.标号赋值伪指令格式:〈标号:〉EQU〈表达式〉指令的含义为本语句的标号等值于表达式,亦即将表达式值赋予标号。这里的标号和表达式是必不可少的。例如:TTY:EQU1080H本语句向汇编程序指明,标号TTY已于前句赋值为1080H,则相当于LOOP1=TTY=10802H,在程序中LOOP1和TTY两个标号可以互相使用。用EOU语句给一个标号赋值以后,在整个源程序中该标号的值是固定而不能更改的。4.1汇编语言程序设计概述四、MCS-51汇编语言的伪指令4.定义字节数据伪指令——DB或DEGB格式:〈标号:〉DB〈表达式或表达式串〉式中表达式或表达式串是指一个字节或用逗号隔开的一个字节数据。其含义是将表达式或表达式串所指定的字节数据存入从标号开始的连续存储单元中。标号为可选项,它表示数据存入程序存储器的起始地址。例如:SECON:DB02H,36H,74H,0B4H,OFFH,…上述语句表示将字节数据串按顺序存篇幅标号SECON所指示的地址为起始顺序存储单元中。作为本语句操作数控部分的表达式或表达式串,可以是数据表达式、ASCII码字符串、字节数据,字节数据串(其字节串长度限制在80B的数据内)。4.1汇编语言程序设计概述四、MCS-51汇编语言的伪指令5.定义字数据伪指令——DW或DEFW格式:〈标号:〉DW〈表达式或表达式串〉本语句的含义是将作为操作部分的字数据(2B)或字数据串存入由标号指定的首地址按顺序连续单元中,定义字为为双字节的数据。在执行汇编时,计算机会自动按高位字节在前、低位字节在后的顺序格式存入程序存储器单元中例如:ABC:DW1234H,4567H,0A5C4H,…汇编执行时第一个字节的12H存入标号ABC所指示的存储单元,34H存入(ABC)+1单元中,其余按此顺序将后续字节数据存入对应的存储单元中,如标号ABC定义为1000H,则上例汇编后:(1000H)=12H,(1001H)=34H,(1002H)=45H,…。4.1汇编语言程序设计概述四、MCS-51汇编语言的伪指令6.存储区说明伪指令——DS格式:〈标号:〉DS〈表达式〉其含义是以标号的值为首地址保留表达式所指定的若干存储单元空间作为备用。例如:BASE:DS0100H汇编后,程序存储器从标号BASE为首地址开始,空出256个存储单元,以备另用。7.定义标号值伪指令——DL格式:〈标号:〉DL〈表达式〉其含义是定义该标号的值为表达式值,同样,标号和表达式是不可缺少的。例如:COUNT1:DL2300H;定义COUNT1=2300HCOUNT2:DLCOUNT1+1;定义COUNT2=2300H+1由上可见,DL和EQU的功能都是将表达成值赋给标叼,但两者有区别,用DL语句可在同一源程序中对同一标号多次赋值,即可更改已定义的标号值;而用EQU语句则只能给标号一次赋值,而后在整个源程序中再不能更改4.2单片机汇编语言程序的结构形式一、程序结构的三种形式

1.三种形式顺序结构、分支结构、循环结构2.汇编语言程序设计步骤:

◆分析问题

◆确定算法

◆设计程序流程图

◆分配内存单元

◆编写汇编语言源程序

◆调试程序4.2单片机汇编语言程序的结构形式二、顺序程序简单结构程序又称顺序结构程序,是汇编语言程序设计中最基本、最单纯的程序,在整个程序设计所占比例最大,是程序设计的基础。这里所说的简单结构程序是指一种无分支的直接程序,是按照逻辑操作顺序,从第一条指令开始逐步条顺序执行,直到最后一条指令为止。特点:程序按编写的顺序依次往下执行每一条指令,直到最后一条。4.2单片机汇编语言程序的结构形式二、顺序程序【例4.1】将30H单元内的两位BCD码拆开并转换成ASCII码,存入RAM两个单元中。程序流程如图4-1所示。参考程序如下:

ORG 2000HMOV A,30H ;取值ANL A,#0FH ;取低4位ADD A,#30H ;转换成ASCII码MOV 32H,A ;保存结果MOV A,30H ;取值SWAP A ;高4位与低4位互换ANL A,#0FH ;取低4位(原来的高4位)ADD A,#30H ;转换成ASCII码MOV 31H,A ;保存结果SJMP $END结束取数据低4位转换成ASCII码存ASCII码取数据高4位转换成ASCII码存ASCII码开始图4-14.2单片机汇编语言程序的结构形式三、分支程序1.分支程序有三种基本形式,即单分支、双分支、多分支。流程图如图4-2所示。2.分支程序的设计要点如下:(1)先建立可供条件转移指令测试的条件。(2)选用合适的条件转移指令。(3)在转移的目的地址处设定标号。条件满足?AYN(a)条件满足?ABNY(b)(c)A0A1AnK=0K=1…K=nK=?……图4-2分支程序结构流程图(a)单分支(b)双分支(c)多分支4.2单片机汇编语言程序的结构形式三、分支程序3.分支程序设计举例【例4.2】设X存在30H单元中,根据下式

X+2 X>0Y= 100 X=0求出Y值,将Y值存入31H单元。

∣X∣ X<0分析:根据数据的符号位判别该数的正负,若最高位为0,再判别该数是否为0。程序流程如图4-3所示。参考程序如下:

ORG 1000HMOV A,30H ;取数JB ACC7,NEG;负数,转NEGJZ ZER0 ;为零,转ZER0ADD A,#02H ;为正数,求X+2AJMPSAVE ;转到SAVE,保存数据ZER0:MOV A,#64H ;数据为零,Y=100AJMPSAVE ;转到SAVE,保存数据

4.2单片机汇编语言程序的结构形式三、分支程序NEG:DECA ; CPL A ;求∣X∣SAVE:MOV31H,A ;保存数据SJMP $ ;暂停ENDA为负数?取数,A←(30H)开始结束A=0?YNNA←|X|A←64HA←X+2存数,(31H)←A(30H)图4-34.2单片机汇编语言程序的结构形式三、分支程序【例4.3】设有两个16位无符号数NA,NB分别存放在8031单片机内部RAM的40H、41H及50H、51H单元中,当NA>NB时,将内部RAM的42H单元清0;否则,将该单元置成全1,试编程。分析:因为无16位数的比较指令,所以,只能用8位数的比较指令。参考程序如下:

ORG2000HCMP:MOVA,50HCJNEA,40H,CMP1MOVA,51HCJNEA,41H,CMP1SJMPNHIGHECMP1:JCHIGHENHIGHE:MOV42H,#0FFHSJMPDONEHIGHE:MOV42H,#00HDONE:SJMP$

END4.2单片机汇编语言程序的结构形式四、循环程序顺序程序、分支程序的共同点是每条指令至多执行一次,而实际中有时要求某程序段多次重复执行,就需要采用循环结构。1.循环程序的结构循环程序一般由四个主要部分组成:初始化部分:为循环程序做准备,如规定循环次数、给各变量和地址指针预置初值。处理部分:为反复执行的程序段,是循环程序的实体,也是循环程序的主体。循环控制部分:这部分的作用是修改循环变量和控制变量,并判断循环是否结束,直到符合结束条件时,跳出循环为止。结束部分:这部分主要是对循环程序的结果进行分析、处理和存放。4.2单片机汇编语言程序的结构形式四、循环程序(a)当型循环结构(b)直到型循环结构循环结束?循环体YN初始化修改循环参数结束部分开始结束循环结束?循环体Y初始化修改循环参数结束部分开始N结束图4-4循环结构程序流程图1.循环程序的结构4.2单片机汇编语言程序的结构形式四、循环程序2.循环程序设计举例【例4.4】已知片外RAM的10H单元存放8位二进制数,要求将其转移成相应的ASCII码,并以高位在前,低位在后的顺序,依次存放到片外RAM以11H为首地址的连续单元中,试编程。分析:先将中间单元置成30H,然后判欲转换位是否为1,若是,则将中间单元内容加1;否则,中间单元内容保持不变。通过左移指令实现由高到低的顺序进行转换。参考程序如下:ORG1000HSTART:MOVR2,#08H;循环计数初值(循环次数已知)

MOVR0,#10H;地址指针初值

MOVXA,@R0;取数

MOVB,A;暂存B中

LOOP:MOVA,#30H;将中间单元(A)置成30H4.2单片机汇编语言程序的结构形式四、循环程序JNBB.7,NA;判断转换的二进制位为0否?若是转NAINCA;若为1,则(A)内容加1,成为;1的ASCII码“31H”NA:INCR0;修改地址指针

MOVX@R0,A;存放转换的结果

MOVA,BRLA,B;作好准备,判断下一位

MOVB,A;暂存

DJNZR2,LOOP;判断转换结束否?未完继续

SJMP$

END2.循环程序设计举例4.2单片机汇编语言程序的结构形式四、循环程序【例4.5】设用户用键盘输入长度不超过100字节的字符串放在8031单片机外部RAM以20H为首地址的连续单元,该字符串用回车符CR(‘CR’=0DH)作为结束标志,要求统计此字符串的长度并存入内部RAM的1FH单元中。分析:从首单元开始取数,每取一数判断其是否为‘CR’,是则结束。参考程序如下:ORG1000HSTADADATA20HSLANGDATA1FHCMCR2:MOVR0,#STADA-1MOVB,#0FFHCRLOP:INCR0INCBMOVXA,@R0CJNEA,#0DH,CRLOPMOVSLANG,BSJMP$

END2.循环程序设计举例4.2单片机汇编语言程序的结构形式3.多重循环结构程序某些复杂问题或者循环数超过256,则需采用多重循环的程序结构,即循环程序中包含循环程序或一个大循环中包含多个小循环程序,称多重循环程序结构,又称循环嵌套。循环的重数不限,但必须每循环的层次分明,不能有相互交叉!外循环中循环内循环外循环内循环外循环内循环内循环(a)嵌套正确(b)嵌套正确(c)交叉不正确图4-5多重循环示意图四、循环程序4.2单片机汇编语言程序的结构形式【例4.6】设在8031内部RAM中存一无符号数的数组,其长度为100,起始地址是30H,要求将它们从大到小排序,排序后仍存放在原区域中,试编程。分析:内RAM第一次循环第二次循环······30H00030631H030603大

32H060280数

33H028004向

····上100个··········冒

····90H35762491H76246092H24600193H600000

最多99次循环这就是所谓的“冒泡法”。实际上大多情况,用不到99次循环,排序就结束。为了提高排序速度,程序中可设一交换标志位,如10H位,每次循环中:若有交换则SETB10H;若无交换则CLR10H。每次循环结束时,测10H位,判断排序是否结束。参考程序如下:四、循环程序4.2单片机汇编语言程序的结构形式ORG1000HBUBBLE:MOVR0,#30HMOVB,#64HCLR10HDECB;长度计数

LOOP:MOVA,@R0MOV20H,A;暂存,为交换作准备

INCR0MOV21H,@R0CJNEA,21H,BUEU;若(20H)≠(21H)转移

BUEU:JNCBUNEXT;(20H)≥(21H)转移

MOVA,@R0;若(20H)<(21H)则交换

MOV@R0,20HDECR0;使R0退格指向小地址

MOV@R0,AINCR0;恢复R0指向大地址

SETB10H;置交换标志BUNEXT:DJNZB,LOOPJB10H,BUBBLE;判断标志位为1否?若为1,则继续

END四、循环程序一、多字节数加法1.多字节无符号数加法CLRCMOVR0,#40H;指向加数最低位MOVR1,#5OH;指向另一加数最低位MOVR2,#04H;字节数作计数初值LOOP1:MOVA,@R0;取被加数ADDCA,@R1;两数相加,带进位MOV@R0,AINCR0;修改地址INCR1DJNZR2,LOOPl;未加完转LOOP1JNCLOOP2;无进位转LOOP2MOV@R0,#01HLOOP2:DECR0RET4.3MCS-51单片机汇编语言程序设计举例2.多字节有符号数加法SDADD:CLR07H;标志位清零MOVA,R0;复制保存地址指针MOVR2,AMOVA,R3MOVR7,ACLRCLOOP1:MOVA,@R0ADDCA,@R1;相加MOV@R0,AINCR0INCR1;地址指针加1DJNZR7,LOOP1图4-6多字节有符号数加法程序流程图一、多字节数加法4.3MCS-51单片机汇编语言程序设计举例2.多字节有符号数加法JBOV,ERR;若溢出,转溢出处理DECR0MOVA,@R0JNBE7H,LOOP2SETB07H;和值为负,置位标志LOOP2:MOVA,R2;恢复地址指针MOVR0,ARET┇ERR:┇;溢出处理RET一、多字节数加法4.3MCS-51单片机汇编语言程序设计举例二、多字节数减法MOVR0,#40H;指向被减数最低位MOVR1,#5OH;指向减数最低位MOVR2,#04H;字节数CLRCLOOP1:MOVA,@R0SUBBA,@R1;完成一个字节的减法运算MOV@R0,AINCR0INCR1DJNZR2,LOOP1RET4.3MCS-51单片机汇编语言程序设计举例三、多字节十进制数(BCD码)加法图4-7BCD码多字节加法程序流程图BCDADD:MOV20H,R0MOV23H,R3CLRCLOOP0:MOVA,@R0;取被加数ADDCA,@R1;两数相加DAA;十进制调整MOV@R0,AINCR0;指针加1INCR1

DJNZR3,LOOP0;作完加法否MOVR2.#23HJNCRETURN;有无进位MOV@R0,#01HINCR3RETURN:MOVR0,#20HRET4.3MCS-51单片机汇编语言程序设计举例四、多字节数乘法ZHENFA:MOVA,R0MOVB,R1MULAB;(R1)*(R0)MOVR3,A;积的低位送到R3MOVR4,B;积的高位送到R4MOVA,R0MOVB,R2MULAB;(R2)*(R0)ADDA,R4;(R1)*(R0)的高位加(R2)*(R0)的低位MOVR4,A;结果送R4,进位在CY中MOVA,BADDCA,#OOH;(R2)*(R0)的高位加低位来的进位MOVR5,A;结果送R5RET4.3MCS-51单片机汇编语言程序设计举例五、多字节数除法DV:MOVR7,#08H;设计数初值DVl:CLRCMOVA,R5RLCAMOVR5,AMOVA,R6RLCA;将(R6)、(R5)左移一位MOV07H,C;将移出的一位送07H位保存CLRCSUBBA,R2;余数(高位)减除数JBO7H,GOU;若标志位为1,说明够减JNCGOU;无借位也说明够减ADDA,R2;否则,恢复余数AJMPDV2GOU:INCR5;商上1DV2:MOVR6,A;保存余数(高位)DJNZR7,DVlRET图4-8除法程序流程图4.3MCS-51单片机汇编语言程序设计举例六、数据的拼拆【例4.7】设在30H和31H单元中各有一个8位数据:(30H)=x7x6x5x4x3x2x1x0,(31H)=y7y6y5y4y3y2y1y0现在要从30H单元中取出低5位,并从31H单元中取出低3位完成拼装,拼装结果送40H单元保存,并且规定:(40H)=y2y1y0x4x3x2x1x0分析:利用逻辑指令ANL、ORL来完成数据的拼拆,参考程序如下:4.3MCS-51单片机汇编语言程序设计举例MOV40H,30H;将x7~x0传送到40H单元ANL40H,#000111llB;将高3位屏蔽掉MOVA,31H;将y7~y0传送到累加器中SWAPA;将A的内容左移4次RLA;y2~y0移到高3位ANLA,#111000OOB;将低5位屏蔽掉ORL40H,A;完成拼装任务七、数据的转换1.ASCII码与二进制数的互相转换【例4.8】编程实现十六进制数表示的ASC1I代码转换成4位二进制数(1位十六进制数)。分析:对于这种转换,只要注意到下述关系便不难编写出转换程序:“字符0”~“字符9”的ASCII码值为“30H”~“39H”,它们与30H之差恰好为“00H”~“09H”,结果均<0AH。“字符A”~“字符F”的ASCII码值为“41H”~“46H”,它们各自减去37H后恰好为“0AH”~“0FH”,结果均>0AH。根据这个关系可以编出转换程序如下,程序以R1作为入口和出口。ASCHIN:MOVA,R1;取操作数CLRC;清进位标志位CSUBBA,#30H;ASCII码减去30H,实现0-9的转换MOVR1,A;暂存结果SUBBA,#0AH;结果是否>9?JCLOOP;若≤9则转换正确XCHA,R1SUBBA,#07H;若>9则减37HMOVR1,ALOOP:RET4.3MCS-51单片机汇编语言程序设计举例2.BCD码与二进制数的转换【例4.9】4位BCD码整数转换

温馨提示

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

评论

0/150

提交评论