单片机软件实验报告

单片机软件实验报告
单片机软件实验报告

实验一内存操作

1.实验目的

①掌握数据传送指令;

②掌握各种数据传送指令的寻址方式;

③熟练运用keil 环境对汇编程序进行调试;

④掌握数据传送、复制等程序的设计与调试方法。

2.预习要求

①¥

②理解数据传送指令和循环指令的使用;

③理解如何对内部寄存器、内部RAM、外部XRAM(外部数据存储器)的读写;

④理解各种寻址方式,尤其是较为抽象的变址寻址及相对寻址的方式;

⑤认真预习本实验内容,自行编写程序,填写实验报告。

3.实验设备

计算机 1台;

4.基础型实验内容:

1.下列程序的功能是给外部XRAM 8000H~80FFH的256个单元的内容赋值,赋值的内容取

决于程序中A的赋值。在Keil环境运行该程序,并观察寄存器及内存单元的变化。

ORG 0000H

START EQU 8000H;

MAIN: MOV DPTR,#START;;起始地址

MOV R0,#0H;;设置256字节计数值

MOV A,#1H;

Loop: MOVX @DPTR,A;

INC DPTR;;指向下一个地址

DJNZ R0,Loop;;计数值减1

NOP;

SJMP $;

END

寄存器A为1H,DPTR递增到8100H,奇偶校验位由于A的内容是1H,所以p也是1.

2.下列程序将外部XRAM 3000H起始的256个字节存储块移动到外部XRAM 4000H起始的

256个字节存储块,在Keil环境运行如下程序,观察寄存器及存储单元的变化。

ORG 0000H

MOV DPTR,#3000H

MOV A,#01H

MOV R5,#0H

LOOP: MOVX @DPTR,A

INC DPTR

>

DJNZ R5,LOOP

MOV R0,#30H

MOV R1,#00H

MOV R2,#40H

MOV R3,#00H

MOV R7,#0H

LOOP1: MOV DPH,R0

MOV DPL,R1

MOVX A,@DPTR

MOV DPH,R2

MOV DPL,R3

<

MOVX @DPTR,A

INC R1

INC R3

DJNZ R7,LOOP1

SJMP $

END

实现了将3000H开始的256个单元的内容复制到以4000H开头的外部RAM存储单元中。

(

R0的值为30H;R2的值变为40H;寄存器A中赋值为1H,对栈指针sp初始化为07H,其最大值亦为07H,DPTR中最后递增到40ffH,psw中只有奇偶校验位p是1H

3在Keil环境运行如下程序,观察寄存器及内存单元的变化,将变化结果注释于右侧,并

说明程序完成什么功能将程序中MOV A,@R0改成MOVX A,@R0,将MOV @R1,A改成MOVX @R1,A,运行如下程序,观察寄存器及相应地址RAM、XRAM地址单元存储内容的变化。

1.

ORG 0000H;程序从000H开始

MOV R0,#30H;

MOV R1,#50H

MOV R2,#20H

L1: MOV A,@R0

MOV @R1,A

]

INC R0

INC R1

DJNZ R2,L1

SJMP $

END

R0的值递增到50H,R1的值递增到70H,A中的值是4FH中的值,即FFH(程序运行前自己设定的)

该程序将内部RAM 30H开始的连续20H个存储单元中的内容复制到内部RAM 50H 开始的连续20H个存储单元中。其中30H到4FH中的值在程序运行前自定义。

2.将程序中MOV A,@R0改成MOVX A,@R0,将MOV @R1,A改成MOVX @R1,A

?

ORG 0000H

MOV R0,#30H

MOV R1,#50H

MOV R2,#20H

L1: MOVX A,@R0

MOVX @R1,A

INC R0

INC R1

DJNZ R2,L1

SJMP $

END

]

寄存器A中的数值没有发生过任何变化,R0和R1同未改变前一样,一直递增到50H和70H

虽然设定了外部RAM 30H到4FH中的值,但是并没有复制到50H到6FH存储单元中。

原因是初始化后P口都为#FFH,而使用MOVX A,@Ri要

求P2口为#00H,所以只要在程序前加MOV P2,#00H就能实现和原来一样的功能了

5.设计型实验

①在keil环境下,修改内部RAM 30H ~3FH的内容分别为#00H ~#0FH,设计程序实现

将内部RAM 30H-3FH单元的内容复制到40H-4FH中。

ORG 000H;

MOV R2,#10H;

MOV A,#0H;

MOV R1,#30H;

MOV R0,#40H;

LOOP: MOV @R1,A;

INC R1;

INC A;

DJNZ R2,LOOP;

