MCS-51单片机汇编语言编程实例
3-1 MCS-51单片机汇编语言程序设计举例
二、 乘法运算程序
在计算机中, 常将乘法采用移位和加法来实现。 例8 将(R2R3)和(R6R7)中双字节无符号数相乘, 结果存入 R4R5R6R7。 此乘法可以采用部分积右移的方法来实现, 其程序框图 如图 4.6 所示, 程序如下: NMUL: MOV R4, #0 MOV R5, #0 CLR C MOV R0, #16 ; 初始化
MOV HEX, A
RET
ASCTAB: DB 30H, 31H, 32H, 33H, 34H DB 35H, 36H, 37H, 38H, 39H DB 41H, 42H, 43H, 44H, 45H
DB 46H
在这个程序中, 查表指令MOVC A, @A+PC到表格首地 址有两条指令, 占用 3 个字节地址空间, 故修改指针应加 3。
低位字节相加
MOV 20H, A MOV A, 21H ADDC A,R4 MOV 21H, A POP ACC POP PSW RET
结果送20H单元
高位字节相加
3 运算程序
一、 加、 减法程序
例 7 将40H开始存放的 10 个字节的数与 50H开始存放的
10 个字节的数相减(假设被减数大于减数)。
ADD A, R2 ; 表中一个额定值为2个字节 MOV 31H, A MOV DPTR, #TAB ; 表首址
MOVC A, @A+DPTR; 查表读取第一个字节 XCH A, 31H ; 第一个字节内容存入31H INC DPTR MOVC A, @A+DPTR; 查表读取第二个字节 MOV 32H, A ; 第二字节的内容存入32H TAB: DW 1230H, 1450H, ... DW 2230H, 2440H, ... DW 3120H, 3300H, ...
MCS51单片机指令系统
第一条指令为远查表指令,可以在64K的程序存储器空间寻 址。基地址寄存器为DPTR,其意思为,DPTR里面存放的是 程序存储器中数据表格的首地址,A为数据地址的偏移量。
这条指令执行以后,以 (A)+(DPTR)的数值为地址数 据就送进A里面来了,也就是从表格首地址开始以后的第(A) 个数据被送进A了。(举例子说明)
编写好的程序都放在程序存储器中,由于一个存储地址所 指示的存储单元只能存放一字节的数据。所以,在存放指令时, 必须将指令拆分成一个一个字节进行连续存放。
比如: 实现“累加器加10H”这条指令,其机器语言为 0111010000010000, 占用了两个字节,就必须拆成两个字节 进行连续存储。
但是,用二进制来表示比较麻烦,因此,也常用十六进制来 表示如:74H 10H来表示以上这条机器语言。可见,用十六进 制表示指令比较简单,但是,指令系统有上百条指令,不易记 住。所以,一般采用容易记住的一些缩写符号来表示机器语言,
2. 在指令中直接给出操作数的地址, 这种寻址方式就属
于直接寻址方式。在这种方式中, 指令的操作数部分直接 是操作数的地址。
比如:MOV A,30H;将30H里面的数送到A里面 MOV 21H,30H;将30H里面的数存放到21H里面 在MCS -51 单片机指令系统中, 直接寻址方式中可
以访问 3 种存储器空间: (1) 内部数据存储器的低 128 个字节单元(00H~
7. 位寻址 指按照位进行的寻址操作,(前面讲的都是按字节进
行的寻址操作)。该种寻址方式中, 操作数是内部RAM单元 中20H到2FH的128个位地址以及SFR中的11个可进行 位寻址的寄存器中的位地址寻址。
比如:MOV C,20H;就是将RAM中位寻址区中20H位地 址中的内容送给C。区别与MOV A,20H;这个是将内部 RAM中20H单元的内容送给A。
第三章MCS51单片机的指令系统和汇编语言程序示例(第5范文
第三章MCS51单片机的指令系统和汇编语言程序示例(第5、6、7节)1.试分析单片机执行下列指令后累加器A和PSW中各标志位的变化状况?(1)MOV A,#19HADD A,#66H(2)MOV A,#5AHADD A,#6BH2.已知:A=85H,R0=30H,(30H)=11H, (31H)=0FFH,C=1,试计算单片机执行下列指令后累加器A和C中的值各是多少?(1)ADDC A,R0, (2)ADDC A,31H(3) ADDC A,@R0, (4) ADDC A,#85H3.已知M1和M2中分别存放两个16位无符号数的低8位,M1+1和M2+1中分别存放两个16位无符号数的高8位,计算两数之和(低8位存放在M1,高8位存放在M1+1,设两数之和不超过16位)。
4.试分析单片机执行下列指令后累加器A和PSW中各标志位的变化状况?CLR CMOV A,#52HSUBB A,#0B4H5.已知:A=0DFH,R1=40H,R7=19H,(30H)=00H,(40H)=0FFH,试分析单片机执行下列指令后累加器A和PSW中各标志位的变化状况?(1) DEC A (2) DEC R7 (3) DEC 30H (4) DEC @R16.试写出能完成85+59的BCD加法程序,并对工作过程进行分析。
7.已知:两个8位无符号乘数分别放在30H和31H单元中,编程实现他们乘积的低8位存放在32H,高8位存放在33H。
8.已知:R0=30H,(30H)=0AAH,试分析执行下列指令后累加器A和30H单元的内容是什么?(1)MOV A, #0FFH ANL A, R0(2)MOV A, #0FH ANL A, 30H(3)MOV A, #0F0H ANL A, @R0(4)MOV A, #80H ANL 30H, A9.设:A=0AAH和P1=0FFH,试编程把累加器A的低四位送入P1口的低四位,P1口的高四位保持不变。
第三章MCS51系列单片机指令系统及汇编语言程序设计
SJMP rel ;PC+ 2 + rel→PC 短转移指令为一页地址范围内的相对转移指令。因为rel为1字节补码 偏移量,且SJMP rel指令为2字节指令,所以转移范围为-126D~+ 129D 【4】间接转移指令
表3.4 程序存储器空间中的32个基本2K地址范围
0000H~07FFH 0800H~0FFFH 1000H~17FFH 1800H~1FFFH 2000H~27FFH 2800H~2FFFH 3000H~37FFH 3800H~3FFFH 4000H~47FFH 4800H~4FFFH 5000H~57FFH
3. 寄存器寻址
以通用寄存器的内容为操作数的寻址方式。通用寄存 器包括:A,B,DPTR,R0~R7。其中,R0~R7必须在 工作寄存器组之中。
例如:INC R0 ;(R0)+1→R0
需要注意的是,A和B既是通用寄存器,又是具有直 接地址的特殊功能寄存器。
4. 寄存器间接寻址
以寄存器中的内容为地址,该地址中的内容为操作数的寻址方式。能够 用于寄存器间接寻址的寄存器有:R0,R1,DPTR,SP。其中,R0,R1必 须在工作寄存器组之中,SP仅用于堆栈操作。
MCS-51单片机共有111条指令,按功能分类, MCS-51指令系统可分为5大类:
➢ 数据传送类指令(共29条) ➢ 算术操作类指令(共24条) ➢ 逻辑操作类指令(共24条) ➢ 控制转移类指令(共17条) ➢ 布尔变量操作类指令(共17条)
1.数据传送类指令(共29条)
以累加器A为目的操作数类指令(4条)
第三章 MCS-51单片机的汇编语言程序设计(8学时)
是循环程序的主体。
(3) 循环控制部分: 这部分的作用是修改循环变量和控制变
量, 并判断循环是否结束, 直到符合结束条件时, 跳出循环为止。
(4) 结束部分: 这部分主要是对循环程序的结果进行分析、 处理和存放。
12 8
12
图 4.4
9
1.已知循环次数的循环程序设计
例 5 工作单元清零。
MOV R2, #50 ; 置循环次数 CLEAR: CLR A CLEAR1: MOVX @DPTR, A MOV DPTR,#8000H INC DPTR ; 修改指针
#50+1 MOV R2,#50
CLR2: DJNZ R2,CLR1 DJNZ R2, CLEAR1; 控制循环 RET RET CLR1: MOVX @DPTR,A INC DPTR
12
图 4.1 分支结构框图 (a) 单分支流程; (b) 多分支流程
4
例 4 比较两个无符号数的大小。
设外部 RAM 的存储单元 ST1和 ST2中存放两个不带符 号的二进制数, 找出其中的大数存入外部 RAM 中的 ST3单 元中。
图 3.3
12
5
程序如下: ORG ST1 ST2 ST3 EQU EQU EQU 1000H 2000H 2100H 2200H ; 清零Cy
12
18
图 4.5
12
19
ORG 0000H
START: MOV DPTR, #BLOCK; 置地址指针
MOV P2, DPH
MOV R7, #LEN DEC R7
; P2作地址指针高字节
; 置外循环计数初值 ; 比较与交换 n-1次
LOOP0: CLR F0 ; 交换标志清 0 MOV R0, DPL; MOV R1, DPL ; 置相邻两数地址指针低字节
51单片机总汇编语言及C语言经典实例
51单片机汇编语言及C语言经典实例实验及课程设计一、闪烁灯如图1 所示为一简单单片机系统原理图:在P1.0 端口上接一个发光二极管L1,使L1 在不停地一亮一灭,一亮一灭的时间间隔为0.2 秒。
延时程序的设计方法,作为单片机的指令的执行的时间是很短,数量大微秒级,因此,我们要求的闪烁时间间隔为0.2 秒,相对于微秒来说,相差太大,所以我们在执行某一指令时,插入延时程序,来达到我们的要求,但这样的延时程序是如何设计呢?下面具体介绍其原理:如图4.1.1 所示的石英晶体为12MHz,因此,1 个机器周期为 1 微秒,机器周期微秒如图 1 所示,当P1.0 端口输出高电平,即P1.0=1 时,根据发光二极管的单向导电性可知,这时发光二极管L1 熄灭;当P1.0 端口输出低电平,即P1.0=0 时,发光二极管L1 亮;我们可以使用SETB P1.0 指令使P1.0端口输出高电平,使用CLR P1.0 指令使P1.0 端口输出低电平。
C 语言源程序#include <AT89X51.H>sbit L1=P1^0;void delay02s(void) //延时0.2 秒子程序{unsigned char i,j,k;for(i=20;i>0;i--)for(j=20;j>0;j--)for(k=248;k>0;k--);}void main(void){while(1){L1=0;delay02s();L1=1;delay02s();}汇编源程序ORG 0START: CLR P1.0LCALL DELAYSETB P1.0LCALL DELAYLJMP START DELAY: MOV R5,#20 ;延时子程序,延时0.2 秒D1: MOV R6,#20D2: MOV R7,#248DJNZ R7,$DJNZ R6,D2DJNZ R5,D1RETEND图2 程序设计流程图图1 单片机原理图二、多路开关状态指示如图 3 所示,AT89S51 单片机的 P1.0-P1.3 接四个发光二极管 L1-L4,P1.4-P1.7 接了四个开关 K1-K4,编程将开关的状态反映到发光二极管上。
MCS-51单片机的汇编语言
绝对地址段选择伪指令
CSEG
[AT
address]
DSEG
[AT
address]
ISEG
[AT
address]
BSEG
[AT
address]
XSEG
[AT
address]
分别为程序存储器、内部数据存储器、间接寻址的内部数据存 储器、位寻址区和外部数据存储器的使用指定绝对地址
1.5 通用的转移和调用语句
MCS-51汇编器允许程序员使用通用的转移和调用助记符JMP 与CALL
用来代替SJMP、AJMP、LJMP和ACALL、LCALL
汇编产生的未必是最优化的结果
1.6 条件汇编
将一个软件的多个版本保存在同一组源程序文件中 使用IF、ELSEIF、ELSE、ENDIF IF或ELSEIF后的表达式通常为关系表达式 当IF或ELSEIF后的数值表达式的值非零时,汇编其后的语句组;
1.4 伪指令语句
ORG伪指令
ORG
பைடு நூலகம்
expression
设置汇编计数器的值,指定其后语句的起始地址
伪指令语句
END伪指令
应当是源程序的最后一条语句 通知汇编程序汇编过程应在此结束 汇编器不理会END后面的文件内容
每个程序文件都应以END结束
伪指令语句
EQU和SET伪指令
symbol
单片机原理与应用
MCS-51单片机的汇编语言
INTS SET
IF ELSE ENDIF
INTS = 1 MAIN_START
MAIN_START
NUM1 DATA NUM2 DATA
DSEG AT
STACK: DS
20H
51单片机汇编语言及C语言经典实例
51单片机汇编语言及C语言经典实例汇编语言是一种用来编写计算机指令的低级语言,它与机器语言十分接近,可以直接控制计算机硬件。
而C语言是一种高级程序设计语言,它具有结构化编程和模块化设计的特点。
本文将介绍51单片机汇编语言和C语言的经典实例,并进行详细解析。
一、LED指示灯的闪烁我们首先来看一个经典的51单片机汇编语言的实例——LED指示灯的闪烁。
我们可以通过控制单片机的IO口来实现LED的闪烁效果。
以下是汇编语言的代码:```assemblyORG 0 ; 程序起始地址MOV P1, #0; 将 P1 置为0,熄灭LEDLJMP $ ; 无限循环```以上代码使用了51单片机的MOV指令和LJMP指令。
MOV指令用来将一个立即数(这里是0)存储到寄存器P1中,控制对应的I/O口输出低电平,从而熄灭LED。
而LJMP指令则是无条件跳转指令,将程序跳转到当前地址处,实现了无限循环的效果。
对应的C语言代码如下:```c#include <reg51.h>void main() {P1 = 0; // 将 P1 置为0,熄灭LEDwhile(1); // 无限循环}```以上代码使用了reg51.h头文件,该头文件提供了对51单片机内部寄存器和外设的访问。
通过将P1赋值为0,控制IO口输出低电平,实现了熄灭LED的效果。
while(1)是一个无限循环,使得程序一直停留在这个循环中。
二、数码管的动态显示接下来我们介绍51单片机汇编语言和C语言实现数码管动态显示的经典实例。
数码管动态显示是通过控制多个IO口的高低电平来控制数码管显示不同的数字。
以下是汇编语言的代码:```assemblyORG 0 ; 程序起始地址MOV A, #0FH ; 设置数码管全亮,A存储数码管控制位MOV P2, A ; 将 A 的值存储到 P2,控制数码管的数码控制位DELAY: ; 延时循环MOV R7, #0FFH ; 设置延时计数值LOOP1: ; 内层循环MOV R6, #0FFH ; 设置延时计数值LOOP2: ; 内部延时循环DJNZ R6, LOOP2 ; 延时计数减1并判断是否为0,不为0则继续循环DJNZ R7, LOOP1 ; 延时计数减1并判断是否为0,不为0则继续循环DJNZ A, DELAY ; A减1并判断是否为0,不为0则继续循环JMP DELAY ; 无限循环,实现动态显示```以上代码中,我们通过MOV指令来将一个立即数(0x0F)存储到寄存器A中,控制数码管显示0-9的数字。
第4章 MCS-51单片机汇编语言程序设计(2)
XCH A,R3 INC A MOVC A,@A+DPTR MOV DPL,A MOV DPH,R3 CLR A JMP @A+DPTR TAB DW DW A0 A1
…………. DW AN
INC
DPTR
MOVX A,@DPTR SUBB A,R7 JNC XCH BIG1 A,R7
BIG0:INC DPTR
实现程序如下: 实现程序如下
START:CLR C : MOV DPTR,#ST1 , MOVX A,@DPTR , MOV R7,A
MOVX @DPTR,A RET BIG1:MOVX A,@DPTR SJMP BIG0
实现程序如下: 实现程序如下 MOV 30H, 20H ANL 30H,#00011111B MOV A,21H SWAP A RL A ANL A,#11100000B ORL 30H,A
第4章 MCS-51单片机汇编语言程序设计
实现程序如下: 实现程序如下 例 A,@R1 ADDC4.3 做3个字节的 无符号的加法. 无符号的加法.设一个加 MOV R0,#52H , MOV @R0,A 数存放在内部RAM 50H、 RAM的 数存放在内部RAM的50H、 MOV R1,#55H , DEC R0 51H、52H单元中 单元中, 51H、52H单元中,另一 DEC R1 RAM的53H、 MOV A,@R0 个加数存放在RAM 个加数存放在RAM的53H、 MOV A,@R0 54H、55H单元中 单元中, 54H、55H单元中,相加 ADD A,@R1 结果存内部RAM的50H、 结果存内部RAM的50H、 RAM ADDC A,@R1 51H、52H单元 单元, 51H、52H单元,均从高 MOV @R0,A 字节开始存放, 字节开始存放,进位存放 MOV 00H,C 在位寻址区的00H位中。 00H位中 在位寻址区的00H位中。 MOV @R0,A DEC DEC R0 R1
MCS51单片机指令系统与汇编语言程序设计
MCS51单片机指令系统与汇编语言程序设计MCS-51是一种非常常见的8位单片机系列,该系列包括了多种型号的单片机,如Intel 8051、8031、8052等。
MCS-51单片机指令系统是一组用于驱动该系列单片机的指令集,汇编语言程序设计是利用这些指令来编写程序。
MCS-51单片机指令系统包含了多种指令,可以执行诸如数据传输、算术逻辑运算、控制和数据访问等功能。
这些指令通过各种不同的寻址模式来操作数据,包括立即寻址、寄存器寻址、直接寻址、间接寻址和寄存器间接寻址等。
不同的寻址模式和指令组合可以实现不同的功能。
汇编语言程序设计通过将人类可读的汇编指令翻译成机器可执行的二进制指令来编写程序。
在MCS-51单片机中,汇编指令由操作码和操作数组成。
操作码指定了所执行的操作,如数据传输、算术运算或控制指令。
操作数则指定了指令要操作的数据。
下面以一个简单的例子来说明MCS-51单片机指令系统和汇编语言程序设计的基本原理。
假设我们要编写一个程序,将两个寄存器中的数据相加,并将结果存储到第三个寄存器中。
首先,我们需要将第一个寄存器的值加载到累加器A中,这可以通过MOV指令实现。
MOV指令的操作码为01,操作数为两个寄存器的地址。
例如,MOVA,R0将R0的值加载到A中。
接下来,我们需要将第二个寄存器的值加载到B寄存器中,同样可以使用MOV指令。
MOVB,R1将R1的值加载到B中。
然后,我们可以使用ADD指令将A和B中的值相加,并将结果存储到A中。
ADD指令的操作码为04,操作数为A的地址。
例如,ADDA将累加器中的值与A寄存器中的值相加,并将结果存储到A中。
最后,我们可以使用MOV指令将A中的结果移动到第三个寄存器中,例如,MOVR2,A将A的值移动到R2中。
通过组合使用这些指令,我们可以实现将两个寄存器中的值相加并存储到第三个寄存器中的功能。
总结来说,MCS-51单片机指令系统和汇编语言程序设计是一种用于编程控制该系列单片机的方式。
51单片机汇编程序范例
51单片机汇编程序范例(总14页)本页仅作为文档封面,使用时可以删除This document is for reference only-rar21year.March16位二进制数转换成BCD码的的快速算法-51单片机2010-02-18 00:43在做而论道上篇博文中,回答了一个16位二进制数转换成BCD码的问题,给出了一个网上广泛流传的经典转换程序。
程序可见:中的HEX2BCD子程序。
.说它经典,不仅是因为它已经流传已久,重要的是它的编程思路十分清晰,十分易于延伸推广。
做而论道曾经利用它的思路,很容易的编写出了48位二进制数变换成16位BCD码的程序。
但是这个程序有个明显的缺点,就是执行时间太长,转换16位二进制数,就必须循环16遍,转换48位二进制数,就必须循环48遍。
上述的HEX2BCD子程序,虽然长度仅仅为26字节,执行时间却要用331个机器周期。
.单片机系统多半是用于各种类型的控制场合,很多时候都是需要“争分夺秒”的,在低功耗系统设计中,也必须考虑因为运算时间长而增加系统耗电量的问题。
为了提高整机运行的速度,在多年前,做而论道就另外编写了一个转换程序,程序的长度为81字节,执行时间是81个机器周期,(这两个数字怎么这么巧!)执行时间仅仅是经典程序的1/4!.近来,在网上发现了一个链接:,也对这个经典转换程序进行了改进,话是说了不少,只是没有实质性的东西。
这篇文章提到的程序,一直也没有找到,也难辩真假。
这篇文章好像是选自某个著名杂志,但是在术语的使用上,有着明显的漏洞,不像是专业人员的手笔。
比如说文中提到的:“使用51条指令代码,但执行这段程序却要耗费312个指令周期”,就是败笔。
51条指令代码,真不知道说的是什么,指令周期是因各种机型和指令而异的,也不能表示确切的时间。
.下面说说做而论道的编程思路。
;-----------------------------------------------------------------------;已知16位二进制整数n以b15~b0表示,取值范围为0~65535。
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的中断服务程序
--【计算机】3 MCS-51单片机指令系统和汇编语言程序示例
第3章 MCS-51单片机指令系统和汇编语言程序示例
3.1 MCS-51单片机指令系统概述
3.1.1 指令、指令系统的概念
指令是使计算机内部执行的一种操作,提供给用户编程使用 的一种命令。由构成计算机的电子器件特性所决定,计算机只能 识别二进制代码。以二进制代码来描述指令功能的语言,称之为 机器语言。由于机器语言不便被人们识别、记忆、理解和使用, 因此给每条机器语言指令赋予助记符号来表示,这就形成了汇编 语言。也就是说,汇编语言是便于人们识别、记忆、理解和使用 的一种指令形式,它和机器语言指令一一对应,也是由计算机的 硬件特性所决定的。
第3章 MCS-51单片机指令系统和汇编语言程序示例
(2) 偏移量rel是有符号的单字节数。以补码表示,其值的 范围是-128~+127(00H~FFH),负数表示从当前地址向前转移, 正数表示从当前地址向后转移。所以,相对转移指令满足条件 后,转移的地址(目的地址)为:
目的地址=当前PC值+rel = 指令存储地址+指令字节数+rel
第3章 MCS-51单片机指令系统和汇编语言程序示例
计算机能够执行的全部操作所对应的指令集合,称为这种 计算机的指令系统。从指令是反应计算机内部的一种操作来看, 指令系统全面展示出了计算机的操作功能,也就是它的工作原 理;从用户使用的角度来看,指令系统是提供给用户使用计算 机功能的软件资源。要让计算机处理问题,首先要编写程序。 编写程序实际上是从指令系统中挑选一个指令子集的过程。因 此,学习指令系统既要从编程使用的角度掌握指令的使用格式 及每条指令的功能;又要掌握每条指令在计算机内部的微观操 作过程,即工作原理,从而进一步加深对硬件组成原理的理解。
例如:MOV A,#30H指令中30H就是立即数。这一条指令 的功能是执行将立即数30H传送到累加器A中的操作。该指令操作 码的机器代码为74H,占用一个字节存储单元,立即数30H存放在 紧跟在其后的一个字节存储单元,成为指令代码的一部分。整条 指令的机器码为74H 30H。
51单片机汇编语言程序
如果平方值为两个字节,程序应如何编。
由条件转移指令构成程序判断框部分, 形成分支结构
单分支程序 一个判断决策框,两种分支结 例1 求8位有符号数的绝 构图。 对值。 ORG 0000H 方法:正数不变,负数变 MOV A,R2 补 JNB ACC.7,N ; 为正数? CPL A ;负数 变补
3.5.1
影响条件
条件满足? N 处理段 Y
影响条件 条件满足? N 处理1 Y 处理2
出重量后算出行李运费价格,其秤出的重 量以10kg为1个计价单位G , G已存入40H单 开始 元。计价方法 为50kg以内按3元, 50kg以上 (40H) A (A=G) 3G R2 分段计价: 50kg按3元计价 Y A<=5? ,超过部分按2元计价。 G×3 ;当G≤5 M= N 由此列出算式: ; 当G>5 G×3 + (G-5)×2
ORG 0000H MOV DPTR,#TAB MOV A,20H MOVC A,@A+DPTR ;查表 MOV 21H,A SJMP $ TAB2: DB 00H,01H,04H,09H,16H,25H END
TAB TAB+1 TAB+2 TAB+3 TAB+4 TAB+5
DPTR A
数据 0 1 4 9 16H 25H
1. 利用转移地址表实现转移 例3-7 根据R3的内容转向对应的程序,R3 的内容为0~n,处理程序的入口符号地址分 别为PR0~PRn (n<128)。
分析:将PR0—PRn入口地址列在表格中, 每一项占两个单元,PRn在表中的偏移量 为2n,因此将R3的内容乘2即得PRn在表中 的偏移地址,从偏移地址2n和2n+1两个单 元分别取出PRn的高八位地址和低八位地
51单片机 汇编语言经典案例 (理工)
5、试编写统计数据区长度的程序,设数据区从内RAM 30H 开始,该数据区以0结束,统计结果送入2FH中。 ORG 0000H MOV R0,#00H MOV R1,#30H NEXT: MOV A,@R1 JZ OVER INC R0 INC R1 LJMP NEXT OVER: MOV 2FH,R0 SJMP $ END
2、试编写程序。找出外RAM 2000H~200FH数据区中的最 小值,并放入R2中。
• • • • • • • • • • • • • • • • • • • ORG 0000H MOV DPTR,#2000H MOVX A,@DPTR MOV R2,A MOV R1,#15 INC DPTR NEXT1: MOVX A,@DPTR MOV B,R2 SUBB A,B JNC LP DAYU0: MOVX A,@DPTR MOV R2,A LP: INC DPTR DJNZ R1,NEXT1 SJMP $ END
8、试编一程序,分别统计在内部RAM的30H~50H单元的数 据区中奇数和偶数的个数,并将奇数和偶数的个数分别存放 在51H和52H单元中。
MOV R1,#30H MOV R0,#20H MOV 51H,#0H MOV 52H,#0H START: MOV A,@R1 INC R1 ANL A,#01H JZ LOOP1 INC 51H SJMP LOOP2 LOOP1: INC 52H LOOP2: DJNZ R0 , START RET
3、编写程序,将外部RAM 2000H~20FFH数据块,传送到 3000H~30FFH区域。
ORG 0000H MOV R1,#0FFH MOV R2,#00H NEXT: MOV DPH,#20H MOV DPL,R2 MOVX A,@DPTR MOV DPH,#30H MOVX @DPTR,A INC R2 DJNZ R1,NEXT SJMP $
51单片机汇编语言及C语言经典实例
51单片机汇编语言及C语言经典实例实验及课程设计51单片机汇编语言及C语言经典实例D1: MOV R6,#20D2: MOV R7,#248一、闪烁灯DJNZ R7,$ 如图1 所示为一简单单片机系统原理图:在 P1.0 DJNZ R6,D2 端口上接一个发光二极管 L1,使 L1 在不停地一亮一灭,一亮一灭的时间间隔为 0.2 秒。
DJNZ R5,D1 延时程序的设计方法,作为单片机的指令的执行的时间是很短,数量大微秒级,因此,我们要求的闪烁时间间隔为 0.2 秒,相对于微秒来说,相差太大,所以我们在执行某一指令时,插入延时程序,来达到我们的要求,但这样的延时程序是如何设计呢,下面具体介绍其原理:如图 4.1.1 所示的石英晶体为12MHz,因此,1 个机器周期为 1 微秒,机器周期微秒如图 1 所示,当 P1.0 端口输出高电平,即 P1.0,1 时,根据发光二极管的单向导电性可知,这时发光二极管 L1 熄灭;当 P1.0 端口输出低电平,即 P1.0,0 时,发光二极管 L1 亮;我们可以使用 SETB P1.0 指令使 P1.0端口输出高电平,使用 CLR P1.0 指令使 P1.0 端口输出低电平。
C 语言源程序#include <AT89X51.H> sbit L1=P1^0;void delay02s(void) //延时 0.2 秒子程序 {RET unsigned char i,j,k;图1 单片机原理图 END for(i=20;i>0;i--)for(j=20;j>0;j--) for(k=248;k>0;k--); }void main(void){while(1){L1=0;delay02s();L1=1;delay02s();}汇编源程序ORG 0START: CLR P1.0LCALL DELAYSETB P1.0LCALL DELAY 图2 程序设计流程图LJMP STARTDELAY: MOV R5,#20 ;延时子程序,延时 0.2 秒CLR P1.0SJMP NEX1二、多路开关状态指示如图 3 所示,AT89S51 单片机的 P1.0,P1.3 接四个发光二极管 L1,L4,P1.4,P1.7 接了四个开关 K1,K4,编程将开关的状态反映到发光二极管上。
MCS-51单片机汇编语言编程实例
例3
步进电机
任务2:定时器中断实现演示程序
TIME: CJNE R2,#0,TIM0 ;R2不等于0则是慢速,跳转 ;;;;;;;快速,60转/分 MOV TH0,#5BH MOV TL0,#0F0H SETB TR0 MOV R1,#0H TIM1: CJNE R1,#1H,TIM1 SJMP TIM2 ;;;;;;;;慢速,10转/分 TIM0: MOV R3,#2H TIM4: MOV TH0,#0H MOV TL0,#0H SETB TR0 MOV R1,#0H
0000H 90H R1 , #100 R0 , #100 R0 , LOOP1 R1 , LOOP1 LOOP
例2 跑马灯
任务:D1,D2,D3循环亮灭, D1 →D2→D3 ↑ ↓ 一个时间只有一个亮, 每个1秒转换一次。
VCC
VCC
VCC
1
1
D1
D2
D3
2
2
R1
R2
R3 1 2 3 P1.0 P1.1 P1.2 89C51
例1
方波产生
任务:从P1.0引脚输出一个方波
VCC
D0
R1 1 P1.0 89C51
2
1
程序1:
LOOP:
ORG CPL SJMP
0000H 90H LOOP
机器码 0000 0001 0002 0003 0004
B2 90 80 FC --
程序2:加软延时 ORG LOOP: CPL MOV MOV LOOP1: DJNZ DJNZ SJMP
L1:
例3
任务:主程序
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
LOOP3:
; D2亮
LOOP4:
LOOP5:
; D3亮 ;延时
例3
步进电机
任务1:初始化步进电机
START: ;初始化 MOV DPTR,#30H;表基址 L5: MOV R7, #0H;百位 L9: MOV R6, #0H;十位 L10: MOV R5, #0H;个位 MOV IE,#82H ;全局中断,T0中断允许 ORL IP,#2H ;逻辑或,T0中断优先级高 MOV TMOD,#11H ;定时器方式字,T1和T0都工作在方式1,16位的计 数器GATE等于0,不受外部控制 P4 EQU 0C0H ;声明P4地址 MOV P4,#0FFH P4SW EQU 0BBH ;声明P4SW寄存器的地址 MOV P4SW,#70H SETB p1.1 SETB P1.4 ;CE2置高 SETB P1.3 ;CE1置高
例3
任务:主程序
步进电机
MOV A,R0 RLC A ;带进位的循环左移操作 MOV P3.2,C ;IN1 RLC A MOV P1.0,C ;IN2 MOV R0,A LCALL LED LCALL TIME MOV A,R0 RLC A MOV P3.2,C RLC A MOV P1.0,C MOV R0,A LCALL LED LCALL TIME
程序3
ORG LOOP: LOOP0: MOV MOV MOV RR CALL DJNZ SJMP 0000H A, #0FBH R0, #3 P1 , A A DT R0, LOOP0 LOOP
7行
程序4
LOOP0: LOOP1: LOOP2: ORG 0000H MOV R7 , #0 ORL P1 , #07H CJNE R7 , #0 , LOOP3 INC R7 ANL P1 , #0FBH SJMP LOOP5 CJNE R7 , #1 , LOOP4 INC R7 ANL P1 , #0FDH SJMP LOOP5 CJNE R7 , #02 , LOOP0 MOV R7 , #0 ANL P1 , #0FEH CALL DT SJMP LOOP1 ;全熄灭 ; D1亮
0000H 90H R1 , #100 R0 , #100 R0 , LOOP1 R1 , LOOP1 LOOP
例2 跑马灯
任务:D1,D2,D3循环亮灭, D1 →D2→D3 ↑ ↓ 一个时间只有一个亮, 每个1秒转换一次。
VCC
VCC
VCC
1
1
D1
D2
D3
2
2
R1
R2
R3 1 2 3 P1.0 P1.1 P1.2 89C51
例3
步进电机
任务4:开关设置
NEXT: JB P3.7,OPP ;如果P3.7等于1则转移(开关S2按下) MOV R0,#00101101B;按下,顺时针 LJMP S1 OPP: MOV R0,#01111000B;松开,逆时针 S1: JB P3.6,SPD MOV R2,#0H ;未按下,快速 LJMP L1 SPD: MOV R2,#1H ;按下,慢速
2
1
程序1: LOOP0: ORG 0000H ORL P1 , #07H ANL P1 , #0FBH CALL DT ORL ANL CALL P1 , #07H P1 , #0FDH DT ; 全熄灭 ; D1亮 ;延时 ;全熄灭 ; D2亮 ;延时 ;全熄灭 ; D3亮 ;延时
ORL P1 , #07H ANL P1 , #0FEH CALL DT SJMP LOOP0
L1:
例3
任务:主程序
步进电机
MOV A,R0 RLC A MOV P3.2,C RLC A MOV P1.0,C MOV R0,A LCALL LED LCALL TIME MOV A,R0 RLC A MOV P3.2,C RLC A MOV P1.0,C MOV R0,A LCALL LED LCALL TIME LJMP NEXT
例3
步进电机
任务3:定时器中断实现延时程序
TIM3: CJNE R1,#1H,TIM3 DJNZ R3,TIM4 MOV TH0,#2FH MOV TL0,#70H SETB TR0 MOV R1,#0H TIM5: CJNE R1,#1H,TIM5 TIM2: RET T0IN:;中断程序 MOV R1,#1H RETI;中断返回
(256*256+256+1)R2+(256+1)R1+R0-(256*256+2*256-2)=1000000 65793R2+257R1+R0=1066046 R2=15, R1=50, R0=255
程序2
ORG LOOP: MOV MOV RR CALL MOV RR CALL MOV CALL SJMP 0000H A, #0FBH P1 , A A DT P1 , A A DT P1 , A DT LOOP
例3
步进电机
任务2:定时器中断实现演示程序
TIME: CJNE R2,#0,TIM0 ;R2不等于0则是慢速,跳转 ;;;;;;;快速,60转/分 MOV TH0,#5BH MOV TL0,#0F0H SETB TR0 MOV R1,#0H TIM1: CJNE R1,#1H,TIM1 SJMP TIM2 ;;;;;;;;慢速,10转/分 TIM0: MOV R3,#2H TIM4: MOV TH0,#0H MOV TL0,#0H SETB TR0 MOV R1,#0H
例1
方波产生
任务:从P1.0引脚输出一个方波
VCC
D0
R1 1 P1.0 89C51
2
1
程序1:
LOOP:
ORG CPL SJMP
0000H 90H LOOP
机器码 0000 0001 0002 0003 0004
B2 90 80 FC --
程序2:加软延时 ORG LOOP: CPL MOV MOV LOOP1: DJNZ DJNZ SJMP
DT:
DT1:
MOV MOV MOV DJNZ DJNZ DJNZ RET
R2 , #0FH R1 , #32H R0 , #0FFH R0 , DT1 R1 , DT1 R2 , DT1
;#15 ;#;#255
T= (2 * ( 256*256*(R2-1) + 256*(R1-1) + R0 +256*(R2-1) + R1 +R2) +3+1) * (12/fosc)