单片机汇编语言程序设计实验报告.docx

上传人:b****6 文档编号:14080975 上传时间:2023-06-20 格式:DOCX 页数:46 大小:206.47KB
下载 相关 举报
单片机汇编语言程序设计实验报告.docx_第1页
第1页 / 共46页
单片机汇编语言程序设计实验报告.docx_第2页
第2页 / 共46页
单片机汇编语言程序设计实验报告.docx_第3页
第3页 / 共46页
单片机汇编语言程序设计实验报告.docx_第4页
第4页 / 共46页
单片机汇编语言程序设计实验报告.docx_第5页
第5页 / 共46页
单片机汇编语言程序设计实验报告.docx_第6页
第6页 / 共46页
单片机汇编语言程序设计实验报告.docx_第7页
第7页 / 共46页
单片机汇编语言程序设计实验报告.docx_第8页
第8页 / 共46页
单片机汇编语言程序设计实验报告.docx_第9页
第9页 / 共46页
单片机汇编语言程序设计实验报告.docx_第10页
第10页 / 共46页
单片机汇编语言程序设计实验报告.docx_第11页
第11页 / 共46页
单片机汇编语言程序设计实验报告.docx_第12页
第12页 / 共46页
单片机汇编语言程序设计实验报告.docx_第13页
第13页 / 共46页
单片机汇编语言程序设计实验报告.docx_第14页
第14页 / 共46页
单片机汇编语言程序设计实验报告.docx_第15页
第15页 / 共46页
单片机汇编语言程序设计实验报告.docx_第16页
第16页 / 共46页
单片机汇编语言程序设计实验报告.docx_第17页
第17页 / 共46页
单片机汇编语言程序设计实验报告.docx_第18页
第18页 / 共46页
单片机汇编语言程序设计实验报告.docx_第19页
第19页 / 共46页
单片机汇编语言程序设计实验报告.docx_第20页
第20页 / 共46页
亲,该文档总共46页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

单片机汇编语言程序设计实验报告.docx

《单片机汇编语言程序设计实验报告.docx》由会员分享,可在线阅读,更多相关《单片机汇编语言程序设计实验报告.docx(46页珍藏版)》请在冰点文库上搜索。

单片机汇编语言程序设计实验报告.docx

单片机汇编语言程序设计实验报告

 

单片机实验1汇编语言程序设计实验

----存储器块赋值

 

一.实验目的

1熟悉存储器的读写方法,熟悉51汇编语言结构。

2熟悉循环结构程序的编写。

3熟悉编程环境和程序的调试。

二.实验内容

指定存储器中某块的起始地址和长度,要求将其内容赋值。

例如将4000H

开始的100个字节内容清零或全部赋值为33H(参考程序),要求根据参考程序修改:

 