MOV R1,#30H;

MOV R2,#10H;

LOOP2:MOV A,@R1;

MOV @R0,A;

INC R1;

INC R0;

DJNZ R2,LOOP2;

SJMP $;

END

②在keil环境下,修改内部RAM 30H ~3FH的内容分别为#00H ~#0FH,设计程序实现

将内部RAM 30H~3FH单元的内容复制到片外1030H~103FH中。

ORG 000H;

MOV R2,#10H;

MOV A,#0H;

MOV R1,#30H;

MOV DPTR,#1030H;

LOOP: MOV @R1,A;

INC R1;

INC A;

DJNZ R2,LOOP;

)

MOV R1,#30H;

MOV R2,#10H;

LOOP2:MOV A,@R1;

MOVX @DPTR,A;

INC R1;

INC DPTR;

DJNZ R2,LOOP2;

SJMP $;

END

③设计程序将外部64KB的XRAM高低地址存储内容互换;如0000H与0FFFFH,0001H与

0FFFEH,0002H与0FFFDH,…….互换;互换数据个数为256。ORG 000H;

MOV DPTR,#0FFFFH;

MOV R1,DPL ;保存当然DPTR低位

loop:

MOV DPL,R1;

'

MOVX A,@DPTR;

MOV R3,A ;保存当前DPTR的内容

MOV R0,DPH ;保存当然DPTR高位

MOV A,DPH;

CPL A ;求得当前DPTR高位的反码

MOV DPH,A;

MOV A,R1;

CPL A ;求得当前DPTR低位的反码

MOV DPL,A ;求得当前DPTR反码

MOVX A,@DPTR;

MOV R4,A ;保存当前DPTR对称码(反码)的内容-

MOV A,R3;

MOVX @DPTR,A ;将当前DPTR(原码)的内容存入对称码中MOV DPH,R0;

MOV DPL,R1 ;还原DPTR

MOV A,R4;

MOVX @DPTR,A ;将对称码的内容存入当前DPTR(原码) DEC R1;

CJNE R1,#0FFH,LOOP;

SJMP $;

END

运行前:

运行后:

6.?

7.综合型实验

a)设计程序实现将外部XRAM 0000H起始的512个字节数据传送到外部XRAM 2000H

起始的512个存储单元中。

ORG 0000H;

MOV R3,#0H;

MOV DPTR,#0000H;

LOOP:

MOVX A,@DPTR;

MOV R0,DPL;

MOV DPH,#20H;

MOVX @DPTR,A;

INC R0;

MOV DPL,R0;

MOV DPH,#0H;

DJNZ R3,LOOP;

SJMP $;

END

X:0H至X:0FFH的值是自定义的;运行程序后复制到X:2000H至X:20FFH;

b)若源块地址和目标块地址有重叠,程序该如何设计(用地址减1方法移动块)假

设源块地址2000H,目标块地址2050H,移动块长度80H;试设计程序实现该功能。

思路:先将由源块地址起始的数据块保存到非目标块地址中(防止覆盖目标地址),

然后再复制到目标块地址;

,

ORG 0000H;

MOV DPTR,#2000H;

MOV R3,#80H;

LOOP:

MOVX A,@DPTR;

MOV R0,DPH;

MOV R1,DPL;

MOV DPH,#30H;

}

MOVX @DPTR,A;

MOV DPH,R0;

INC R1;

MOV DPL,R1;

DJNZ R3,LOOP;本循环实现将x:2000H开始的80个单元中的内容复制到x:3000H开始的80个单元中去

MOV DPTR,#3000H;

MOV R3,#80H;

MOV R4,#50H;

LOOP2:

MOVX A,@DPTR;

"

MOV R2,A;

MOV R0,DPH;

MOV R1,DPL;

MOV A,R4;

MOV DPH,#20H;

MOV DPL,A;

MOV A,R2;

MOVX @DPTR,A;

INC R4;

MOV DPH,R0;

INC R1;

MOV DPL,R1;

DJNZ R3,LOOP2;本循环实现将x:3000H开始的80个单元中的内容复制到x:2050H开始的80个单元中去

SJMP $;

END

实验二数制及代码转换

1.实验目的

①了解微机系统中的数制与代码表示方法;

②掌握计算机中使用的各种代码转换方法;

③掌握实现分支、循环的指令及其程序的编写方法;

2.预习要求

①理解十进制数、十六进制数的数制表示方法;

②理解BCD码、ASCII码编码方式;

③如何实现十六进制数与BCD码之间的转换;

④如何实现ASCII码与BCD码之间的转换。

3.实验设备

/

计算机 1台。

