单片机实验

实验一、MCS51单片机基本开发环境

1.实验目的:

1) 熟悉软件的集成开发环境

2) 掌握单片机软件设计流程

3) 掌握单片机存贮器结构及各窗口之间的联系

2.实验内容:

1) 用三种方法实现将累加器A内容改为20H

方法1--MOV A,#20H

方法2—MOV R0,#20H

MOV A,R0

方法3—MOV R0,#20H

XCH A,R0

心得:越往下做实验时就越感觉这题根本不能说是题目,但不得不说在没接触过编程软件,刚开始学的汇编,第一次做的实验就光这道题都觉得不知道做什么.所以凡是总有开始,不了解情况的多简单的都会觉得难.

2) 将58H位单元置为1,观察内部RAM中2BH内容的变化

代码:

SETB 2BH.0

JMP $

END

心得:这是关于内部存储中对单元和字节了解,不理解很容易做错.比如开始写的指令为

MOV R0,#58H;MOV @R0,#1

这是错误的指令。这就需要认真去了解单片机中的字节地址与位地址的关系。80C51中有位寻址区和字节寻址区。题目中58H为位地址,2BH为字节地址,且58H为2B字节的最低位。由于58H属于位寻址区,可用位操作指令SETB进行置位,SETB 2BH.0执行后,2BH中内容变为01

3) 如果当前状态为有进位、工作寄存器使用区2,请用3种方法设置这种状态

代码:

ANL PSW,#01H

MOV A,PSW

CJNE A,#01,LAB2

LAB1:JMP LAB1

LAB2: SETB PSW.4 MOV P0,#01H MOV R0,#18H

CLR PSW.3 MOV C,P0.0 MOV PSW,R0

MOV PSW.4,C

CPL C

MOV PSW.3,C

END

心得:以上LAB2写了三段代码,可分别完成题目要求。不过实验时只是对代码进行了错误调试,没有对结果进行检验。其中值得注意的是对于布尔(位)操作指令的用法,比如传送指令必须经累加器C,如第二段中MOV P0,#01H ; MOV C,P0.0 ,以及对于位寻址的方式(如需用到“.”隔开)的应用。

4) 编一个小程序将内部RAM中的20H单元的内容送到21H单元并调试

代码:

MOV R0,#20H

MOV @R0,#10H

MOV R1,#21H

MOV @R1,20H

JMP $

END

5) 用程序将堆栈指针指向60H,然后在堆栈中依次压入01,02,03,04,05五个数,观察哪些单元内容发生了变化,各变为多少?从哪些窗口可以发现这些变化?顺序将堆栈中的五个数放入30H~34H五个单元中,编程实现之。

代码:

MOV R1,#60H

MOV SP,R1

MOV DPL,#1H

LAB1:PUSH DPL

INC DPL

MOV A,DPL

CJNE A,#6,LAB1

POP 34H

POP 33H

POP 32H

POP 31H

POP 30H

JMP $

END

6) 将外部数据存贮器1000H~100FH 16个单元中存放00H~0FH

代码:

MOV DPTR,#1000H

MOV R1,#10H

LOOP:MOVX @DPTR,#1234H

MOVX A,@DPTR

MOV @R1,A

INC DPTR

INC R1

CJNE R1,#40H,LOOP

JMP $

END

心得:此处需要访问片外存储空间,需要借助寄存器DPTR,需注意其为16位的寄存器,在使用时若与八位寄存器进行数据交换时需分为高八位DPH与低八位DPL来用。

7) 若要求程序从0010H单元开始运行,可用两种方法实现?

方法一 ORG 0010H

方法二 AJMP 0010H

3.选做实验内容:数据传送

目的:

1) 掌握8051单片机内部数据存贮器、外部数据存贮器的数据传送特点和应用

2) 掌握MOV,MOVX和MOVC类指令的用法及区别

内容:

1)将片内RAM数据区20H为首地址的十六个字节传送到30H为首地址的数据

区,即:20H~2FH送30H~3FH

代码:

ORG 0000H

JMP MAIN

ORG 0030H

MAIN:MOV R0,#20H

MOV R1,#30H

LOOP:MOV @R0,#1234H

MOVA,@R0

MOV @R1,A

INC R0

INC R1

CJNE R1,#30H,LOOP

JMP $

END

2) 将外部数据存储器2000H~200FH单元的十六个数传送至内部数据存储器

的30H~3FH

代码:

ORG 0000H

JMP MAIN

ORG 0030H

MAIN: MOV DPTR,#2000H

MOV R1,#30H

LOOP:MOVX @DPTR,#12H

MOVX A,@DPTR

MOV @R1,A

INC DPTR

INC R1

CJNE R1,#40H,LOOP

JMP $

END

总体心得体会:

