2. 通过查表实现y=x2
x为0~9的十进制数,存放于寄存器R7,以BCD 码的形式保存,结果y以BCD码的形式存放于寄存器R6。
参考程序(A51\\2_4_2.ASM):
ORG 0000H LJMP MAIN ORG 0100H
MAIN: MOV DPTR,#SQR ;取表格首地址 MOV A,R7 ;要计算的值 MOVC A,@A+DPTR ;查表 MOV R6,A ;结果保存 SJMP MAIN
SQR: DB 00H,01H,04H,09H,16H ;平方表 DB 25H,36H,49H,64H,81H END
实验步骤:
1) 编写程序,经编译、链接无误后装载到实验系统; 2) 设置R7的值,如R7=09h;
3) 在SJMPMAIN语句行设置断点,然后运行程序;
4) 程序遇到断点后暂停,此时查看寄存器R6的值,应为81h; 5) 反复修改R7的值,验证程序的正确性。
四、实验心得
通过这次实验,我对查表程序的设计方法有了一个更加深刻的理解:查表程序常用于数据的补偿、修正、计算、转换等场合,具有程序简单、执行速度快等特点。同时,通过对查表指令“Movc A,@A+DPTR”和“Movc A,@A+PC”的运用,我对它们区别也有了体会:指令“MOVC A,@A+DPTR”完成把A中的内容作为一个无符号数与DPTR中的内容相加,所得结果为某一程序存储单元的地址,然后把该地址单元中的内容送到累加器A中。指令“MOVC A,@A+PC”以PC作为基址寄存器,PC的内容和A的内容作为无符号数,相加后所得的数作为某一程序存储单元的地址,然后把该地址单元中的内容送到累加器A中。
实验五 数据排序实验
一、实验目的
熟悉MCS-51指令系统,掌握数据排序程序的设计方法。
二、实验设备
PC计算机一台,Dais-52PRO+或Dais-PRO163C实验系统一套。
三、实验内容及步骤
在单片机片内RAM的30h~3Fh写入16个数,编写实验程序,将这16个数按照由小到大的顺序排列。
参考程序(A51\\2_5.ASM):
ORG 0000H LJMP MAIN ORG 0100H
MAIN: MOV R0,#30H ;数据起始地址 MOV R7,#16 ;排序数据个数 LP1: MOV A,R7 MOV R6,A MOV A,R0 MOV R1,A INC R1
LP2: MOV A,@R0 ;取出一个数据 CLR C
SUBB A,@R1 ;与第二个数进行比较
JC LP3 ;R0中的数小于R1中的数则跳转 MOV A,@R0 ;R0中的数大于R1中的数, 交换数据 XCH A,@R1 MOV @R0,A LP3: INC R1 DJNZ R6,LP2 INC R0 DJNZ R7,LP1 SJMP $ END
开始R0←数据起始地址R7←数据个数R1←R0+1R6←R7A←(R0)清进位标志否A>(R1)?是R0与R1所指单元中的数交换R1←R1+1否R6-1=0?是R0←R0+1否R7-1=0?是结束图2-5-1 程序流程图
实验步骤:
1) 编写程序,经编译、链接无误后装载到实验系统;
2) 待排序的数据存放于片内RAM的30h~3Fh单元,可在存储器窗口直接输入; 3) 在SJMP $语句行设置断点,然后运行程序; 4) 程序遇到断点后暂停,此时查看片内RAM的30h~3Fh单元数据,应从小到大排列; 5) 继续向片内RAM的30h~3Fh单元填入数据,重新运行程序,验证程序的正确性。
四、实验感想
在这次实验中,我顺利完成了实验的验证,实验的程序是通过冒泡法进行数据的排序,实验原理简单,程序也不复杂,程序使用条件转移指令实现了程序的循环,加深了我对条件转移指令的理解。
实验六 位操作实验
一、实验目的
掌握位指令的使用,学习位程序的设计方法。
二、实验设备
PC计算机一台,Dais-52PRO+或Dais-PRO163C实验系统一套。
三、实验内容及步骤
编写实验程序,计算Y = A⊕B,也可表示为Y = A?B+?AB。
MCS-51单片机内部有一个一位微处理器,借用进位标志Cy作为位累加器。位操作指令的操作对象是内部RAM的位寻址区,即字节地址为20h~2Fh单元中连续的128位(位地址为00h~7Fh),以及特殊功能寄存器中的可位寻址的位。
参考程序(A51\\2_6.ASM): 表2-6 异或真值表
QA EQU 00H QB EQU 01H QY EQU 04H ORG 0000H LJMP MAIN ORG 0100H
MAIN: MOV C,QA
ANL C,/QB ;C=QA(QB非) MOV QY,C MOV C,QA CPL C
ANL C,QB ;C=(QA非)QB
ORL C,QY ;C=QA(QB非)+(QA非)QB MOV QY,C
SJMP MAIN ;设置断点, 观察20H的值 END
A 0 0 1 1 B 0 1 0 1 Y 0 1 1 0 20H 00 12 11 03
实验步骤:
1) 编写程序,经编译、链接无误后装载到实验系统; 2) 修改片内RAM的20h单元的数据,如01h; 3) 在SJMP $语句行设置断点,然后运行程序;
4) 程序遇到断点后暂停,此时查看片内RAM的20h单元,应为11h; 继续修改片内RAM的20h单元的数据,重新运行程序,验证程序的正确性。
四、实验感想
这次实验程序比较简单,就是通过位运算实现两个数的异或,但是通过这次实验,我不但对51单片机的位寻址和位操作指令有了一个更深刻的认识,而且对51单片机内的位寻址区域也有了一个更深刻的印象,是一次受益匪浅的实验。