4.基础型实验内容

①以下程序完成单字节的ASCII码到十六进制数转换,完成空白处程序填写,并在

Keil环境运行程序,观察寄存器及相应地址内存单元内容的变化。

RESULT EQU 30H

ORG 0000H

MOV A,#41H ;“A”的ASCII码

CLR C

SUBB A,#37H ; 转换为十六进制值A

MOV RESULT,A

LJMP $

END

②以下程序完成单字节的BCD码到十六进制数转换,,在Keil环境运行程序,观察

寄存器及相应地址内存单元内容的变化。

RESULT EQU 30H

ORG 0000H

MOV A,#23H

MOV R0,A

ANL A,#0F0H

SWAP A

MOV B,#0AH

MUL AB

~

MOV RESULT,A ;转换高位 MOV A,R0

MOV B,#0FH

ANL A,B;

ADD A,RESULT

MOV RESULT,A ;转换低位 SJMP $

END

③以下程序将单字节十六进制数A的值转换为十进制数,存放在30H~32H中,完成

空白处程序填写,并在Keil环境运行程序,观察寄存器及相应地址内存单元内容的变化。

RESULT EQU 30H

ORG 0000H

MOV A,#7BH

MOV B,#100

DIV AB

MOV RESULT,A ;除以100得百位数

MOV A,B

MOV B,#10

DIV AB

MOV RESULT+1,A ;除以10得十位数

MOV RESULT+2,B ;余数为个位数

SJMP $

END

5.设计型实验内容

①将30H、31H单元中的十六进制数,转换成ASCII码,存放到40H开始的4个单元

中。

}

ORG 0000H;

MOV R2,30H;

MOV R3,31H;

MOV R0,#40H;

MAIN:

MOV A,R2;

ANL A,#0F0H;

SWAP A;

ADD A,#90H;

DA A;

ADDC A,#40H;

:

DA A;

MOV @R0,A ;将31H中的高位转化成ASCII码

INC R0;

MOV A,R2;

ANL A,#0FH;

ADD A,#90H;

DA A;

ADDC A,#40H;

DA A;

MOV @R0,A ;将30H中的低位转化成ASCII码

]

INC R0;

MOV A,R3;

ANL A,#0F0H;

SWAP A;

ADD A,#90H;

DA A;

ADDC A,#40H;

DA A;

MOV @R0,A ;将30H中的高位转化成ASCII码

INC R0;

#

MOV A,R3;

ANL A,#0FH;

ADD A,#90H;

DA A;

ADDC A,#40H;

DA A;

MOV @R0,A ;将31H中的低位转化成ASCII码

INC R0;

SJMP $;

END

·

②单字节十六进制数转换为十进制数的程序设计。设单字节十六进制数存放在内部

RAM 30H 中,结果要求存放到内部RAM 40H-41H中。

本题应该是40H-42H,因为该十六进制数完全有可能超过100

RESULT EQU 40H;

ORG 0000H;

MOV R0,#30H;

MOV A,@R0;

MOV B,#100

DIV AB

MOV RESULT,A ;除以100得百位数

MOV A,B

MOV B,#10

DIV AB

MOV RESULT+1H,A ;除以10得十位数

MOV RESULT+2H,B ;余数为个位数

SJMP $

END

③}

④单字节压缩BCD码数转换成十六进制数的程序设计。设压缩BCD码数存放在内部

RAM30H中,结果要求存放在内部RAM40H中。

RESULT EQU 40H; ;设置存放地址

ORG 0000H;

MOV R1,#30H;

MOV A,@R1;

ANL A,#0F0H ;取高4位

SWAP A;

MOV B,#0AH;

MUL AB ;高位乘以10

MOV RESULT,A ;转换高位

MOV A,@R1;

MOV B,#0FH ;取低4位

ANL A,B;

ADD A,RESULT;

MOV RESULT,A ;转换低位

SJMP $;

END

6.综合实验

①多字节十六进制数转换为十进制数的程序设计。设多字节十六进制数存放在内部

RAM 30H 开始的单元中,要求结果存放在内部RAM 40H开始的单元中。

ORG 0000H;

MOV R1,#40H ;存放单元

MOV R0,#30H ;起始存储单元

MOV R2,#9H ;设置要转化的单元数,即循环次数

LOOP:

MOV A,@R0;

MOV B,#100;

DIV AB;

MOV @R1,A ;除以100得百位数

INC R1;

MOV A,B

"

MOV B,#10;

DIV AB

MOV @R1,A ;除以10得十位数

INC R1;

MOV @R1,B ;余数为个位

相关主题
相关文档
最新文档