第7讲51单片机汇编语言程序设计.
51单片机汇编语言程序设计
51单片机汇编语言程序设计1.题目:数码管显示1~72.题目分析本实验将要求51单片机采用汇编程序来实现以上程序,我们首先要对51单片机进行硬件电路设计,然后编写相应的汇编程序3.硬件电路4.程序设计;-------------------------------------------------------------------------------;选择P1口作为数码管位选;-------------------------------------------------------------------------------org 0hmov p1,h ;启动P1作为数码管位选again: m ov p2,Fh ;0000 0011 1111 显示数字1sjmp againmov p2,h ;0000 0110 显示数字2sjmp againmov p2,Bh ;0101 1011 显示数字3sjmp againmov p2,Fh ;0100 1111 显示数字4sjmp againmov p2,h ;0110 0110 显示数字5sjmp againmov p2,Dh ;0110 1101 显示数字6sjmp againmov p2,dh ;0111 1101 显示数字7sjmp againend5.程序流程本汇编程序的程序流程如下:1)将P1口设置为数码管的位选;2)通过P2口设置相应的数字,P2口的值将会根据数字的不同而不同,以便实现将不同的数字显示到数码管上;3)循环2步骤,不断刷新P2口的值,从而实现数字的不断变化,从而实现将1-7数字在数码管上循环显示。
大学课件MCS51单片机指令系统与汇编语言程序设计
ANL C, P ; (C)← (C)∧(P)
其中:P是PSW的第0位,C是PSW的第7位。
(4)字节符号地址(字节名称)加位序号的形式。对于部分特 殊功能寄存器(如状态标志寄存器PSW),还可以用其字节名 称加位序号形式来访问某一位。AC 如:
定义:操作数存放在MCS-51内部的某个工作寄存器Rn (R0~R7)或部分专用寄存器中,这种寻址方式称为 寄存器寻址。
特点:由指令指出某一个寄存器的内容作为操作数。 存放操作数的寄存器在指令代码中不占据单独的一个 字节,而是嵌入(隐含)到操作码字节中。
寻址范围:四组通用寄存器Rn(R0~R7)、部分专用 寄存器( A, B, DPTR, Cy )。
伪指令只出现在汇编前的源程序中,仅提供汇编用的某些控制 信息,不产生可执行的目标代码,是CPU不能执行的指令。
(1)定位伪指令ORG
格式:ORG n
其中:n通常为绝对地址,可以是十六进制数、标号或表达式。
功能:规定编译后的机器代码存放的起始位置。在一个汇编 语言源程序中允许存在多条定位伪指令,但每一个n值都应和前
2.2.2 直接寻址
定义:将操作数的地址直接存放在指令中,这种寻址方式称为 直接寻址。 特点:指令中含有操作数的地址。该地址指出了参与操作的数 据所在的字节单元地址或位地址。计算机执行它们时便可根据 直接地址找到所需要的操作数。
寻址范围:ROM、片内RAM区、SFR和位地址空间。P42
2.2.3 寄存器寻址
定义:指令中给出的操作数是一个可单独寻址的位地址,这种寻址 方式称为位寻址方式。
特点:位寻址是直接寻址方式的一种,其特点是对8位二进制数中 的某一位的地址进行操作。
寻址范围:片内RAM低128B中位寻址区、部分SFR(其中有83位 可以位寻址)。
51单片机汇编语言程序设计
单片机原理与接口技术
中北大学电子科学技术专业
返回目录
8
4.1.3 汇编语言的规范
2.伪指令
---伪指令 伪指令ORG 伪指令
MCS-51系列单片机的常用伪指令有 ORG、 MCS-51系列单片机的常用伪指令有:ORG、 系列单片机的常用伪指令有: END、EQU、DB、DW、DS和BIT等 END、EQU、DB、DW、DS和BIT等。
23:24
单片机原理与接口技术
中北大学电子科学技术专业
返回目录
9
4.1.3 汇编语言的规范
(2)汇编结束伪指令END 汇编结束伪指令END
格式:[标号:] 格式: 标号:] END [表达式] [表达式 表达式]
---伪指令 伪指令END 伪指令
功能:结束汇编。汇编程序遇到END伪指令后即结束汇 功能:结束汇编。汇编程序遇到END伪指令后即结束汇 编。处于END之后的程序,汇编程序不予处理。 处于END之后的程序 汇编程序不予处理。 之后的程序, ORG 2000H 如: START: MOV A, #00H … END START ;表示标号START开始的程序段结束。 表示标号START开始的程序段结束 开始的程序段结束。
以上伪指令经汇编以后, 以上伪指令经汇编以后,将从 1010H开始的若干内存单元赋值。 1010H开始的若干内存单元赋值。 开始的若干内存单元赋值
23:24
单片机原理与接口技术
中北大学电子科学技术专业
返回目录
12
4.1.3 汇编语言的规范
(5)定义字伪指令 )定义字伪指令DW
[标号:] 标号: DW 16位二进制数表 16位二进制数表
(7)位定义伪指令BIT 位定义伪指令BIT
51 单片机 编程语言
51 单片机编程语言
51单片机是一种非常流行的单片机,它广泛应用于各种嵌入式
系统中。
它的编程语言主要是汇编语言和C语言。
汇编语言是一种
底层的语言,它直接操作单片机的寄存器和内存,可以实现高效的
控制和优化。
而C语言则是一种高级语言,它更易于理解和编写,
适合开发复杂的嵌入式系统。
使用51单片机编程语言可以实现各种功能,例如控制各种外围
设备、处理各种传感器数据、实现通信功能等。
由于其灵活性和高
性能,51单片机编程语言被广泛应用于各种领域,如工业控制、汽
车电子、家用电器等。
对于初学者来说,学习51单片机编程语言可能会有一定的难度,特别是对于汇编语言的学习。
但是一旦掌握了这些编程语言,就能
够实现更加复杂和功能丰富的嵌入式系统。
因此,学习51单片机编
程语言是非常有价值的。
总的来说,51单片机编程语言是一种非常重要的编程语言,它
在嵌入式系统领域有着广泛的应用,对于想要从事嵌入式系统开发
的人来说,学习这门编程语言是非常值得的。
51单片机C语言程序设计-图文
/* 名称:8 只 LED 左右来回点亮 说明:程序利用循环移位函数_crol_和_cror_形成来回滚动的效果
*/ #include<reg51.h> #include<intrins.h> #define uchar unsigned char #define uint unsigned int //延时 void DelayMS(uint x) {
case 2: //东西向黄灯闪烁,绿灯关闭 DelayMS(300); YELLOW_A=~YELLOW_A;GREEN_A=1; if(++Flash_Count!=10) return; //闪烁 5 次 Flash_Count=0; Operation_Type=3; break;
case 3: //东西向红灯,南北向绿灯亮 RED_A=0;YELLOW_A=1;GREEN_A=1; RED_B=1;YELLOW_B=1;GREEN_B=0; DelayMS(2000); Operation_Type=4; break;
3 Ykcsh 呈献
0x00,0xff,0x00,0xff,0x00,0xff,0x00,0xff }; //延时 void DelayMS(uint x) {
uchar i; while(x--) {
for(i=0;i<120;i++); } } //主程序 void main() { uchar i; while(1) { //从数组中读取数据送至 P0 和 P2 口显示
uchar i; while(x--) {
for(i=0;i<120;i++); } } //主程序 void main() { uchar i; P2=0x01; while(1) {
C51单片机汇编语言程序设计
C51单片机汇编语言程序设计一、二进制数与十六进制数之间的转换1、数的表达方法为了方便编程时书写,规定在数字后面加一个字母来区别,二进制数后加B十六进制数后加H。
2、二进制数与十六进制数对应表二进制十六进二进制制0000000100100011010001010110011101234567100010011010101111001101 11101111十六进制89ABCDEF3、二进制数转换为十六进制数转换方法为:从右向左每4位二进制数转化为1位十六进制数,不足4位部分用0补齐。
例:将(1010000110110001111)2转化为十六进制数解:把1010000110110001111从右向左每4位分为1组,再写出对应的十六进制数即可。
0101000011011000111150D8F答案:(1010000110110001111)2=(50D8F)16例:将1001101B转化为十六进制数解:把10011110B从右向左每4位分为1组,再写出对应的十六进制数即可。
100111109E答案:10011110B=9EH4、十六进制数转换为二进制数转换方法为:将每1位十六进制数转换为4位二进制数。
例:将(8A)16转化为二进制数解:将每位十六进制数写成4位二进制数即可。
8A10001010答案:(8A)16=(10001010)2例:将6BH转化为二进制数解:将每位十六进制数写成4位二进制数即可。
6B01101011答案:6BH=01101011B二、计算机中常用的基本术语1、位(bit)计算机中最小的数据单位。
由于计算机采用二进制数,所以1位二进制数称作1bit,例如110110B为6bit。
2、字节(Byte,简写为B)8位的二进制数称为一个字节,1B=8bit3、字(Word)和字长两个字节构成一个字,2B=1Word。
字长是指单片机一次能处理的二进制数的位数。
如AT89S51是8位机,就是指它的字长是8位,每次参与运算的二进制数的位数为8位。
MCS-51汇编语言程序设计
判断正误
ORG 0000 LEN1 DATA 31H LEN2 EQU 32H MOV A, LEN1+1 MOV B,LEN2+1 MOV R1,#LEN1 MOV R2,#LEN2 MOV R2,#LEN2+LEN1 ;CNT1 DATA R5 CNT2 EQU R6 ;CNT EQU ADD MOV R3,#LEN1+1 MOV R4,#LEN2+1 MOV DPTR,#TOEND TOEND:SJMP $ LEN1 DATA 31H LEN2 EQU 32H END
用汇编语言与用高级语言进行程序设计很相似。对于比 较复杂的问题可以先根据题目的要求作出流程图,然后 再根据流程图来编写程序。对于比较简单的问题则可以 不作流程因而直接编程。 两者的差别还是很大的。一个很重要的差别就在于用汇 编语言编程时,对于数据的存放位置,以及工作单元的 安排等都要由编程者自己安排。而用高级语言编程时, 这些问题都是由计算机安排的,编程者则不必过问。 主要知识点:顺序程序;分支程序;循环程序; 查表程序;子程序;运算程序 ;
6
基本语法规则3
对于直接地址direct,有多种选择: (1)直接数据地址(各种进制),如MOV A、30H等; (2)标号地址,如MOV A,SUM等, SUM应该在程序中 某处加以定义; (3)带有加减的表达式,设SUM为已定义的标号地址, 如MOV A,SUM十13; (4)特殊功能寄存器名,如MOV A,P2等。
24
程序框架
1. ORG 0000H 2. LJMP MAIN
;跳转至主程序
中断入口地址
3. ORG 0003H 4. LJMP INT0_INT ;跳转至外部中断0的中断服务程序
《单片机原理及应用》教学课件 第7章-单片机C语言编程基础知识
7.1.2 C51 数据类型
3. sfr16
sfr16也是一种扩充数据类型,它定义的变量占用两个 内存单元。sfr16和sfr一样用于操作特殊功能存放器,不同 的是,sfr16定义的变量可访问16位特殊功能存放器,sfr16 类型变量的取值范围为0~65535。
该数据类型的定义格式如下: sfr16 变量名=变量地址; 此处的变量地址为16位地址中的低8位地址。通过sfr16 类型变量访问16位特殊功能存放器时,先读低字节数据,后 读高字节数据;对特殊功能存放器写入数据时,先写入高字 节地址,再写入低字节地址。
要在数字后面加上字母L,如104L,034L,7850L等。
〔2〕浮点型常量
浮点型常量可分为十进制和指数两种表示形式。
① 十进制浮点型常量由数字和小数点组成,整数或小数局部为0时可以省略,
但必须要保存小数点,如,,,.25,300.等。
② 指数浮点型常量表示形式为:[±]数字[.数字]e[±]数字。[]中的内容为可选
C语言程序本身不依赖于硬件开发平台,程序不做修改或做少量修改就可以移植到 不同的单片机中。目前,使用C语言进行程序设计已经成为单片机软件开发的主流。
基于单片机的C语言又称为C51语 言。和标准C语言所不同的是,C51语 言运行于单片机平台上,并根据单片 机的硬件特点扩展了局部关键字。以 下关于C语言的描述都是基于单片机的, 后面不再强调这一点。
项,如125e3,7e9,−3.0e−3等。
15
7.1.3 常量与变量
〔3〕字符型常量 将单个字符放在单引号内的常量就是字符型常量,如'a''d'等。有一类字符型常量专 门用来表示控制字符,如回车符、换行符等,它们被称为转义字符,其表示方式为在字 符前面加上一个反斜杠“\〞,如'\n'。常用转义字符如表7-3所示。
第7讲51单片机汇编语言程序设计.
第7讲51单片机汇编语言程序设计.标题:第四部分汇编语言程序设计教学目标与要求:1、理解源程序、目标代码、编辑、汇编等含义2、了解汇编过程3、掌握伪指令的使用4、掌握顺序结构、分支结构及循环结构程序的编写方法授课时数:8学时教学重点:伪指令的使用教学内容及过程:一、程序设计概念1、汇编程序设计步骤:分析题意;资源分配;程序流程图编写程序调试程序2、程序编写规则:结构清晰,易读、易于移植占用存储空间少;运行时间短;程序的编制、调试及排错所需时间短;3、汇编程序功能汇编指令与机器码指令有一一对应的关系。
汇编程序是一种翻译程序,将源程序翻译成目标程序。
4、汇编程序的汇编过程汇编有两种方法:手工汇编、机器汇编。
1、手工汇编:第一次汇编:确定地址,翻译成各条机器码,字符标号原样写出;第二次汇编:标号代真,将字符标号用所计算出的具体地址值或偏移量代换。
源程序地址目标程序第一次汇编第二次汇编ORG 1000HSTART: MOV R0,BUFFER-1 1000 A82F A82F MOV R2,#00H 1002 7A00 7A00MOV A,@R0 1004 E6 E6MOV R3,A 1005 FB FBINC R3 1006 0B 0BSJMP NEXT 1007 80NEXT 8005 LOOP; INC R0 1009 08 08 CJNE @R0,#44H,NEXT 100A B644NEXT B64401INC R2 100D 0A 0A NEXT: DJNZ R3,LOOP 100E DBLOOP DBF9 MOV RESULT,R2 1010 8A2A 8A2ASJMP $ 1012 80FE 80FE BUFFER DATA 30HRESULT DATA 2AHEND2、机器汇编两次扫描过程。
第一次扫描:检查语法错误,确定符号名字;建立使用的全部符号名字表;每一符号名字后跟一对应值(地址或数)。
51单片机汇编程序
51单片机汇编程序1. 简介51单片机是一种常用的8位单片机芯片,具有广泛的应用领域。
51单片机的编程语言主要有汇编语言、C语言和底层汇编语言。
本文主要介绍51单片机的汇编程序。
2. 汇编程序基础2.1 寄存器51单片机的CPU有4个8位寄存器(A、B、DPTR、PSW)和一个16位寄存器(PC)。
在汇编程序中,我们可以使用这些寄存器来进行各种操作。
•A寄存器(累加器):用于存储数据和进行算术运算。
•B寄存器:辅助寄存器,可用于存储数据和进行算术运算。
•DPTR寄存器:数据指针寄存器,用于存储数据存取的地址。
•PSW寄存器:程序状态字寄存器,用于存储程序运行状态信息。
•PC寄存器:程序计数器,用于存储当前执行指令的地址。
2.2 指令集51单片机的指令集包含了多种汇编指令,可以用来进行数据操作、算术运算、逻辑运算、控制流程等。
常用的汇编指令有:•MOV:数据传送指令。
•ADD、SUB:加法和减法运算指令。
•ANL、ORL、XRL:逻辑运算指令。
•MOVX:外部RAM的读写指令。
•CJNE、DJNZ:条件分支指令。
•LCALL、RET:函数调用和返回指令。
2.3 编写一个简单的汇编程序下面是一个简单的汇编程序示例,用于将A寄存器中的数据加1,并将结果存储到B寄存器中。
ORG 0x0000 ; 程序的起始地址MOV A, #0x01 ; 将A寄存器赋值为1ADD A, #0x01 ; 将A寄存器加1MOV B, A ; 将A寄存器的值传送到B寄存器END ; 程序结束在上面的示例中,ORG指令用于指定程序的起始地址,MOV 指令用于将A寄存器赋值为1,ADD指令用于将A寄存器加1,MOV指令用于将A寄存器的值传送到B寄存器,END指令用于标记程序结束。
3. 汇编语言的应用51单片机的汇编语言广泛应用于各种嵌入式系统中,包括智能家居、工业自动化、仪器仪表等领域。
汇编程序具有以下特点:•程序执行效率高:由于汇编语言直接操作硬件,可以精确控制程序的执行流程,提高程序的执行效率。
MCS51系列单片机指令系统及汇编语言程序设计课件
第7页,共52页。
6. 相对寻址
以当前程序计数器PC的内容为基址,加上指令给出的一 字节补码数形成新的PC值的寻址方式。PC中的当前值称为 基地址,一字节补码数称为偏移量,新的PC值称为转移目 的地址。
例如:JC 80H ;C=1跳转
INC Rn
INC DPTR
第16页,共52页。
减1指令(4条)
DEC A DEC dir DEC @Ri
DEC Rn
十进制调整指令(1条)
DA A ;把A中按二进制相加后的结果调整成按BCD数相加的结果
第17页,共52页。
3.逻辑操作类指令(共24条)
逻辑操作类指令共有24条,主要包括“与”、“或”、“异或”、求反、清0、左右 移位等逻辑操作。
中(1050H)=64H。
堆栈操作类指令(2条)
PUSH dir POP dir
例:SP=07H,(35H)=55H,指令PUSH 35H执行后,55H送入08H地址单元,SP= 08H。
第13页,共52页。
交换指令(5条)
XCH A,Rn
XCH A,@Ri
XCH A,dir XCHD A,@Ri SWAP A 例:A=80H,R0=32H,(32H)=FFH,指令XCHD A,@R0执行后,
寄存器间接寻址的存储器空间包括:内部数据RAM和外部数据RAM。
内部数据RAM共用128字节,用一个字节的R0或R1可寻址整个空间。
外部数据RAM最大可达64K字节,仅用R0或R1无法寻址整个空间。在MCS-51系列单片机指 令中,对外部数据RAM作间接寻址有两种方法:第一种由P2口提供高8位外部数据RAM地址,由 R0或R1提供低8位地址,由此共同寻址64K空间;第二种是用16位的DPTR作寄存器间接寻址。
单片机课件 汇编语言程序设计PPT
4.1 概述
---- 程序头( 即定义变量和等值符号)---SCL BIT P1.2 ;定义SCL位变量 SDA BIT P1.3 ;定义SDA位变量 ByteCon DATA 30H ;定义字节变量
ByteCon ……
ORG nnnn ;CPU复位后,第一指令机器码存 放单元地址,具体值由CPU类型决定。
单片机课件 汇编语言程序设计PPT
4.1 概述
一、汇编语言伪指令 伪指令
汇编程序某些指令在汇编时并不产生目标代码,不 影响程序的执行,不是CPU能执行的指令,只提供一 些汇编控制信息的指令。 常用的伪指令: (1)设置起始地址ORG
格式: ORG nn 1、ORG:表明为后续源程序经汇编后的目标程序安 排存放位置,nn则给出了存放的起始地址值;
可以使人们抓住程序的基本线索,对全局有完整的了解。
4.1 概述
好处: (1)容易发现设计思想上的错误和矛盾,便于找出解 决问题的途径。 (2)便于把较大的程序分成若干个模块,从而分头进 行设计,最后合在一起联调。 5、按所使用计算机的指令系统,依据框图写出汇编语言 程序。 编程的三个原则:尽可能的节省数据存储单元;缩 短程序长度;减少执行时间。
8000H 8096H
4.1 概述
(5)赋值(等值)EQU 格式: 标号 EQU 项或表达式 功能:将语句操作数的值赋于本语句的标号,用EQU 赋过值的标号名可以用作数据地址、代码地址、位地址 或是一个立即数,它可以是8位、也可以是16位。 注意: 1、在同一程序中,用EQU伪指令对标号赋值后,该 标号的值在整个程序中不能再改变;
须是事先未定义过的。
4.1 概述
例4.6 A1 BIT P1.0 A2 BIT 02H
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
标题:第四部分汇编语言程序设计教学目标与要求:1、理解源程序、目标代码、编辑、汇编等含义2、了解汇编过程3、掌握伪指令的使用4、掌握顺序结构、分支结构及循环结构程序的编写方法授课时数: 8学时教学重点:伪指令的使用教学内容及过程:一、程序设计概念1、汇编程序设计步骤:分析题意;资源分配;程序流程图编写程序调试程序2、程序编写规则:结构清晰,易读、易于移植占用存储空间少;运行时间短;程序的编制、调试及排错所需时间短;3、汇编程序功能汇编指令与机器码指令有一一对应的关系。
汇编程序是一种翻译程序,将源程序翻译成目标程序。
4、汇编程序的汇编过程汇编有两种方法:手工汇编、机器汇编。
1、手工汇编:第一次汇编:确定地址,翻译成各条机器码,字符标号原样写出;第二次汇编:标号代真,将字符标号用所计算出的具体地址值或偏移量代换。
源程序地址目标程序第一次汇编第二次汇编ORG 1000HSTART: MOV R0,BUFFER-1 1000 A82F A82F MOV R2,#00H 1002 7A00 7A00MOV A,@R0 1004 E6 E6MOV R3,A 1005 FB FBINC R3 1006 0B 0BSJMP NEXT 1007 80NEXT 8005 LOOP; INC R0 1009 08 08 CJNE @R0,#44H,NEXT 100A B644NEXT B64401INC R2 100D 0A 0A NEXT: DJNZ R3,LOOP 100E DBLOOP DBF9 MOV RESULT,R2 1010 8A2A 8A2ASJMP $ 1012 80FE 80FE BUFFER DATA 30HRESULT DATA 2AHEND2、机器汇编两次扫描过程。
第一次扫描:检查语法错误,确定符号名字;建立使用的全部符号名字表;每一符号名字后跟一对应值(地址或数)。
第二次扫描:是在第一次扫描基础上,将符号地址转换成真地址(代真);利用操作码表将助记符转换成相应的目标码。
二、伪指令伪指令是告诉汇编程序,如何汇编源程序的指令。
伪指令既不控制机器的操作,也不能被汇编成机器代码,故称为伪指令。
1、起始地址伪指令ORGORG addr16用于规定目标程序段或数据块的起始地址,设置在程序开始处。
2、汇编结束伪指令END告诉汇编程序,对源程序的汇编到此结束。
一个程序中只出现一次,在末尾。
3、赋值伪指令EQU告诉汇编程序,将汇编语句操作数的值赋予本语句的标号。
格式:标号名称EQU 数值或汇编符号“标号名称”在源程序中可以作数值使用,也可以作数据地址、位地址使用。
先定义后使用,放在程序开头。
4、定义字节伪指令DB告诉汇编程序从指定的地址单元开始,定义若干字节存储单元并赋初值。
格式:[标号:] DB 字节数据或字节数据表5、定义字伪指令DW从指定地址开始,定义若干个16个位数据,高八位存入低地址;低八位存入高地址。
例、ORG 1000HPIOI:DW 7654H,40H、12、‘AB’6、数据地址赋值伪指令DATA将表达式指定的数据地址赋予规定的字符名称格式:字符名称DATA 表达式注:该指令与EQU 指令相似,只是,可先使用后定义,放于程序开头、结尾均可。
7、定义空间伪指令DS从指定地址开始,保留由表达式指定的若干字节空间作为备用空间。
格式:[标号:] DS 表达式例2、ORG 1000HDS 0AHDB 71H,11H,11H ;从100BH开始存放71H、11H、11H。
注:DB、DW、DS 只能用于程序存储器;而不能用于数据存储器。
8、位地址赋值伪指令BIT将位地址赋予规定的字符名称。
格式:字符名称BIT 位地址例3、X1 BIT P12相当于X1 EQU 92H三、汇编程序的基本结构1、顺序程序举例例1、设在外RAM的60H单元存有1个字节代码,要求将其分解成两个4位字段,高4位存入原单元的低4位,其低4位存入61H单元的低4位,且要求这两个单元的高4位均为0,试编制完整程序。
解:字节分解:核心指令MODE: ANLORL 1000HMODE:MOV R0,#60H MOVX A,@R0MOV B,AANL A,#0F0HSWAP AMOVX @R0,AANL B,#0FHMOV A,BINC R0MOVX @R0,AEND2、分支结构与分支程序设计结构:根据不同的条件,进行相应的处理。
通常用条件转移指令形成简单分支结构。
如:判(A)= Z 或NZ ,转移判(CY)= 1 或0 ,转移判(bit)=1 或0 ,转移CJNE 比较不相等转移例3、设a存放在累加器A中,b存放在寄存器B中,要求按下式计算Y值,并将结果Y 存于累加器A 中,试编写程序。
解:本题关键是判a是正数,还是负数;由ACC7便知。
BR:MINUS: DONE: ORG 1000HJB ACC7,MINUS CLR CSUBB A,B SJMP DONE ADD A,BSJMP $END例4、设有两个16位无符号数NA,NB分别存放在8031单片机内部RAM的40H、41H 及50H、51H单元中,当NA > NB时,将内部RAM的42H单元清0;否则,将该单元置成全1,试编程。
解法I:因为无16位数的比较指令,所以,只能用8位数的比较指令。
(画出流程框图)CMP: CMP1:HIGHE: DONE: ORG 2000HMOV A,50HCJNE A,40H,CMP1MOV A,51HCJNE A,41H,CMP1 SJMP NHIGHEJC HIGHENHIGHE:MOV 42H,#0FFH SJMP DONEMOV 42H,#00HSJMP $END上述程序中多次用到SJMP语句,该语句为无条件转移语句。
无条件语句应尽量少用,这样可使程序结构紧凑而易读,易理解。
解法II:先假设NA > NB,再来判断是否NA ≤ NBCMP2: ORG 3000HMOV R0,#00HMOV A,50HCJNE A,40H,CMP3CMP3: NHIGHE: HIGHE: MOV A,51HCJNE A,41H,CMP3SJMP NHIGHEJC HIGHEMOV R0,#0FFH ;不大于标志MOV 42H,R0SJMP $END3、循环程序1)、循环次数是已知的程序例1、已知片外RAM的10H单元存放8位二进制数,要求将其转移成相应的ASCII码,并以高位在前,低位在后的顺序,依次存放到片外RAM以11H为首地址的连续单元中,试编程。
解:先将中间单元置成30H,然后判欲转换位是否为1,若是,则将中间单元内容加1;否则,中间单元内容保持不变。
通过左移指令实现由高到低的顺序进行转换。
ORG 1000HSTART: M OV R2,#08H ;循环计数初值(循环次数已知)MOV R0,#10H ;地址指针初值MOVX A,@R0 ;取数MOV B,A ;暂存B中LOOP: M OV A,#30H ;将中间单元(A)置成30HJNB B.7,NA ;判断转换的二进制位为0否?;若是转NAINC A ;1的ASCII码“31H”NA: I NC R0 ;修改地址指针MOVX @R0,A ;存放转换的结果MOV A,BRL A,B ;作好准备,判断下一位MOV B,A ;暂存DJNZ R2,LOOP ;判断转换结束否?未完继续SJMP $END2)循环次数未知的程序例2、设用户用键盘输入长度不超过100字节的字符串放在8031单片机外部RAM以20H 为首地址的连续单元,该字符串用回车符CR(‘CR’= 0DH)作为结束标志,要求统计此字符串的长度并存入内部RAM的1FH单元中。
解:从首单元开始取数,每取一数判断其是否为‘CR’,是则结束。
STADA SLANGCMCR2:CRLOP: ORG 1000HDATA 20HDATA 1FHMOV R0,#STADA-1 MOV B,#0FFHINC R0INC BMOVX A,@R0CJNE A,#0DH,CRLOP MOV SLANG,BSJMP $END3)、多重循环设计循环体中还包含着一个或多个循环结构,即双重或多重循环。
例3、设8031使用12MHz晶振,试设计延迟100ms的延时程序。
解:延时程序的延迟时间就是该程序的执行时间,通常采用MOV和DJNZ二指令。
T = 12 / fosc = 12 / (12×106)= 1us内循环延时:(1 + 2 × CTR)T = 500us(假设)则CTR = 250实际延时:[1 + 2 × 250] × 1us = 501us外循环延时:T +(501 + 2T)× CTS = 100ms = 100 000us所以,CTS = 198.8 取199实际延时:[1 + (501 + 2)×199] = 1000.98ms例4、设在8031内部RAM中存一无符号数的数组,其长度为100,起始地址是30H,要求将它们从大到小排序,排序后仍存放在原区域中,试编者按程。
这就是所畏的“冒泡法”。
实际上大多情况,用不到99次循环,排序就结束。
为了提高排序速度,程序中可设一交换标志位,如10H位,每次循环中:若有交换则SETB 10H若无交换则CLR 10H每次循环结束时,测10H位,判断排序是否结束。
BUBBLE:LOOP:BUEU: ORG 1000HMOV R0,#30HMOV B,#64HCLR 10HDEC BMOV A,@R0MOV 20H,AINC R0MOV 21H,@R0CJNE A,21H,BUEU;长度计数;暂存,为交换作准备;若(20H)≠(21H)转移;(20H)≥(21H)转移BUNEXT: JNC BUNEXTMOV A,@R0MOV @R0,20HDEC R0MOV @R0,AINC R0SETB 10HDJNZ B,LOOPJB 10H,BUBBLEEND;若(20H)< (21H)则交换;使R0退格指向小地址;恢复R0指向大地址;置交换标志;判断标志位为1否?若为1,则继续小结:1、汇编程序有哪三种基本结构?2、构成循环程序、分支程序,常用到哪些判断语句?3、迟时较短的时间一般采取哪种方法?这种方法有什么缺陷?思考题(作业):课后小记::。