修改程序,赋值内容为(10,9,8,7,6,5,4,3,2,1。

三.实验仪器

微机、VW,WAVE6000编程环境软件,(单片机实验箱)

 

仿真器--仿真器设置-

 

选择仿真器

Lab8000/Lab6000通用微控制器

选择仿真头

MCS51实验

选择

8051

CPU

 

前3个软件实验

勾选

√使用伟福软件模拟器

 

四实验步骤

注意:

1文件不要用中文名称保存时不要用中文路径(目录),不要放在“桌面”上,源文件和工程要放在同一个文件夹下,文件名称和路径名称不要太长。

2查看存储器菜单使用:

窗口---数据窗口---XDATA观察存储器内容

3查看SFR:

窗口---CPU窗口查看CPU寄存器SFR

4单步执行:

执行---单步执行(F8),每执行一步,查看每条语句涉及到的寄存器和存储器内容的变化结果,是否是指令所要得到的结果,如不是,检查错误原因,修改。

5利用多种执行方法和观察各种窗口调试程序,直至程序满意为止。

编译器默认设置:

程序框图

 

参考例程序:

 

Blockequ4000h

movdptr,#Block;

movr0,#10;

mova,#33h;

Loop:

movx@dptr,a

incdptr;

djnzr0,Loop;

ljmp$;

end

 

起始地址

清10个字节

将33H赋值给a

 

将a写入外部RAM

指向下一个地址

记数减一

$当前程序指针相当于一直执行自己

 

;ljmp

 

$

 

说明:

 

$:

是当前语句的程序指针(地址)

相当于一直执行自己:

ljmp

$,程序死

 

循环

 

要求赋值数据为10,9,8,7,6,5,4,3,2,1

 

则以上程序该如何改动修改后的程序:

 

?

自己修改程序实现。

 

Blockequ4000h

movdptr,#Block;

movr0,#10;

mova,#0ah;

 

起始地址

清10个字节

将0ah赋值给a

 

Loop:

movx@dptr,a

incdptr;

deca;a

djnzr0,Loop;

ljmp$;

end

 

;将a写入外部RAM

指向下一个地址

值减一

记数减一

$当前程序指针相当于一直执行自己

 

;ljmp

 

$

 

单片机实验2存储块移动

 

一.实验目的

1熟悉51汇编语言程序结构。

2熟悉循环结构程序的编写,进一步熟悉指令系统。

3熟悉编程环境和程序的调试。

二.实验内容

将指定源地址(3000H)和长度(10字节)的存储块移动到目的地址(3050H)。

需要先对3000H开始的源数据块赋值为

10,9,8.......1。

三.实验仪器微机、WAVE6000软件,(单片机实验箱)微机、VW,WAVE6000编程环境软件,(单片机实验箱)仿真器--仿真器设置-

 

选择仿真器

Lab8000/Lab6000通用微控制器

选择仿真头

MCS51实验

选择

8051

CPU

 

注意:

在编程环境中,可以通过软件仿真,观察程单片机运行情况。

四实验步骤

参考程序与流程图

 

参考程序

移动3000H-->3050H,10字节

由于源地址和目的地址的内容都一样(FF),调试时看不到内容的变化,所以需要给源地址内容赋值。

如要求赋值内容为10,9,8,7,6,5,4,3,2,1。

有多种赋值方式,如以下两种分别独立完成:

1在搬移循环体内赋值一个搬移一个,请在参考程序1的?

处补充程序

2循环体外赋值,先全部赋值再搬移,请在参考程序2的?

处添加赋值程

序。

参考程序1

movr0,#30h

mov

r1,#00h

mov

r2,#30h

mov

r3,#50h

mov

r7,#10

Loop:

mov

dph,r0

;将dptr高八位给r0

mov

dpl,r1

;将dptr低八位给r1

mov

a,r7

;将r7的值赋给a

movx

@dptr,a

;将a写入RAM/IO口

movx

a,@dptr

;读外部RAM/IO口

dec

r7

;r7减一

mov

dph,r2

;将dptr高八位给r2

mov

dpl,r3

;将dptr低八位给r3

movx

@dptr,a

;将a写入RAM/IO口

inc

r1

;r1加一

inc

r3

;r3加一

djnz

r7,Loop

;计数减一

ljmp

$

;$当前程序指针相当于一直执行自己;ljmp$

 

参考程序2

mov

r0,#30h

mov

r1,#00h

mov

r2,#30h

mov

r3,#50h

mov

r7,#10

Blockequ3000h

Movdptr,#Block

;起始地址

mov

r4,#10

;清10个字节

mov

a,#0ah

;将oah赋值给a

Next:

movx@dptr,a

;将a写入RAM/IO口

incdptr

;指向下一个地址

dec

a

;a旳值减一

djnz

r4,Next

;计数减一

Loop:

mov

dph,r0

;将dptr高八位给r0

mov

dpl,r1

;将dptr低八位给r1

movx

a,@dptr

;读外部RAM/IO口

mov

dph,r2

;将dptr高八位给r2

mov

dpl,r3

;将dptr低八位给r3

movx

@dptr,a

;将a写入RAM/IO口

inc

r1

;r1加一

inc

r3

;r3加一

djnz

r7,Loop

;计数减一

ljmp

$

;$当前程序指针相当于一直执行自己;ljmp$

 

单片机实验3数据排序

 

一.实验目的

1了解数据排序的常用算法,掌握冒泡算法。

2进一步熟悉编程环境和调试方法。

3熟悉汇编程序设计。

二.实验内容

使用冒泡算将法50H开始的10个随机数按从小到大的顺序排列。

三.实验仪器

微机、WAVE6000编程环境

四实验步骤

注意:

由于上电后数据都一样,所以需要手动修改50H后10个数据(要排序

的数)方法是:

窗口---数据窗口---DATA找到50H开始的10个2位16进制数,双击,修改其数值如(6,2,9,4,3,7,1,5,8,0)之后编译(下载),单步执行,查看排序执行过程

冒泡算法(两层循环,以下是内层循环开始⋯⋯)。

6,2,9,4,3,7,1,5,8,0

前大后小交换位置如下:

2,6,9,4,3,7,1,5,8,0

前小后大不交换位置如下;

2,6,9,4,3,7,1,5,8,0

前大后小交换位置如下;

2,6,4,9,3,7,1,5,8,0⋯第一次内层循环结束顺序如下:

最大的数9先冒出

2,6,4,3,7,1,5,8,0,9接着开始

第二次内层循环⋯⋯

 

参考程序:

Size

equ

10

;数据个数

Array

equ

50h

;数据起始地址,需要自己设置

10个比较数的值

Changeequ

0

;交换标志

Sort:

;外层循环

mov

r0,#Array

mov

r7,#Size-1

clrChange

;清零Change

Goon:

;内层循环

mov

a,@r0

mov

r2,a

inc

r0

mov

B,@r0

cjne

a,B,NotEqual

;比较a,B不相等转移

sjmp

Next

;跳转到Next

NotEqual:

jc

Next

;前小后大,不交换

setb

Change

;前大后小,置交换标志;排序是否结束标志

xch

a,@r0

;交换

dec

r0

;r0减一

xch

a,@r0

;交换

inc

r0

;r0加一

Next:

djnz

r7,Goon

;计数减一

jb

Change,Sort

;直接寻址位=1,则转移

ljmp

$

;$:

当前程序指针相当于一直执行自己;ljmp

$

end

 

考虑效率问题,每次从外层循环进入内层循环(Goon),相邻数两两比较的次数可以少一次,理论上提高效率一倍。

参考程序如下:

Size

equ

10

;

数据个数

Array

equ

50h

;

数据起始地址

Changeequ

0

;交换标志

mov

r7,#Size-1

Sort:

;外层循环

mov

r0,#Array

mov

a,r7

mov

r6,a

clr

Change

;清零Change

Goon:

;内层循环

mov

a,@r0

mov

r2,a

inc

r0

mov

B,@r0

cjne

a,B,NotEqual

;比较a,B不相等转移

sjmp

Next

;跳转到Next

NotEqual:

jc

Next

;前小后大,不交换

setb

Change

;前大后小,置交换标志

xch

a,@r0

;交换

dec

r0

;r0减一

xch

a,@r0

;交换

inc

r0

;r0加一

Next:

djnz

r6,Goon

;计数减一

dec

r7

;r7减一

jb

Change,Sort

;直接寻址位=1,则转移

ljmp

$

;$当前程序指令指针

end

 

单片机实验4P1口输入输出实验

 

一.实验目的

1.熟悉P1口的功能。

2.熟悉延时子程序或定时中断程序的编写和使用。

3.初步熟悉单片机软硬件设计方法。

二.实验内容(两内容分开做)

1.P1口做输出口接八只发光二极管,编写程序,使发光二极管循环亮灭。

注意:

实验箱(LAB6000)的发光二级管LED是高电平点亮,低电平灭。

2.P1.0,P1.1作输入口接两个拨动开关,P1.2,P1.3作输出口,接两个发光二极管。

编写程序读取开关状态,将此状态在发光二极管上显示出来。

三.实验仪器

微机,WAVE6000/VW编程环境、实验箱

硬件实验需要连接硬件仿真器,连接方式如下:

实验箱的仿真器/仿真器设置:

 

选择仿真器

LAB6000通用微控制器

 

/LAB8000

选择仿真头

MCS51实验

选择

8031/51

CPU

 

注意:

当P1口用作输入口时,必须先对它置”1”。

编程时应注意P1.0,P1.1作为输入时应先置1,才能正确读入值。

四实验步骤

(1)流程图:

 

(2)实验程序及注释:

参考程序:

注:

实验箱

LED灯1

0灭

内容1参考程序:

Loop:

mov

a,#01h

(0FEH)

将01H赋值给累加器A

mov

r2,#8

将常数8赋值给给R2

Output:

输出函数子程序

mov

P1,a

将A中01H在p1口输出

rl

a

将累加器A的值左移一位

call

Delay

调用延时子程序延时

djnz

r2,Output

判断循环是否结束

ljmp

Loop

进行下一次循环

Delay:

延时子程序

mov

r6,#0

89C51中使用一次djnz

mov

r7,#0

指令耗时2us,用该原理进

DelayLoop:

延时程序的设计,可以子

djnz

r6,DelayLoop

程序嵌套来增加延时时间。

djnz

r7,DelayLoop

子程序返回指令

ret

end

 

内容2参考程序

KeyLeft

equP1.0

用KeyLeft代替p1.0

KeyRight

equP1.1

用KeyRight代替p1.1

LedLeft

equP1.2

用LedLeftt代替p1.2

LedRight

equP1.3

用LedRight代替p1.3

SETB

KeyLeft

将KeyLeft置1

SETB

KeyRight

将KeyRight置1

Loop:

循环程序

MOV

C,KeyLeft

将KeyLeft传送给C

MOV

LedLeft,C

将C传送给LedLeft

MOV

C,KeyRight

将KeyRight传送给C

MOV

Ledright,C

将C传送给Ledright

LJMP

Loop

继续循环

END

(3)调试步骤:

程序执

(1)行后,可以看到试验台上的LED灯,由左到右依次闪亮。

且闪亮

的时间可以根据延时程序中的值的改变而改变。

调试程序

(2)的时候,当打开相对应的开关时,与其对应的LED灯变亮。

 

(4)实验说明:

1.P1口是准双向口。

它作为输出口时与一般的双向口使用方法相同。

由准双向口结构可知当P1口用为输入口时,必须先对它置“1”。

若不先对它置“1”,读入的数据是不正确的。

2延时子程序示例如下:

Delay:

MOVR6,#OH

MOVR7,#OH

DelayLoop:

DJNZR6,DelayLoop

DJNZR7,DelayLoop

RET

延时程序可以作为子程序在主程序里面调用,也可以放在程序中间,顺序执行。

以上参考延时程序是一个两层循环,修改R6,R7的数值,可以改变延时时间,也就是灯循环的频率。

那么,是修改R6的值,还是修改R7的值对延时时间影响大?

改变R7的值对延时时间的影响大,因为R7控制的是延时程序的外层循环。

 

实验五计数器实验

 

一.实验目的

1熟悉计数器的使用方法。

2熟悉计数器的硬件电路连接。

3熟悉计数器的软件设计。

二.实验内容

8031内部定时计数器0,按计数器模式和工作方式2工作,对外部脉进行计数并输出8位计数结果用LED灯表示的二进制数显示,达到最大计数数值时,给出警告信号。

说明:

用8031内部定时计数器0按照工作方式2(8位自动重装)对P3.4引脚(计数器0计数脉冲输入端T0)进行计数,将计数结果(按动脉冲的次数)数值输出到P1口驱动LED灯按二进制的方式显示出来,读LED二进制数计算出来,看看是否与TL0数值一致。

设定最大计数次数,达到最大次数时候给出警告,(比如参考程序中的记

满后LED反转一次输出显示警告)。

要求:

设定计数的次数(可以自己设定,比如:

12),当达到最大计数次数(12)

时,将P2.0连接的LED闪烁10次(亮灭各6次)以示警告,自己修改参考程

序实现。

根据参考程序,参考实验四的延时程序,自己修改计数初值,(根据最大

计数次数12次计算修改),计算对应的计数初值(?

),修改相应程序(修

改REP子程序,使灯亮灭12次做为按动满12次的警告信号。

三.实验仪器

微机,WAVE6000/VW编程环境、实验箱

硬件实验需要连接硬件仿真器,连接方式如下:

软件:

仿真器/仿真器设置:

选择仿真器选择仿真头选择CPU

LAB8000/LAB6000通用微控制器MCS51实验8031/51

注意:

P3.4接单次脉冲

 

实验连线如图:

 

TO(P3.4)

取反信号:

P2.0连接L7

实验箱单次脉冲

实验箱的单次脉冲(高电平,低电平)

四实验步骤

1流程图如下:

计数初值自动重装是由计数器硬件自己完成参考程序1:

movTMOD,#00000101b;方式1,记数器

movTHO,#0;计数初值为0

movTLO,#0

setbTR0;开始记数

Loop:

movPl,TLO;将记数结果送P1口

ljmpLoop

参考程序2:

用查询计数溢出标志位方式确

 

定计数达是否到最大次数

 

初值

 

DEL:

TL0=256-10=246=

MOVTMOD,#06H

MOVTH0,#0F6H

MOVTL0,#0F6H

SETBTR0

JBCTF0,REP

F6H

 

;计数初值(工作方式2自动重装)

;计数初值

;开始计数

;计数溢出(TF0=1)后跳到REP,同时

 

TF0清0

 

MOV

SUBB

MOV

SJMP

A,TL0

A,#0F6H

P1,A

DEL

;当前计数数值(8位)-->A

;计数当前值与初值之差值-->A

;输出当前已经按(按钮)的次数

;无条件跳转到DEL继续查询TF0,

 

是否溢出

 

REP:

CPL

P2.0

;翻转

P2.0一次,

 

SJMPDEL;无条件跳转到DEL继续查询TF0,

是否溢出

 

调试步骤

(1)执行程序,在试验台上按下单脉冲按钮,可以看到LED

情况。

随着按下次数的增加,LED灯以二进制进行计数。

调试步骤

(2)执行程序,在试验台上按下单脉冲按钮,可以看到每按下

LED灯的亮灭进行翻转。

 

灯的亮灭

 

10次

 

问题:

如要求最大计数次数

20次自己计算修改计数初值?

 

初值TL0=256–20=236=0ECH

 

要求修改以上参考程序,根据最大计数次数

12

次计算修改对应的计数初值

 

(?

),修改程序,使L7(P2.0)LED灯亮灭12次作为按满12次的警示信号。

 

要求程序能够一直进行检测和输出警告信号。

 

实验六外部中断实验

 

一.实验目的

1熟悉外部中断的硬件电路,中断技术的基本使用方法。

2熟悉外部中断的软件设计。

二.实验内容

硬件实验需要连接硬件仿真器,连接方式如下:

 

菜单:

仿真器/仿真器设置:

 

选择仿真器

LAB8000/LAB6000通用微控制器

选择仿真头

MCS51实验

 

利用实验箱上的单脉冲按键和发光二极管,蜂鸣器,实现:

用单次脉冲申

请中断,在中断服务程序中对输出信号进行翻转(每当输出一个单次脉冲时(产生低电平一个脉冲),发光二极管(L0)亮灭变化一次。

参考程序2中并使蜂鸣器响一段时间,修改相关参数使蜂鸣器响的时间频率改变。

参考程序2蜂鸣器是在哪里关闭的?

三.实验仪器

微机、VW,WAVE6000编程环境,实验箱

连线:

P1.0连接L0;

蜂鸣器(喇叭)连接P1.1

INT0(P3.2)连接低电平单次脉冲。

 

实验箱的单次脉冲(高电平,低电平)接口如下图中间位置:

绿色按钮为脉冲产生按钮:

 

注意

中断服务程序(ISR)关键:

1保护进入中断时的现场,现场是指中断发生时各个寄存器,数据存储区的内容,为了能够继续完成没完成的工作状态,在退出中断之前需恢复现场(还原在中断程序中修改的而在主程序用到的寄存器,存储器的内容)。

本例中保护

CPU状态寄存器PSW,R0,R1,等的内容。

(例程中R2没有被保护,它的值是

不是被中断服务程序修改了,可以修改程序看看与保护后的结果的不同)。

2中断重入的设置中断相关寄存器的设置:

中断寄存器IE,中断触发方式的设

 

置。

3中断程序和子程序的区别。

中断程序不是程序调用的,中断发生时,开中断情况下,CPU就执行相应中断服务程序,每个中断对应固定的开始地址,每个中断向量8个字节空间。

程序流程图:

 

参考程序1:

LEDequP1.0

LEDBufequ0

ljmpStart;

org3;

Interrupt0:

pushPSW

cplLEDBuf

movc,LEDBuf

movLED,c

popPSW

Reti;

Start:

 

;LED=P1.0标号赋值命令

;LEDBuf=0

长转移到

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 医药卫生 > 基础医学

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2