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的数字。
- 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)