当前位置:文档之家› 微处理器实验报告

微处理器实验报告

微处理器实验报告
实验1 熟悉并使用传送类指令
题3. 模仿test1.Asm的循环结构,编写多字节数据的传送程序,把内部RAM的30H--39H单元置为10H-19H,然后传送到外部RAM的0100H--0109H单元。

提示:
(1)用寄存器作内部RAM指针,用DPTR作外部RAM指针。

(2)设置内部RAM的30H--39H单元的值为10H-19H:
解:程序如下:
ORG 0000H
AJMP START
ORG 0100H
START:MOV R1,#10H
MOV DPTR,#0100H
MOV R2,#0AH
LOOP:MOV A,@R1
MOVX @DPTR,A
INC R1
INC DPTR
DJNZ R2,LOOP
NOP
SJMP $
END
运行结果如下图所示:在memory1中,在Address 控件填上D:0x30,可查看内部RAM 30h单元开始的值,将30h-39h 置为10h-19h。

实验2:熟悉并使用算术逻辑操作类指令
题2.编写程序,将6位压缩BCD码123456与6位BCD码567890相加,结果仍用BCD码表示。

第一组BCD码放在30H开始连续的内部存储器单元内,第二组BCD 码放在40H开始连续的内部存储器单元内,相加结果放在50H开始的连续的内部存储器单元内。

解:程序如下:
ORG 0000H
AJMP START
ORG 0100H
START:
MOV 30H,#56H
MOV 31H,#34H
MOV 32H,#12H
MOV 40H,#90H
MOV 41H,#78H
MOV 42H,#56H
MOV R0,#30H
MOV R1,#40H
MOV R2,#03H
MOV R3,#50H LOOP:
MOV A,@R0
ADD A,@R1
DA A
MOV @R1,A
INC R0
INC R1
INC R3
DJNZ R2,LOOP NOP
SJMP $
END
运行结果如下:
实验3:顺序程序设计:拆字和拼字
题1 .拆字程序
69H存放在片外RAM中0200H地址上。

编写程序,将69H拆开,高位6送0201H地址的低位,低位9送0202H地址的低位;0201H、0202H地址的高位清零,如图所示:
解:程序如下: ORG 0000H
AJMP START
ORG 0100H START: MOV DPTR,#0200H MOVX A,@DPTR MOV B,A SWAP A ANL A,#0FH INC DPTR MOVX @DPTR,A INC DPTR
MOV A,B
ANL A,#0FH
MOVX @DPTR,A
LOOP: SJMP LOOP END
运行结果如下:
题2.拼字程序
分别编写汇编语言程序和C程序,把片内RAM30H 、31H两个字节的低位分别送入32H的高位和低位,过程与拆字程序相反。

假设(30H)=12H, (31H)=34H,运行程序后(32H)=24H
提示:使用逻辑或ORL指令,例如10H和02H相或,结果为12H
解:程序如下:
ORG 0000H
AJMP START
ORG 0100H
START:
MOV A,30H
ANL A,#0FH
SWAP A
MOV B,31H
ANL B,#0FH
ORL A,B
MOV 32H,A LOOP: SJMP LOOP
END
运行结果如下:
该程序的C51程序如下:#include<reg51.h>
#include<absacc.h>
void main()
{
DBYTE[0x30]=0x12;
DBYTE[0x31]=0x34;
DBYTE[0x030]&=0x0f;
DBYTE[0x030]<<=4;
DBYTE[0x031]&=0x0f;
DBYTE[0x32] = DBYTE[0x030]+DBYTE[0x031];
}
运行结果如下:
实验4:分支和循环程序设计
题1.分支程序设计:
(1)有两个8位无符号数NA、NB分别存放在内部RAM的40H,41H单元,当NA<NB时,将内部RAM的42H单元置为0x88;当NA>=NB时将该单元置0xff。

源程序如下。

