双字节BCD乘法单片机.docx
- 文档编号:28035957
- 上传时间:2023-07-07
- 格式:DOCX
- 页数:12
- 大小:50.53KB
双字节BCD乘法单片机.docx
《双字节BCD乘法单片机.docx》由会员分享,可在线阅读,更多相关《双字节BCD乘法单片机.docx(12页珍藏版)》请在冰豆网上搜索。
双字节BCD乘法单片机
MM大学
MMMMMMM学院
实验报告
课程名称单片机原理及其接口技术
实验名称双字节BCD码乘法及数据排序实验
实验类型设计型
姓名00学号00
日期00地点00
成绩教师00
评语:
一、实验目的
1.进一步熟悉51汇编指令,掌握汇编语言的设计和调试方法。
2.设计十进制乘法和程序,了解如何通过调用系统提供的内置数码显示,键盘输入子程序。
3.熟悉如何使用高效方法对数据排序。
二、实验内容
1.从键盘上输入4位被乘数、乘数,实现4位十进制的乘法,结果显示在数码管上。
其中键盘输入和数码显示可调用星研集成软件的内置函数实现,说明和参考实例见3.6节。
说明:
可分步走,先省略键盘输入和数码显示,直接设定被乘数和乘数进行乘法,在验证乘法功能正确之后,在增加键盘输入和数码显示的功能。
2.调试状态下借助星研集成软件直接修改片内RAM30H~3FH单元,数值任意,然后对其冒泡排序,检查排序结果。
三、实验仪器
STARES598PCI试验仪、PC机一台
四、实验原理图
A3区:
JP51的p1口---G6区:
LED
五、设计思路
1.双字节4位BCD码乘法
2.冒泡排序
六、实验程序
1.双字节4位BCD码乘法
EXTRNCODE(Display8,GetBCDKey)
BUFFER2DATA70H;8字节显示缓冲区
BUFFERDATA30H
BLOCKdata50H
RESULTDATA40H
F1BIT0D1H;PSW.1
ORG0000H
LJMPSTART
ORG0100H
START:
MOVSP,#60H
CLRF1;先清除显示,再接收键输入
START1:
MOVR0,#BUFFER
MOVA,#4;按键次数
LCALLGetBCDKey;得到双字节十进制数(乘数)
MOVR0,#BUFFER
ACALLBCD2B;转换成二进制数
MOVBLOCK,R3
MOVBLOCK+1,R4
SETBF1;接收到第一个键,才清除显示
MOVR0,#BUFFER
MOVA,#4;按键次数
LCALLGetBCDKey;得到双字节十进制数(减数)
MOVR0,#BUFFER
ACALLBCD2B
MOVBLOCK+2,R3
MOVBLOCK+3,R4
MOVR4,BLOCK;四个BCD入口参数
MOVR5,BLOCK+1
MOVR6,BLOCK+2
MOVR7,BLOCK+3
MOVR0,#RESULT
lCALLMLTY
MOVR3,RESULT
MOVR2,RESULT+1
MOVR1,RESULT+2
MOVR0,RESULT+3
ACALLB4toD4;字节二进制数转十进制数;R0R1R2R3为二进制数,R4R5R6R7为压缩BCD码
MOVA,R7
ANLA,#0FH
MOVBUFFER2,A
MOVA,R7
ANLA,#0F0H
SWAPA
MOVBUFFER2+1,A
MOVA,R6
ANLA,#0FH
MOVBUFFER2+2,A
MOVA,R6
ANLA,#0F0H
SWAPA
MOVBUFFER2+3,A
MOVA,R5
ANLA,#0FH
MOVBUFFER2+4,A
MOVA,R5
ANLA,#0F0H
SWAPA
MOVBUFFER2+5,A
MOVA,R4
ANLA,#0FH
MOVBUFFER2+6,A
MOVA,R4
ANLA,#0F0H
SWAPA
MOVBUFFER2+7,A
MOVR0,#BUFFER2
LCALLDisplay8
sjmp$
BCD2B:
MOVR1,#BUFFER
MOVR2,#2
S:
MOVA,@R1
PUSHACC
ANLA,#0FH
MOVR0,A
POPACC
JNBACC.4,NEXT1;分别判断4,5,6,7位是否为1,分别加上10,20,40,80
XCHA,R0
ADDA,#10
XCHA,R0
NEXT1:
JNBACC.5,NEXT2
XCHA,R0
ADDA,#20
XCHA,R0
NEXT2:
JNBACC.6,NEXT3
XCHA,R0
ADDA,#40
XCHA,R0
NEXT3:
JNBACC.7,NEXT4
XCHA,R0
ADDA,#80
XCHA,R0
NEXT4:
MOVA,R0
PUSHACC
INCR1
DJNZR2,S
POPACC
MOVR0,A
POPACC
MOVB,#100;高2位(千位、百位)乘以100
MULAB
ADDA,R0
MOVR3,A;转换成的二进制数放在R4R3中
MOVA,B
ADDCA,#0
MOVR4,A
RET
;字节二进制数转十进制数
;R0R1R2R3为二进制数,R4R5R6R7为压缩BCD码
;;;;;;;;该子程序也可以模仿书上(胡汉才)例4.22,采用除以10、其余数为个位数字,其商继续除以10得十位数字,依次类推
B4toD4:
CLRA
MOVR4,A
MOVR5,A
MOVR6,A
MOVR7,A
MOVB,#32
LOOP:
CLRC
MOVA,R3
RLCA
MOVR3,A
MOVA,R2
RLCA
MOVR2,A
MOVA,R1
RLCA
MOVR1,A
MOVA,R0
RLCA
MOVR0,A
MOVA,R7;算法举例:
例如数据为00100100(36),则过程为
ADDCA,R7;AR7
DAA;00
MOVR7,A;00
MOVA,R6;11
ADDCA,R6;22
DAA;44
MOVR6,A;99
MOVA,R5;1818
ADDCA,R5;3636
DAA
MOVR5,A
MOVA,R4
ADDCA,R4
DAA
MOVR4,A
DJNZB,LOOP
RET
MLTY:
MOVA,R6
MOVB,R4
MULAB
MOV@R0,A
MOVR3,B
MOVA,R7
MOVB,R4
MULAB
ADDA,R3
MOVR3,A
MOVA,B
ADDCA,#00H
MOVR2,A
MOVA,R6
MOVB,R5
MULAB
ADDA,R3
INCR0
MOV@R0,A
MOVA,R2
ADDCA,B
MOVR2,A
MOVR1,#00H
JNCNXT1
INCR1
NXT1:
MOVA,R7
MOVB,R5
MULAB
ADDA,R2
INCR0
MOV@R0,A
MOVA,B
ADDCA,R1
INCR0
MOV@R0,A
RET
end
2.冒泡排序
SIZEEQU8;数据个数
ARRAYEQU30H;数据起始地址
CHANGEEQU0;交换标志
SORT:
MOVR0,#ARRAY
MOVR7,#SIZE-1
CLRCHANGE
GOON:
MOVA,@R0
MOVR2,A
INCR0
MOVB,@R0
CJNEA,B,NOTEQUAL
SJMPNEXT
NOTEQUAL:
JCNEXT;前小后大,不交换
SETBCHANGE;;前大后小,置交换标志
XCHA,@R0;交换
DECR0
XCHA,@R0
INCR0
NEXT:
DJNZR7,GOON
JBCHANGE,SORT
SJMP$
END
八、实验小结
1、感觉这次实验还是有难度的,BCD码转化二进制,以及二进制转化BCD码算法,还无法融会贯通。
2、这个乘法思路很有条理性,从键盘输入然后转化,后经过参数赋值传递调用乘法子程序,运行结果再经过转化,后调用内置函数显示出来,这样使程序相当于模块化,易懂明了。
3、开始时,程序运行没有显示结果出来,后经过检查是调用内置显示函数时,参数的传递不正确,只要对Buffer赋值完,再调用一次就可以,一开始认为是调用一次显示函数就显示一个数字。
4、内置函数的调用改完,运行的结果还是有错,最后经过检查是乘法子程序执行后的值,哪些是高8位,哪些是低8位,搞错了导致显示结果的错误。
5、冒泡排序程序,在C语言,汇编语言中都学过,思路都了解,利用单片机的语法写也就没什么大问题,实现了排序后还是有点小成就的。
欢迎您的下载,资料仅供参考!
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 字节 BCD 乘法 单片机
![提示](https://static.bdocx.com/images/bang_tan.gif)