河北工业大学 单片机实验第四次试验实验八 查表程序设计.docx
- 文档编号:25875305
- 上传时间:2023-06-16
- 格式:DOCX
- 页数:22
- 大小:198.26KB
河北工业大学 单片机实验第四次试验实验八 查表程序设计.docx
《河北工业大学 单片机实验第四次试验实验八 查表程序设计.docx》由会员分享,可在线阅读,更多相关《河北工业大学 单片机实验第四次试验实验八 查表程序设计.docx(22页珍藏版)》请在冰豆网上搜索。
河北工业大学单片机实验第四次试验实验八查表程序设计
实验八查表程序设计
一、实验目的
1.进一步熟悉MCS-51指令系统和汇编语言程序设计。
2.学会用MOVC指令编写查表程序。
二、实验内容
1.设计并调试一个查平方表的程序,其功能为应用查表指令MOVCA,@A+PC,求累加器A中数的平方值,结果平方值送A。
要求待查的(A)≤15。
2.设计并调试一个根据电压值查与其对应的温度值的查表程序,其功能为应用查表指令MOVCA,@A+DPTR,求(A)中电压值对应的温度值,将温度值送R2R3(温度值为二字节的压缩BCD码),电压值的范围为(A)≤0FFH。
实验程序参考框图如3-8所示。
三、实验步骤
1.键入程序和预定表后;
2.通过修改自变量参数启动并调试程序,直至正确为止。
3.边调试边体会用PC或DPTR作指针查表的区别。
四、实验报告要求
根据实验内容和程序参考流程,编出所需查表程序,列出实验程序清单。
五、思考题
1.当表的长度〉255个字节时应选哪一条指令查表?
答:
当表的长度〉255个字节时应选“MOVCA,@A+DPTR”指令查表,并且需要对DPH、DPL进行运算处理,求出表目地址,再用“MOVCA,@A+DPTR”指令查表。
2.用PC指针查表编程时应注意什么?
答:
应先用传送指令把所查数据的项数送入累加器A,并用“ADDA,#data”对A进行修正data值等于查表指令和数据表格之间的字节数,然后用“MOVCA,@A+PC”查表,同时用PC指针查表的表的范围不能大于255个字节。
六、参考程序清单
1.求平方值查表程序:
ORG0000H
ADDA,#02H
MOVCA,@A+PC
SJMP$
DB0,1,4,9,16,2536,49
DB64,81,100,121,144,169,196,225
END
本程序实现通过查表得A累加器中数的平方值并将结果送A,根据A中数值采用基址加变址方法找到所查数的地址得所对应的平方数。
例:
当(A)=5时,执行过程如下:
D:
0XE0(A)
PC指针ORG0000H05H
C:
0X0000ADDA,#02H07H
C:
0X0002MOVCA,@A+PC19H;A+PC=A(10),查表的19H(25)
C:
0X0003SJMP$
C:
0X0005DB0,1,4,9,16,2536,49
DB64,81,100,121,144,169,196,225
END
2.测量温度查表程序:
双字节查表程序刘程序如图3-8所示:
双字节查表参考程序清单:
ORG0000H
MOVDPTR,#TAB
CLRC
MOVR0,A
ADDA,R0
MOVF0,C
ADDA,DPL
MOVDPL,A
CLRA
ADDCA,DPH
MOVC,F0
ADDCA,#0
MOVDPH,A
CLRA
MOVCA,@A+DPTR;查第一个字节
MOVR2,A
CLRA
INCDPTR
MOVCA,@A+DPTR;查第二个字节
MOVR3,A
SJMP$
TAB:
DW0100H,0110H,0120H,0130H,0140H,0150H,0160H;温度表
END
本程序实现根据A中电压查表中与之对应的温度值,表中温度均为2字节故(A)*2+DPTR(表首地址)即可查的对应温度值。
例:
温度表如上,当电压为3时执行过程如下:
DPTR
PC指针
A(D:
0X0E0)
DPH
DPL
R2(D:
0X02)
R3(D:
0X03)
C:
0X0000
ORG0000H
03H
C:
0X0000
MOVDPTR,#TAB
00H
1EH
C:
0X0003
CLRC
C:
0X0004
MOVR0,A
C:
0X0005
ADDA,R0
06H
C:
0X0006
MOVF0,C
C:
0X0008
ADDA,DPL
24H
C:
0X000A
MOVDPL,A
00H
24H
C:
0X000C
CLRA
00H
C:
0X000D
ADDCA,DPH
00H
C:
0X000F
MOVC,F0
C:
0X0011
ADDCA,#0
00H
C:
0X0013
MOVDPH,A
C:
0X0015
CLRA
C:
0X0016
MOVCA,@A+DPTR
01H
C:
0X0017
MOVR2,A
01H
C:
0X0018
CLRA
00H
C:
0X0019
INCDPTR
00H
25H
C:
0X001A
MOVCA,@A+DPTR
30H
C:
0X001B
MOVR3,A
30H
C:
0X001C
SJMP$
(R2)=01H,(R3)=30H,电压为3时对应温度为0130H。
C:
0X001E
TAB:
DW0100H,0110H,0120H,0130H,0140H,0150H,0160H
END
实验九散转程序设计
一、实验目的
1.进一步熟悉MCS-51指令系统和汇编语言程序设计。
2.学会用三种不同的方法设计散转程序,并掌握它们的区别。
二、实验内容
设计并调试一个程序,其功能为根据(20H)的值i(i≤7)取相应的处理程序Pi的入口地址并转移到程序Pi,Pi的处理程序的功能为(Ri)+1→(Ri),[(20H)+1]^7(20H),再重复地根据(20H)散转。
参考程序框图如图3-9所示:
三、实验步骤
1.输入编好的程序,汇编成功;
2.调试程序,使用修改寄存器的方法,使R0—R7初值为0,然后启动系统,带断点运行,运行一个循环后检查运行结果,观察R0—R7是否依次计数,排除程序中错误,直至R0—R7同步计数为止。
四、实验报告要求
1.列出根据流程图编写的程序清单,写出程序执行的结果。
2.采用另外两种不同的方法编写程序,列出调试通过的程序清单。
五、参考程序清单
散转程序清单:
请将程序补充完整后运行。
ORG0000H
MOV20H,#00H
TB0:
MOVDPTR,#TABL
MOVA,20H
ADDA,20H
MOVF0,C
ADDA,DPL
MOVDPL,A
CLRA
ADDCA,#0DPH
MOVC,F0
ADDCA,#0
MOVDPH,A
MOVA,#00H
JMP@A+DPTR
TABL:
AJMPPR0
AJMPPR1
AJMPPR2
AJMPPR3
AJMPPR4
AJMPPR5
AJMPPR6
AJMPPR7
PR0:
INCR0
LJMPPR
PR1:
INCR1
LJMPPR
PR2:
INCR2
LJMPPR
PR3:
INCR3
LJMPPR
PR4:
INCR4
LJMPPR
PR5:
INCR5
LJMPPR
PR6:
INCR6
LJMPPR
PR7:
INCR7
PR:
MOVA,20H
INCA
ANLA,#07H
MOV20H,A
LJMPTB0
SJMP$
END
本程序为散转程序,当20H中为0时程序执行结果如下:
DPTR
PC指针ORG0000HD:
0XEO(A)D:
0X00(R0)D:
0X20(20H)DPHDPL
C:
0X0000MOV20H,#00H00H00H
C:
0X0003TB0:
MOVDPTR,#TABL001CH
C:
0X0006MOVA,20H00H
C:
0X0008ADDA,20H00H
C:
0X000AMOVF0,C
C:
0X000CADDA,DPL1CH001CH
C:
0X000EMOVDPL,A001CH
C:
0X0010CLRA
C:
0X0011ADDCA,#DPH001CH
C:
0X0013MOVC,F0
C:
0X0015ADDCA,#01CH
C:
0X0017MOVDPH,A001CH
C:
0X0019MOVA,#00H00H
C:
0X001BJMP@A+DPTR;跳到TABL
C:
0X001CTABL:
AJMPPR0;跳到PR0
AJMPPR1
AJMPPR2
AJMPPR3
AJMPPR4
AJMPPR5
AJMPPR6
AJMPPR7
C:
0X002CPR0:
INCR001H
C:
0X002DLJMPPR;跳到PR
PR1:
INCR1
LJMPPR
PR2:
INCR2
LJMPPR
PR3:
INCR3
LJMPPR
PR4:
INCR4
LJMPPR
PR5:
INCR5
LJMPPR
PR6:
INCR6
LJMPPR
PR7:
INCR7
C:
0X004CPR:
MOVA,20H00H
C:
0X004EINCA01H
C:
0X004FANLA,#07H01H
C:
0X0051MOV20H,A01H01H
C:
0X0053LJMPTB0;跳到TB0循环执行
SJMP$
END
循环7次后执行结果如下图:
另两种方法程序如下:
ORG0000H
MOV20H,#00H
TB0:
MOVDPTR,#TABL
MOVA,20H
ADDA,20H
JNCTB1
TB1:
JMP@A+DPTR
TABL:
AJMPPR0
AJMPPR1
AJMPPR2
AJMPPR3
AJMPPR4
AJMPPR5
AJMPPR6
AJMPPR7
PR0:
INCR0
LJMPPR
PR1:
INCR1
LJMPPR
PR2:
INCR2
LJMPPR
PR3:
INCR3
LJMPPR
PR4:
INCR4
LJMPPR
PR5:
INCR5
LJMPPR
PR6:
INCR6
LJMPPR
PR7:
INCR7
PR:
MOVA,20H
INCA
ANLA,#07H
MOV20H,A
LJMPTB0
SJMP$
END
ORG0000H
MOV20H,#00H
TB0:
MOVDPTR,#TABL
MOVCA,@A+DPTR
JMP@A+DPTR
TABL:
DBPR0-TABL
DBPR1-TABL
DBPR2-TABL
DBPR3-TABL
DBPR4-TABL
DBPR5-TABL
DBPR6-TABL
DBPR7-TABL
PR0:
INCR0
LJMPPR
PR1:
INCR1
LJMPPR
PR2:
INCR2
LJMPPR
PR3:
INCR3
LJMPPR
PR4:
INCR4
LJMPPR
PR5:
INCR5
LJMPPR
PR6:
INCR6
LJMPPR
PR7:
INCR7
PR:
MOVA,20H
INCA
ANLA,#07H
MOV20H,A
LJMPTB0
SJMP$
END
实验十子程序设计
一、实验目的
1.进一步熟悉MCS-51指令系统和汇编语言程序设计。
2.掌握子程序设计及参数传递的方法。
3.掌握子程序调用与返回时堆栈的变化与作用。
二、实验内容
1.根据参考流程框图2-7,使用工作寄存器或累加器来传递参数的方法把入口参数放到累加器A中,然后将累加器中的一个十六进制数的ASCⅡ字符转换为一位十六进制数存放于A。
2.用指针寄存器来传递参数,将(R0)和(R1)指出的内部RAM两个3字节无符号整数相加,结果送(R0)指出的内部RAM中,入口时,(R0)(R1)分别指向加数和被加数的低位字节,出口时(R0)指向结果的高位字节。
3.用堆栈传递参数,把一位十六进制数转化为ASCⅡ码子程序(主程序用PUSH指令,已把参数压入堆栈)。
参考程序框图如3-10图所示:
图3-10ASCII码字符转换为十六进制数流程图
四、实验报告要求
画出实验内容中2和3的程序流程图,并列出三个题目的主—子程序清单。
五、思考题
1、使不同种参数传递方法实现子程序调用的异同是什么?
答:
参数的传递方法有:
1,传递数据2,传递地址3,通过堆栈传递参数4,通过位地址传递参数。
1,通过寄存器或累加器传送,即在调用子程序之前把数据送入寄存器或者累加器,子程序执行以后,结果仍由寄存器或者累加器送回,或由直接地址单元送回;2,数据存放在数据存储器中,参数传递时只通过R0、R1、DPTR传递数据所在的单元地址,调用结束时,传送回来的也只是地址;3,在调用之前,要先把数据压入堆栈,子程序执行时按需要弹出,可弹到指定单元。
同时返回时要将SP指向对点地址等。
但不能将压入堆栈的断点地址传送出去。
2、ACALL和LCALL指令有什么区别?
使用时应注意什么?
答:
ACALLaddr11;(PC)←(PC)+2绝对调用指令为两字节指令,限在2KB地址范围内使用
7-0
;(SP)←(SP)+1,((SP))←(PC)
15-8
;(SP)←(SP)+1,((SP))←(PC)
10-0
;(PC)←addr11
LCALLaddr16;(PC)←(PC)+3长调用指令为三字节指令,可调用64KB范围内的子程序
7-0
;(SP)←(SP)+1,((SP))←(PC)
15-8
;(SP)←(SP)+1,((SP))←(PC)
;(PC)←addr16
注意调用范围是否在PC指针所在2KB内,超过则改为长调用指令。
3、RET指令的功能是什么?
答:
RET为子程序调用返回指令,当子程序执行结束时返回主程序。
六、参考程序清单
1.用累加器和工作寄存器传递参数子程序清单:
ASCH:
CLRC
SUBBA,#30H;入口参数放在ACC中
CJNEA,#10,$+3
JCAH10
SUBBA,#07H
A10:
RET
本程序为将累加器中的一个十六进制数的ASCⅡ字符转换为一位十六进制数存放于A。
完整程序及当(A)=45H时运行过程如下:
PC指针ORG0000HD:
0X00(A)
C:
0X0000MOVA,#45H45H
C:
0X0002ACALLASCH;执行子程序ASCH
C:
0X0004SJMP$
C:
0X0006ASCH:
CLRC
C:
0X0007SUBBA,#30H15H
C:
0X0009CJNEA,#10,$+3
JCA10
C:
0X000ESUBBA,#07H0EH
C:
0X0010A10:
RET
END
2.用指针寄存器来传递参数子
程序清单:
NADD:
MOVR7,#3;用R0、R1传递参数
CLRC
NADD1:
MOVA,@R0N
ADDCA,@R1
MOV@R0,A
DECR0
DECR1
DJNZR7,NADD1
INCR0
Y
RET
本程序为两个三字节无符号数相加,完整程序及两数为263A87H,5CD91EH时运行过程如下:
使用资源:
A,R0,R1,R7,内部RAM20H-22H,30H-32H.
用指针寄存器来传递参数流程图图
D:
0XE0(A)D:
0X00(R0)D:
0X01(R1)D:
0X22(22H)D:
0X32(32H)
PC指针ORG0000H87H1EH
C:
0X0000MAIN:
MOVR0,#22H22H
C:
0X0002MOVR1,#32H32H
C:
0X0004ACALLNADD;转向子程序
C:
0X0006SJMP$
C:
0X0008NADD:
MOVR7,#3
C:
0X000ACLRC
C:
0X000BNADD1:
MOVA,@R087H
3AH
26H
C:
0X000CADDCA,@R1A5H
13H
73H
C:
0X000DMOV@R0,AA5H
C:
0X000EDECR021H
20H
1FH
C:
0X000FDECR131H
30H
2FH
C:
0X0010DJNZR7,NADD1;判R7是否为0,不为0转向NDD1循环。
C:
0X0012INCR0;使R0指向高字节。
20H
C:
0X0013RET;返回主程序。
END
3.用堆传递参数子程序清单:
HASC:
MOVR0,SP
DECR0↓
DECR0
XCHA,@R0
ANLA,#0FH
ADDA,#2
MOVCA,@A+PC
XCHA,@R0
RET
DB‘0123456789’
用堆传递参数子程序流程图
DB‘ABCDEF’
END
本程序实现把一位十六进制数转化为ASCⅡ码,完整程序及当数为0AH时运行过程如下:
使用资源:
A,R0,30H设数存在30H中。
PC指针ORG0000HD:
0XE0(A)D:
0X00(R0)D:
0X30(30H)SP指针
C:
0X0000MAIN:
MOVSP,#5FH0AH5FH
C:
0X0002PUSH30H60H
C:
0X0004ACALLHASC;转向子程序62H
C:
0X0006POP30H41H
C:
0X0008SJMP$
C:
0X000AHASC:
MOVR0,SP62H
C:
0X000CDECR061H
C:
0X000DDECR060H
C:
0X000EXCHA,@R00AH
C:
0X000FANLA,#0FH0AH
C:
0X0011ADDA,#20CH
C:
0X0013MOVCA,@A+PC41H
C:
0X0014XCHA,@R000H
C:
0X0015RET;返回主程序
C:
0X0017DB‘0123456789’
DB‘ABCDEF’
END
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 河北工业大学 单片机实验 第四次试验 实验八 查表程序设计 河北 工业大学 单片机 实验 第四 试验 程序设计