第一次做实验主要是熟悉了解了下单片机编程软件的使用,开始接触时在对其软件不是太了解的情况下实验编程做的确实很乱,不清楚该怎样进行,比如不知如何进行对指令的调试,也不清楚该如何观察结果,没有一个整体的概念,所以在了解其开发环境上花了不少时间。经过一段时间的摸索后也终于了解了其具体的使用,也能够顺利的对指令的编程运用。运行指令时遇到的一些问题需要注意的也在上面各题中做了说明。还有需要注意的是:进入软件仿真时需要对存储空间进行查看的方法是在Address窗口中输入:d:00h 显示内部数据存储器从00h开始的单元;x:1000h 显示外部数据存储器从1000h开始的单元;c:0000H 显示程序存储器内容。还有由于伪指令END定义的原因,在程序末需加一条死循环调转指令(如 JMP $ )使程序不会进入其他未知空间执行其他指令。

实验二、加、减法实验

1.实验目的

1) 正确使用单片机的加减运算指令

2) 掌握不同指令对于程序状态字的影响及程序状态字的意义、用处

3) 掌握ADD,ADDC,SUBB和DA A等指令的用法

4) 学习模块化程序设计方法

2.实验内容

1) 编写3字节二进制加法子程序,并用主程序调用不同的加数和被加数来

检测该子程序的正确性。需考虑有进位和无进位情况。程序入口为:加

数:22H,21H,20H三字节,22H为最高位

被加数:32H,31H,30H三字节,32H为最高位程序出口为:23H,22H,21H,20H四字节,23H为最高位

例如:地址:23 22 21 20 32 31 30

执行前数据:01 23 45 FF 01 01

执行后数据:01 00 24 46

代码:

ORG 0000H

AJMP MAIN

ORG 30H

MAIN:

MOV 22H,#01H

MOV 21H,#23H

MOV 20H,#45H

MOV 32H,#0FFH

MOV 1H,#01H

MOV 30H,#01H

ACALL ADDI

HERE:JMP HERE

ORG 100H

ADDI:

PUSH PSW

MOV R0, #20H ;加数1地址、和的地址

MOV R1, #30H;加数2地址

CLR C

MOV R2, #3 ;循环3次

LOOP:

MOV A, @R0 ;取

ADDC A, @R1 ;加

MOV @R0, A;存

INC R0

INC R1

DJNZ R2, LOOP

CLR A

ADDC A, #0 ;得到进位

MOV 23H, A ;保存

POP PSW

RET

END

2) 编写三字节二进制减法子程序入口:被减数:52H,51H,50H, 50H

为最低位

减数:42H,41H,40H, 40H为最低位

出口:差:外部数据存贮器2003H~2000H(2000H为最低位)

用主程序调用多组数据来调试,需考虑无借位和有借位两种情况。

例如:

执行前:地址:52 51 50 42 41 40

数据:90 80 70 10 10 10

执行后:地址:2003 2002 2001 2000

数据:00 80 70 60

代码:

ORG 0000H

AJMP MAIN

ORG 30H

MAIN:

MOV 52H,#90H

MOV 51H,#80H

MOV 50H,#70H

MOV 42H,#10H

MOV 41H,#10H

MOV 40H,#10H

ACALL SUB1

HERE:JMP HERE

SUB1:

PUSH PSW

MOV R0, #50H ;被减数地址

MOV R1, #40H ;减数地址

MOV DPTR, #2000H ;差的地址

CLR C

MOV R2, #3 ;循环3次

LOOP:

MOV A, @R0 ;取

SUBB A, @R1 ;减

MOVX @DPTR, A ;存

INC R0

INC R1

INC DPTR

DJNZ R2, LOOP

CLR A

SUBB A, #0 ;得到借位

MOVX @DPTR, A ;存

POP PSW

RET

END

3) 编写10位十进制加法子程序(十进制数采用压缩BCD码存放)

入口:加数:24H—20H,低地址放低字节

被加数:29H—25H,低地址放低字节

出口和:4005H—4000H,低地址放低字节

要求调用多组数据调试,注意观察PSW的变化,理解DA A指令的含义。

例如:

执行前地址:24 23 22 21 20 29 28 27 26 25

数据:12 34 56 78 90 88 99 33 12 74

执行后地址:4005 4004 4003 4002 4001 4000

数据:01 01 33 89 91 64

代码:

ORG 0000H

AJMP MAIN

ORG 30H

MAIN:

MOV 24H,#12H

MOV 23H,#34H

MOV 22H,#56H

MOV 21H,#78H

MOV 20H,#90H

MOV 29H,#88H

MOV 28H,#99H

MOV 27H,#33H

MOV 26H,#12H

MOV 5H,#74H

ACALL ADD2

HERE:JMP HERE

ADD2:

PUSH PSW

MOV R0, #20H;加数1地址

MOV R1, #25H ;加数2地址

MOV DPTR,#4000H

CLR C

MOV R2, #5 ;循环5次

LOOP:

MOV A, @R0 ;取

ADDC A, @R1 ;加

DA A ;调整为BCD码

MOVX @DPTR, A ;存

INC R0

INC R1

INC DPTR

DJNZ R2, LOOP POP PSW

RET

END

相关文档