【MCS-51单片机汇编语言】期末复习总结②——汇编程序设计(题型二)-LMLPHP

顺序结构

  • 程序默认以顺序结构执行

分支结构

  • CJNE进行分支;
    【MCS-51单片机汇编语言】期末复习总结②——汇编程序设计(题型二)-LMLPHP

【MCS-51单片机汇编语言】期末复习总结②——汇编程序设计(题型二)-LMLPHP

CJNE的使用规则

CJNE A, #data rel 
  • 若(A) = (data),则顺序执行
  • 若(A) > (data),则 0 -> (CY)并跳转(重要);
  • 若(A) < (data),则 1 -> (CY)并跳转(重要);

循环结构

包含部分

  • 循环初始化
  • 循环体
  • 循环控制
  • 循环结束

分类

  • 计数式循环控制(以循环次数作为循环是否执行的控制条件)

    • 适合先执行后判断的结构;
    • 适用已知循环次数的场合;
    • 多采用DJNZ指令;
  • 条件循环控制(用某个条件是否满足条件作为循环是否执行的控制条件)

    • 适用于先判断后执行的语句;
    • 适用于未知循环次数的场合;
    • 多采用CJNEJZ(判断A)与JCJNC(判断CY)指令;

常考题型

  • 本章常考题型为汇编语言程序设计

例题1

题目描述

  • 设变量X的值存放在内部RAM中的50单元中,函数值Y存放在内部RAM中的60H单元,请编写程序实现下列分段函数。

【MCS-51单片机汇编语言】期末复习总结②——汇编程序设计(题型二)-LMLPHP

题解

	ORG		0000H			;设置起始地址
	AJMP	MAIN			;跳转到MAIN开始执行
	ORG		0030H			;跳过一些终端地址
MAIN:						
	MOV	A,	50H				;取出X的值
	CJNE	A,	#12,	Jdg2;判断(A)是否等于12,不等于就跳转
BR1:
	MOV		60H,	#6		;令Y = 6
	SJMP	OUTG			;跳转到出口
Jdg2:
	JNC		BR3				;若(CY)=0,则说明X>12,则跳转到分支3
BR2:
	ADD		A,	#6			;X = X + 6
	MOV		60H,	A		;将结果给Y
	SJMP	OUTG			;分支结束,跳转到出口
BR3:
	ADD		A,	#2			;X = X + 2
	MOV		60H,	A		;将结果给Y
OUTG:
	SJMP	$				;在此处死循环
  • 一定要仔细阅读注释的内容!!!

其中,BR1代表 X = 12 的情况;BR2代表 X > 12 的情况;BR3代表 X < 12的情况;

例题2

题目描述

  • ①将片内RAM的50H~5FH地址的区间的内容初始化为(0 ~ 15),即(50H) = 0,(51H) = 1…,②然后将该区间(50H ~ 5FH)的内容复制到片内RAM的(30H ~ 3FH)单元。

题解

	ORG		0000H
	AJMP	MAIN
	ORG		0030H			
MAIN:
	MOV		R7,		#16	;设置循环次数
	MOV		R0,		#30h;存储地址的起始位置
	MOV		A,		#0	;存储数的最小值
LOOP1:
	MOV		@R0,	A	;A中存的值放入R0处
	INC		A			;A = A + 1
	INC		R0			;R0 = R0 + 1
	DJNZ	R7,		LOOP1;(R7) = (R7)-1,若R7!=0,则跳转到LOOP1
	
	MOV		R0,		#50H;复制的起始地址
	MOV		R1,		#30H;粘贴的起始地址
	MOV		R7,		#16	;设置循环次数
LOOP2:
	MOV		A,		@R0	;R0中存的值放入A
	MOV		@R1,	A	;A中存的值放入R1处
	INC		R0			;R0 = R0 + 1
	INC		R1			;R1 = R1 + 1
	DJNZ	R7,		LOOP2;(R7) = (R7)-1,若R7!=0,则跳转到LOOP2
OUTG:
	SJMP $

例题3

题目描述

  • 电路如图所示,已知单片机的晶振频率是12MHZ,请编程实现发光二极管LED亮0.1秒,灭0.1秒的闪烁现象,要求采用模块化技术设计

【MCS-51单片机汇编语言】期末复习总结②——汇编程序设计(题型二)-LMLPHP

题解

重要公式

  • T(机器周期) = 12 / ∫(晶振频率)

题目解析

  • 根据发光二极管的特性,P1.0若为高电平则二极管,P1.0若为低电平则二极管

  • 根据公式可得若晶振频率为12MHZ,则机器周期为1微秒

  • 题目要求使用模块化编程,也就是说要求使用子程序

代码

	ORG		0000H
	SJMP	MAIN
	ORG		0030H
MAIN:
	SETB	P1.0		;LED灭
LOOP:
	CLR		P1.0		;LED亮
	ACALL	DL100ms		;延时0.1s
	SETB	P1.0		;LED灭
	ACALL	DL100ms		;延时0.1s
	SJMP	LOOP		;循环控制LED的亮灭
DL100ms:
	MOV	R6,	#100		;外循环产生100ms的延时
DL1ms:					
	MOV	R7,	#200		;产生1μs的延时需要1个机器周期
DL5μs:
	NOP					;NOP指令为1个机器周期
	NOP		
	NOP
	DJNZ	R7,	DL5ms	;DJNZ为2个机器周期
	DJNZ	R6,	DL1ms
	RET					;子程序返回

代码解析

  • 程序采用一个内嵌循环设计。内循环(DL1ms)200次,每次循环消耗5个机器周期,也就是5微秒,所以总共消耗 200x5 = 1000微妙 = 1ms
  • 外循环100次,达到延时 100x1ms = 100ms = 0.1s 的效果;

更多例题有待更新…

【MCS-51单片机汇编语言】期末复习总结②——汇编程序设计(题型二)-LMLPHP

06-03 14:24