单片机汇编语言程序设计实验报告.docx
- 文档编号:14080975
- 上传时间:2023-06-20
- 格式:DOCX
- 页数:46
- 大小:206.47KB
单片机汇编语言程序设计实验报告.docx
《单片机汇编语言程序设计实验报告.docx》由会员分享,可在线阅读,更多相关《单片机汇编语言程序设计实验报告.docx(46页珍藏版)》请在冰点文库上搜索。
单片机汇编语言程序设计实验报告
单片机实验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
长转移到
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 汇编语言 程序设计 实验 报告