请画出该程序流程图,并比较汇编语言和C51程序编写的不同。

汇编语言程序:
ORG 0000H
AJMP START ORG 0100H START:
MOV A ,40H
CJNE A, 41H, LOOP1
AJMP LOOP2 LOOP1:
JC LOOP3
LOOP2:
MOV 42H, #0FFH
AJMP LOOP LOOP3 :
MOV 42H,#88H LOOP:
AJMP LOOP
END
C51程序如下:
#include<reg51.h>
#include<absacc.h>
void main()
{unsigned char na,nb,f;
na=DBYTE[0x0040];
nb=DBYTE[0x0041];
if(na<nb) f=0x88 ;
else f=0xff; DBYTE[0x0042]=f;
}
解:流程图如上。

整体上看,汇编程序使用了多重循环,而C程序只应用了选择结构语句,显得更加简洁。

(2)修改上汇编语言程序,实现两个16位无符号数的比较:当NA<NB时,将内部RAM的42H单元置为0x88;否则,当NA>=NB时将该单元置0xff。

NA、NB分别存放在内部RAM的40H,41H及50H,51H单元。

解:程序如下:
ORG 0000H
AJMP START
ORG 0100H
START:
MOV A ,40H
CJNE A, 41H, LOOP1
AJMP LOOP2
LOOP1:
JC LOOP3
LOOP2:
MOV 42H, #0FFH
AJMP LOOP
LOOP3 :
MOV 42H,#88H
LOOP:
AJMP LOOP
END
运行结果如下:
题2. 循环程序设计
(1)在片内RAM的10H单元存放一个8位无符号二进制数,要求将其每一位转换成相应的ASCII码,并以高位在前,低位在后的顺序依次存放到片内RAM以11H单元为首的连续单元中,编制相应的程序。

分析:用带进位的循环左移指令RLC,通过对C标志的判断,可知该位为1还是0。

解:该程序的C51程序为:
#include"reg51.h"
#include"absacc.h"
void main()
{
int j;
unsigned char i;
unsigned char point=0x11;
for(i=0x01,j=0; j < 8; i<<=1,j++)
{
if(DBYTE[0x10]&i)
{
DBYTE[point] = 31;
}else
{
DBYTE[point] = 30;
}
point++;
}
}
运行结果如下:
题3.选做:编写程序,从内部RAM的40H为起始地址的10个无符号数中分别找出最大值和最小值并保存。

解:程序如下:
ORG 0000H
AJMP START
ORG 0100H
START:
MOV R2,#0AH
MOV R0,#40H
MOV A,@R0
MOV 51H,@R0
MOV 52H,@R0
INC R0
LOOP0: CJNE A,51H, LOOP1
MOV 51H,A
LOOP1:
JC LOOP2
MOV 51H,A
LOOP2:
INC R0
MOV A,@R0
DJNZ R2, LOOP0 LOOP:
AJMP LOOP
END
程序运行结果如下:
五.实验收获
四次微处理器实验,让我获益颇多。

现在回想起来,每次程序调试成功的喜悦似乎还未淡去。

首先,此次实验最重要也是最基本的收获,就是我很好的了解了Keil C51这个单片机应用开发集成环境。

通过编写一些简单的汇编及C程序,进一步理解C51单片机的运作方式和内部变化情况。

实践与理论的结合,让我在学习《单片机原理与接口技术》时能够融会贯通,对书上的程序有了更深的理解。

与此同时,许多问题也在实验中得以解决,特别是运行程序时,要观察内部RAM和外部RAM的变化,通过在memory中的Address控件中输入C:0x00, D:0x00, X:0x00 可分别查看ROM、片内RAM、片外RAM 这三个存储区的数据等,知识就是力量,今天我们努力获取知识,明天我们必将使用我们掌握的知识改变世界。

感谢老师的辛勤指导,路漫漫其修远兮,在求知的道路上,我们还将披荆斩
棘,一路向前。

相关主题