1.分别从ROM的1000H和1020H单元开始,按顺序存放0~9中每个整数的平方值和字符串“An apple!”

ORG 1000H
DATA1:  DB 0,1,4,9,16,25,36,49,64,81
	ORG 1020H
DATA2:  DB "An apple!"
   END

2.将外部RAM 1000H单元的内容清零

ORG 0000H
    LJMP START
START: MOV DPTR,#1000H
       MOV A,#0
       MOVX @DPTR,A
 END

3.在外部ROM从3000H单元开始存放了一个字节型数组,该数组中的数据依次是0~9之间整数的平方,编程采用查表的方法求出5的平方。

ORG  0000H
LJMP START
START:  MOV   DPTR,#3000H		;DPTR指向表头
        MOV   A,#5      		
        MOVC  A,@A+DPTR	;查表并将结果存于A中
        MOV   50H,A       		;存平方值
      NOP
ORG  3000H
DB  0,1,4,9,16,25,36,49,64,81

END
ORG    0000H
		MOV   DPTR,#TABLE	;DPTR指向表头
		MOV   A,#5      		
		MOVC  A,@A+DPTR
		MOV   50H,A       	
		NOP
TABLE: DB  0,1,4,9,16,25,36,49,64,81
		END

4.近程查表实现3中的功能

ORG  0000H
LJMP START
START:   MOV 	A, #5		;机器码为7405H	      
         MOVC	A,@A+PC	;机器码83H
TABLE:DB	 0,1,4,9,16,25,36,49,64,81	

	      END

5.利用ADDC指令编写计算9878H+8934H的汇编语言源程序。

假设:被加数放在内部RAM: 31H、32H单元(低位在前),
     加数放在内部RAM: 33H、34H单元(低位在前),
     和存于 :35、36H  单元,
     进位位 :37H     单元。
ORG   0000H
LJMP START
START:	MOV	31H,#78H
	    MOV	32H,#98H	
		MOV	33H,#34H		
		MOV	34H,#89H		
		MOV	A,33H			
		ADD	A,31H			
		MOV	35H,A			
		MOV	A,34H				
		ADDC A,32H	;注意这里的用法
		MOV	36H,A	
		MOV	A,#0			
		ADDC A,#0			
		MOV	37H,A				
END

6.分析下段指令执行后A、B以及标志位CY、OV和P的值。

ORG	0
START:	MOV	A, #95
    MOV	B, #48
	MUL	AB
	NOP	
	END	
本段指令执行后(A)=0D0H,(B)=11H,(CY)=0,(OV)=1,(P)=1。


设(A)=17,(B)=4,执行指令:
			DIV	AB
结果为:(A)=4,(B)=1,CY=0,OV=0。

7.编写一程序,实现将累加器A中的无符号十六进制数转换为3位BCD码,并将BCD码的百位、十位和个位分别存放在内部RAM的30H、31H和32H单元。

ORG	0000H
START:	 MOV	A, #0BDH		; 送被分离的数
		 MOV	B, #100		; 除数送B
		 DIV	AB			; 相除,分离出百位
		 MOV	30H, A		; 保存百位
		 MOV	A, B			; 余数送A
		 MOV	B, #10			; 除数送B
		 DIV	AB			; 分离十位和各位
		 MOV	31H, A		; 保存商,即十位数
		 MOV	32H, B			; 保存余数,即个位数
		 END

8.如果使与P1口相连的发光二极管从LED0到LED7依次点亮,每次只亮1个,编写汇编语言程序实现该功能

单片机常用程序架构 单片机常见程序_机器码

ORG   0000H
START:	 MOV  A,#0FEH		; 循环时的初始数据
 		 MOV  P1,A		; 点亮LED0
 		 RL	   A					
 		 MOV  P1,A		; (P1) = 0FCH 
 		 RL	   A				
 		 MOV  P1,A		; (P1) = 0FBH 
 		 RL	   A					
 		 MOV  P1,A		; (P1) = 0F7H 
 		 RL	   A					
 		 MOV  P1,A		; (P1) = 0EFH
 		 RL	   A					
 		 MOV  P1,A		; (P1) = 0CFH  
 		 RL	   A					
 		 MOV  P1,A		; (P1) = 0BFH
 		 RL	   A					
 		 MOV  P1,A		; (P1) = 7FH 
 		 END

