第4章 MCS51单片机实验.docx
《第4章 MCS51单片机实验.docx》由会员分享,可在线阅读,更多相关《第4章 MCS51单片机实验.docx(71页珍藏版)》请在冰豆网上搜索。
第4章MCS51单片机实验
第4章MCS一51单片机实验
本章实验包括MCS-51单片机指令练习,汇编语言程序设计,硬件与接口和综合应用等方面,读者通过这些实验可以巩固所学知识,基本掌握MCS-51单片机的结构与原理、接口技术和程序设计方法,培养开发单片机应用系统的技能。
实验说明中详细叙述了各实验的目的、内容,给出了接线图、程序清单或程序流程图和实验步骤。
所有实验都是相互独立的,在使用本书进行教学时,教师可根据本校(院)的教学要求,选择相应实验项目。
实验接线图中的粗实线表示使用Dais微机实验系统进行实验时,需要用户自己在实验中用导线连接起来。
使用其他类型的实验设备时,按照实验线路图和所用实验设备的使用说明书进行连线。
4.1软件实验
本节编排了十个软件实验,通过这些实验程序的调试,使学生熟悉MCS-51的指令系统和Dais微机实验系统的内部资源使用方法,了解程序设计过程,掌握汇编语言设计方法以及如何使用实验系统提供的仿真调试手段来排除程序错误。
本节实验包括MCS-51指令练习实验和程序设计实验,共提供了10个实验。
4.1.1数据传送指令实验
1实验目的
⑴学习使用单片机仿真装置方法。
⑵掌握MCS-51单片机内部RAM和外部RAM的数据传送方法,掌握内部RAM和外部RAM的特点和区别。
⑶学习编写和调试简单程序。
2实验内容
⑴观察单片机实验系统上单片机、存贮器、发光二极管、LED数码管、拨码开关、键盘上各键的位置与功能命令。
⑶数据传送指令应用练习。
3实验步骤
⑴系统连接
按照实验系统使用说明,连接实验系统的电源线和与计算机相连的通信线,运行仿真程序,将实验系统与计算机连机。
⑵编辑如下程序
MOVA,#0AAH
MOVDPTR,#1000H
MOV@DPTR,A
MOVR0,#04AH
MOV@R0,A
MOVSP,#70H
PUSHACC
SJMP$
END
⑶读出DPTR、A、SP、R0、内部RAM4AH和外部RAM4AH、70H和71H中内容并填入表中。
表4.1实验结果数据表
程序执行
DPTR
SP
A
R0
4AH(内)
4AH(外)
70H
71H
前
后
⑷编译、下载、单步运行上面程序,重新读出上述各寄存器和RAM单元内容并填入表中。
⑸编写一程序,将内部RAM单元30H-3FH单元内容传送到外部RAM2000H-200FH单元中,编译运行程序,设计一如上表格,将程序运行前后有关寄存器和RAM单元内容填入表中。
程序运行前可先用仿真开发系统的存贮器编辑命令对内部RAM单元30H-3FH置入数据。
⑹编辑并单步运行下面程序,将结果填入表4.2中。
MOVSP,#6FH
MOVA,##0AAH
MOVPSW,#0CCH
PUSHACC
PUSHPSW
SJMP$
表4.2实验结果数据表
A
PSW
堆栈指针SP
堆栈单元
6FH
70H
71H
72H
程序执行前
程序执行后
4思考
观察PUSH指令对SP和堆栈中内容的影响。
编写一程序,将外部RAM中内容传送到内部RAM中。
4.1.2数据运算指令实验
1实验目的
⑴进一步加深对算术运算指令的理解,掌握其用法。
⑵了解算术运算指令对标志位的影响。
⑶掌握二进制数加法和BCD码加法编程方法。
2实验内容
⑴16位无符号二进制数加法实验
⑵BCD码减法实验
⑶移位指令实验
3实验步骤
⑴二进制加法实验
设在内部RAM单元30H、31H和35H、36H中存有两个16位无符号二进制数,编写一程序求两个数的和,把和放在30H、31H中,各数的低8位在低位地址中。
将十六进制数2030H和3241H写入30H、31H和35H、36H中,执行程序,按照表将程序执行前后的数据填入表4.3中。
表4.3实验结果数据表
第1遍执行程序
第2遍执行程序
Cy
十六进制数
Cy
十六进制数
30H31H
单元
执行前
2030H
9A9AH
执行后
35H36H
单元
执行前
3241H
8C8CH
执行后
将单元30H、31H和35H、36H中的被加数和加数分别改为9A9AH和8C8CH,重新执行程序,把结果填入表1中。
⑵BCD码减法程序
设在内部RAM单元30H和31H中分别存有两个BCD码数,编写程序,执行BCD码减法:
(30H)-(31H),将差存到30H中,设30H和31H中的BCD码数分别如表2所示,执行程序,把运算结果填入表4.4中。
表4.4实验结果数据表
第1遍执行程序
第2遍执行程序
Cy
BCD码数
Cy
BCD码数
30H
单元
执行前
85H
27H
执行后
31H
单元
执行前
27
85H
执行后
实验程序:
CLRC
MOVA,#9AH
SUBBA,31H
ADDA,30H
DAA
MOV30H,A
CLRC
SJMP$
END
4思考
⑴试分析BCD码减法程序功能。
⑵试编写多位BCD码加法程序。
4.1.3其他指令实验
1实验目的
⑴掌握控制转移类指令、移位指令和位操作指令的用法,加深对这些指令的理解。
⑵进一步熟悉单片机开发装置的使用,增强程序调试能力。
2实验内容
⑴位操作指令练习
⑵移位指令练习
⑶转移指令练习
3实验步骤
⑴位操作指令练习
试编写程序实现表4.5中逻辑函数F的功能,计算函数F的真值表,将结果填入表4.5中。
表4.5实验结果数据表
布尔变量
F=XYYZ
Z
Y
X
实验值
计算值
0
0
0
0
0
1
0
1
0
0
1
1
1
0
0
1
0
1
1
1
0
1
1
1
⑵移位指令练习
设在内部RAM单元30H中为无符号数,编写一程序,将该数扩大5倍(适当选择无符号数的大小,使其扩大5倍后的值不超过0FFH)。
试选择不同的数,将相应的执行结果填入表4.6。
表4.6实验结果数据表
执行顺序
30H中内容
执行前(自设)
执行后
1
2
3
4
5
参考程序
CLRC
MOVA,30H
RILA
RLA
ADDA,30H
MOV30H,A
SJMP$
END
⑶转移类指令练习
设内部RAM单元35H中有一无符号二进制数,编写一程序,统计该二进制数中为1的位数,结果存入20H中。
按照表4.7对35H单元设置不同的二进制数,分别执行程序,将执行结果填入表4.7中。
表4.7实验结果数据表
执行顺序
(35H)
(20H)
执行前
执行后
执行前
执行后
1
0F9H
2
0AAH
3
75H
参考程序如下:
MOVR1,#35H
MOV20H,#00H
MOVR2,#08H
MOVA,@R1
N1:
RLCA
JNCN2
INC20H
N2:
DJNZR2,N1
END
⑷把2000H~20FFH的内容清零。
程序流程图如图4.1所示。
开始
字节数R0
Y
N
开始
(R0)=0FFH?
首址DPTR
DPTR+1R0+1
00(DPTR)
00R0
图4.1程序流程图
用连续或单步运行方式运行程序,检查2000H~20FFH中执行程序前后的内容变化。
4思考
⑴修改程序,把2000H~20FFH中的内容改成0FFH,。
4.1.4拆字和拼字程序实验
1实验目的
⑴熟悉逻辑操作指令和数据交换指令用法。
⑵初步掌握汇编语言程序设计和调试方法。
2实验内容
⑴拆字程序实验
编写程序把2000H单元中的内容拆开,高位送2001H低位,低位送2002H低位,2001H、2002H高位清零。
把2001H、2002H和A的内容填入表4.8(a)中。
⑵拼字程序实验
编写程序把2000H、2001H的低位分别送入2002H高位和低位,读出2000H、2001H、2002H和A的内容并填入表4.8(b)中。
表4.8(a)实验结果数据表
程序执行
2000H
2001H
2002H
A0-3
A4-7
前
后
表4.8(b)实验结果数据表
程序执行
2000H
2001H
2002H
A0-3
A4-7
前
后
3程序流程图
拆字程序流程图如图4.2所示。
开始
(2000H)A
高低4位交换
取低4位2001H
(2000H)A
取低4位2002H
结束
图4.2程序流程图
拼字程序流程图如图4.3所示。
开始
(2000H)A,取低4位
高低4位交换后B
(2001H)A,取低4位
AORB2002H
结束
图4.3程序流程图
4实验步骤
运行程序前用仿真调试软件的存贮器读写命令向2000H和2001H写入数据,用单步或用断点方式运行程序,检查2000H~2002H中内容变化情况。
5思考
如何用断点方式调试本程序。
4.1.5数据块传送程序实验
1实验目的
⑴掌握RAM中的数据传送操作。
⑵学习汇编语言程序设计与调试运行。
2实验内容
将源数据区数据传送到目的数据区,其中R2、R3中是内部RAM源数据区首址,R4、R5中是目的数据区首址,R6、R7中是要传送字节数。
3程序流程图
程序流程图如图4.9所示。
开始
源地址内容A
A目的地址
源地址+1
目的地址+1
N
数据传送完?
Y
结束
图4.4程序流程图
4实验步骤
在R2、R3中输入源首址(例如0000H),R4、R5中输入目的地址(例如2000H),R6、R7中输入字节数(例如1FFFH),运行程序,检查0000~1FFFH中内容是否和2000~3FFFH中内容完全—致。
4.1.6分支和循环程序实验
1实验目的
⑴掌握分支和循环程序的设计方法。
⑵学习用仿真软件调试和运行汇编语言程序。
2实验内容
⑴散转(分支)程序实验
编写程序,要求程序能根据20H中的数i的值(i≤3)进行散转的程序,即根据i的值分别转移到相应的处理程序BRi,BRi的功能是使Ri加1,然后实现((20H)+1)03H20H的操作,再返回去根据20H内容进行散转。
⑵求最小值程序实验
编写程序将内部RAM中30H开始的连续10个单元中最小的数找出来,并存入3FH单元中。
⑶查找关键词程序实验
编写程序,要求程序能在内部RAM中40H开始的连续10个存贮单元中搜索关键词0AAH,若搜索到,则将该单元地址存入20H中;若未搜索到,则将0FFH存入20H中。
3程序流程图
散转程序流程如图4.5。
求最小值程序流程如图4.6。
查找关键词参考程序流程如图4.7所示。
开始
30HR0
(30H)(3FH)
020H
9R2
(20H)=i?
R0+1R0
BR2
BR1
BR0
(R0)(3FH)?
_
R0
BR3
N
Y
(R0)(3FH)
(20H)+120H
(20H)320H
R2-1=0?
N
Y
结束
图4.6求最小值程序流程图
图4.5散转程序流程图
开始
数据块首址R0
数据块长度R2
((R0))A
Y
N
A=0AAH?
R0+1R0
(R0)20H
R2-1=0?
Y
N
0FFH20H
结束
图4.7查找关键词程序流程图
4实验步骤
⑴散转(分支)程序实验
调试程序时先将R0、R1、R2置0,然后单步执行程序,观察20H单元内容变化情况和程序转移情况,将观察结果填入表4.9中。
表4.9实验结果数据表
20H
R0
R1
R2
R3
执行分支BRi
⑵求最小值程序实验
调试程序时先对30H开始的10个单元置数,记下最小值。
用单步或连续执行方式运行程序,观察程序运行前后3FH单元中内容的变化情况。
⑶查找关键词程序实验
实验时,先在指定的地址范围内某单元中置数0AAH,进行实验;然后改变该单元的值,再进行实验,检查程序功能是否正确。
4.1.7数制转换和查表程序实验
1实验目的
⑴掌握代码转换和查表程序设计方法
⑵掌握数制转换程序设计方法
⑶进一步掌握程序调试方法
2实验内容
⑴多字节二进制数转换成十进制数
设R2R3中为一16位二进制度整数,要求编写一程序,将其转换为压缩BCD码送R4、R5、R6中。
⑵二进制码转换成ASCII码
已知在单片机内部RAM单元30H开始存有一组16进制数,试编写程序把它们转换成ASCII码,存在首地址为40H的内部RAM中。
3程序流程图
数制转换程序流程如图4.8所示。
查表程序流程如图4.9所示。
开始
0R4,R5,R6
10HR7
Cy(R2R3)左移1位(移出位bi在Cy中)
2*(R4R5R6)+CyR4R5R6(十进制运算)
N
(R7)-1=0?
Y
结束
图4.8数制转换程序流程图
开始
30HR0
40HR1
数据长度R2
ASCII码表首址DPTR
取源操作数高4位R0
查ASCII码
存ASCII码
修改地址指针
取源操作数低4位
查ASCII码
存ASCII码
修改地址指针
R2-1=0?
Y
N
结束
图4.9查表程序流程图
4实验步骤
⑴进制数转换程序实验
数制转换程序执行前先向R2R3中输入16进制数,将程序执行情况填入表4.10中。
二进制码转换成ASCII码
⑵查表程序实验
查表程序实验中,先对30H开始的单元赋16进制数值,将程序执行情况填入表4.11中。
程序中采用查表的方法进行代码转换,因此程序中要定义16进制数的ASCII码表。
表4.10实验结果数据表
执行次数
程序执行前R2R3中内容
(16进数)
程序执行后前R4R5R6中内容
(BCD码)
第1遍
第2遍
第3遍
表4.11实验结果数据表
程序执行前的源操作数
程序执行后的目的操作数
操作数地址
操作数(16进制)
目的单元地址
结果(ASCII码)
30H
34H
40H
41H
31H
0ABH
42H
43H
5实验说明
多字节二进制数转换成十进制数的原理是:
一个位长为m的整数二进制数的表达式为:
B=bm*2m+bm-1*2m-1+······+b1*2+b0
按照多项式计算方法,将上式改写为:
B=b*2+bi
i=i-1
初值:
B=0,i=m-1
结束条件:
i0
按照上述递推公式中,B是部分和,只要对部分和按照十进制运算方法进行乘2(用BCD码加法)和加bi(用BCD码加法)的运算,就可得到十进制的转换结果。
4.1.8运算程序实验
1实验目的
⑴掌握运算指令的应用方法
⑵学习运算程序编程方法
⑶进一步提高程序调试能力
2实验内容
无符号二进制数乘法程序实验。
设计一个双字节无符号乘法运算程序,要求运用MCS-51的8位乘法指令来实现。
设被乘数和乘数分别在R7R6和R5R4中,其中R7和R5中是高位字节,乘积存入33H-30H(最高位字节在33H中)中。
3参考程序
MUL1:
MOVR0,#30H
MOVA,R6
MOVB,R4
MULAB
MOV@R0,A;存R6R4L
MOVR3,B;暂存R6R4H
MOVA,R4
MOVB,R7
MULAB
ADDA,R3
MOVR3,A
MOVA,B
ADDCA,#00H
MOVR2,A;暂存R7R4H
MOVA,R6
MOVB,R5
MULAB
ADDA,R3;R6R4H+R7R4L+R6R5L
INCR0
MOV@R0,A
MOVR1,#00H
MOVA,R2
ADDCA,B
MOVR2,A;暂存R6R5H+R7R4H
JNCNEXT
INCR1;置进位
NEXT:
MOVA,R7
MOVB,R5
MULAB
ADDA,R2
INCR0
MOV@R0,A;存R7R5L+R7R4H+R6R5H
MOVA,B
ADDCA,R1;R7R5H+进位
INCR0
MOV@R0,A存R7R5H+进位
END
4实验步骤
程序运行前先对R7R6和R5R4赋值如表4.12所示,然后将执行结果填入表4.12中。
表4.12实验结果数据表
程序执行前
程序执行后
地址
R7R6
R5R4
33H30H
数据
0FFFFH
0FFFFH
1234H
S678H
0FE00H
0FE00H
5程序说明
双字节无符号乘法运算程序算法是:
用MCS-51的8位数乘法指令来实现双字节数相乘时,可以把被乘数(R7R6)和乘数(R5R4)分别表示为:
(R7z+R6z)和(R5z+R4z),其中,R7,R6,R5,R4都是8位二进制数,z也是8位2进制数,但是各位均为0。
它们的乘积用下式表示:
(R7z+zR6)(R5z+zR4)=R7R5zz+zR7R4z+zR6R5z+zzR6R4
其中,R7R5、R7R4、R6R5、R6R4为相应的2个8位数的乘积,可以用4次乘法指令求出。
将这4个16位乘积分别以高8位和低8位表示为R7R5H、R7R5L、R7R4H、R7R4L、R6R5H、R6R5L、R6R4H、R6R4L,后缀H表示积的高8位,后缀L表示积的低8位,则可以按下列排序:
R7R5HR7R5L
R7R4HR7R4L
R6R5HR6R5L
R6R4HR6R4L
并按列求和,用3次8位数加法和3次带进位位加法就可以得到4字节乘积。
参考程序如下:
(R7R6):
被乘数
(R5R4):
乘数
R0:
乘积地址指针
R3R2:
部分积
R1:
进位位暂存单元
6思考:
本程序所用算法可以推广到更多字节的乘法运算中,试用此方法实现3字节无符号数的乘法。
4.1.9数据排序程序实验
1实验目的
熟悉MCS-51指令系统,掌握汇编语言程序设计与调试方法。
2实验内容
编写并调试一个排序子程序,其功能为用冒泡法将内部RAM中几个单字节无符号二进制整数,按从小到大的次序重新排列,读出这些单元中的内容,填入表4.13中。
表4.13实验结果数据表
地址
……
程序执行前
……
程序执行后
……
3程序流程图
程序流程图如图4.10所示。
开始
首地址R0,
数据长度R2
清标志位
((R0))A
(R0)+1(R0)
Y
A((R0))?
N
置标志位,交换内容
数据长度-1=0?
N
Y
N
标志位=0?
Y
结束
图4.10程序流程图
4实验步骤
用仿真调试软件的RAM读写命令把内部RAM50H~5AH中放入不等的数据,运行本实验程序后检查50~5AH中内容是否按从小到大排列。
5思考
修改程序把50H~5AH内容按从大到小排列。
4.1.10查找相同数个数程序实验
1实验目的
⑴熟悉汇编语言编程。
⑵掌握较复杂程序的调试与运行。
2实验内容
在2000~200FH中查出有几个字节是零,把为零字节数放在2100H中,读出2100H、DPTR和2000~200FH中的内容,填入表4.14中。
表4.14实验结果数据表.
地址
2100H
2000H
2001H
2002H
……
200FH
程序执行前
……
程序执行后
……
3程序流程图
程序流程图如图4.11所示。
开始
字节数R0
数据区首址DPTR
0R1
N
((DPTR))=0?
Y
(R1)+1(R1)
(DPTR)+1
N
(R0)-1=0?
Y
(R1)(2100H)
结束
图4.11程序流程图
4实验步骤
在2000~200FH的一些单元中填入零,运行本程序后检查2100H为零单元数。
5思考
修改程序,查找其它内容。
4.2硬件与接口实验
硬件实验可使学生能进一步掌握单片机系统扩展和输入输出程序的设计方法,熟悉对扩展系统的软件、硬件设计,调试方法和技巧。
4.2.1P1口输入输出实验
1实验目的
⑴学习P1口的使用方法;
⑵学习延时子程序的编写。
2实验内容
⑴P1作为输出口,接八只发光二极管,编写程序,使发光二极管循环点亮。
⑵P1口做输入口,接八个扭子开关,以实验开发系统上74LS273做输出口,编写程序读取开关状态,再将开关状态在发光二极管上显示出来。
3程序流程图
程序流程图如图4.12所示。
左移一位
点亮1个发光二极管
开始
P1口初始化
图4.12程序流程图
4实验电路
P1作为输出口实验电路如图4.13,P1口做输入口实验电路如图4.14。
图4.13P1口输出实验