9.用LJMP编写汇编语言源程序使图2-1的LED从LED0到LED7依次单个点亮,且如此循环。

ORG   0000H
START:	 MOV  A,#0FEH		
         NEXT:  MOV  P1,A
 	     RL	   A
         LJMP  NEXT	 
END

10.将外部数据存储器RAM从1000H开始的连续单元的数据,传送到内部RAM从40H开始的连续单元,所传送的数据为零时,传送停止。

MOV	DPTR,#1000H	
       		MOV  	R0,  #40H  	
LOOP:	MOVX  A,@DPTR 		
       		JZ     	NEXT      		
       		MOV  	@R0,A     	
       		INC    	DPTR        	
       		INC   	R0           	
       		SJMP  	LOOP        	
NEXT:	END

11.某温室内的温度要求控制在15~30℃之间,采集的温度值T放在累加器A中。若采集到的温度T>30℃,程序转向JW(降温处理程序);若T<15,则程序转向SW(升温处理程序);若30℃≥T≥15℃,则程序转向FH(返回主程序)。

CJNE	A,#30,LOOP1		
		AJMP	FH		              ;(A)	=30	
LOOP1:	JNC	    JW    	              ;(A)	>30
		CJNE   A,#15,LOOP2  	      ;(A)	<30
 		AJMP   FH                     ;(A)	=15
LOOP2:	JC     	SW     	              ;(A)	<15
                    AJMP  FH          ;(A)	>15
JW:   	____
SW:  		___
FH:  	 RET

12.把内部RAM 50H~6FH单元的内容清零

ORG   0000H
START:	 MOV  R0, #50H
	     MOV  R1, #20H	        ; 给R1装载循环次数
		 MOV  A, #0
LOOP:	 MOV  @R0, A	        ; 清零
		 INC	   R0		    ; 修改指针
		 DJNZ  R1, LOOP      	; 循环控制
		 END

13.把内部RAM 50H~6FH单元的内容清零

ORG  1000H
START1:MOV	R0, #20H		;循环次数
		MOV 	DPTR,#5000H 	;
		MOV	A, #00H		;(A)=0
LOOP1:	MOVX  @DPTR,A	;(DPTR)=0
		INC	  DPTR		;外部RAM单元加1
		DJNZ	  R0,LOOP1	;减1非0则转移
		END

14.将内部RAM中20H单元的第6位(位地址为06H)的内容,传送到P1.0中。

MOV 	C,06H  
MOV	    C,20H.6 
MOV  	P1.0,C

 15.某系统具有三人表决器的功能,如图所示。当某人同意时,将开关闭合。当两人及三人同意时表示通过,此时与P1.7相连的LED被点亮。编程实现此功能。

ORG  0
START:  NOP
	    X	BIT	P1.0	
	    Y	BIT	P1.1
	    Z	BIT	P1.2
	    F	BIT	P1.7
	    MOV	C, X		   
        CPL	C
	    ANL	C, /Y
	    MOV	F, C
        MOV	C, X		    
        CPL	C
		CPL	C
		ANL	C, /Z
		ORL	C, F
		MOV	F, C
		MOV	C, /Y		             
        CPL	C
		ANL	C, /Z
		ORL	C, F
		MOV	F, C 
END

16.统计从内部RAM 30H开始的20个数据中正数(包括0)和负数的个数,并将统计的正数和负数结果分别存放在内部RAM的50H和51H单元。

ORG	0
START: 
     MOV  R0, #30H		; 设置地址指针
	 MOV	R1, #20		; 初始化循环次数
	 MOV	50H, #0		; 统计次数清0
	 MOV	51H, #0
REP:	 
     MOV	A, @R0		; 取数据
	 JB	ACC.7, NEG		; 判断最高位是否为1
	 INC	50H			; 正数次数加1
	 SJMP	QUIT
NEG:	 
     INC	51H			; 负数次数加1
QUIT:	 
     DJNZ  R1, REP	; 次数未到,则从REP处循环

END