创新性实验结题报告简易计算器Word下载.docx
《创新性实验结题报告简易计算器Word下载.docx》由会员分享,可在线阅读,更多相关《创新性实验结题报告简易计算器Word下载.docx(22页珍藏版)》请在冰豆网上搜索。
采用2*8键盘;
利用2*8的键盘扫描子程序,读取输入的键值。
(二)、键盘接口电路
计算器输入数字和其他功能按键要用到很多按键,如果采用独立按键的方式,在这种情况下,编程会很简单,但是会占用大量的I/O口资源,因此在很多情况下都不采用这种方式,而是采用矩阵键盘的方案。
矩阵键盘采用两条I/O线作为行线,八条I/O线作为列线组成键盘,在行线和列线的每个交叉点上设置一个按键。
这样键盘上按键的个数就为2×
8个。
这种行列式键盘结构能有效地提高单片机系统中I/O口的利用率。
矩阵键盘的工作原理:
计算器的键盘布局如图2所示:
一般有16个键组成,在单片机中正好可以用一个P口和另一个P口的两个管脚实现16个按键功能,这种形式在单片机系统中也最常用。
矩阵键盘布局图:
矩阵键盘内部电路图如下图所示:
(三)、LED显示模块
本设计采用LED数码显示来显示输出数据。
通过D0-D7引脚向LED写指令字或写数据以使LED实现不同的功能或显示相应数据。
(四)运算模块(单片机控制)
MCS-51单片机是在一块芯片中集成了CPU、RAM、ROM、定时器/计数器和多功能I/O等一台计算机所需要的基本功能部件。
如果按功能划分,它由如下功能部件组成,即微处理器(CPU)、数据存储器(RAM)、程序存储器(ROM/EPROM)、并行I/O口、串行口、定时器/计数器、中断系统及特殊功能寄存器(SFR)。
单片机是靠程序运行的,并且可以修改。
通过不同的程序实现不同的功能,尤其是特殊的独特的一些功能,通过使用单片机编写的程序可以实现高智能,高效率,以及高可靠性!
因此我们采用单片机作为计算器的主要功能部件,可以很快地实现运算功能。
3、实验步骤
总流程图:
详细算术运算程序设计流程图:
五、实验结果与分析
1、实验现象、数据记录
经过反复测试调整,该计算器可简单进行100以内的加减乘除计算,以及清零功能,结果能保留小数点后一位,能显示计算结果的正负,完成了实验要求。
测试结果记录:
(1)加法运算:
64+37=
(2)减法运算:
12—86=
(3)乘法运算:
99*99=
(4)除法运算:
65/21=
2、对实验现象、数据及观察结果的分析与讨论:
该实验达到了实验的基本要求,但是需要改进和提高的还有很多,设计的计算器能进行100以内的加减乘除计算,以及清零功能,结果能保留小数点后一位,能显示计算结果的正负,但是只能进行两个操作数的操作,而不能进行连续计算,比如连加、连乘,并且不能进行有符号数的计算,即输入的两个操作数必须是正号的,也不能输入带小数点的操作数,对此,我会课下继续对它进行研究改进,争取做出具有更多功能的更先进的计算器。
3、关键点:
实验过程中由于对单片机的了解的不彻底,想法太简单遇到了很多的阻碍,开始只是简单的觉得只有显示和键盘这两个模块不了解,很难弄,其余的部分只是简单的加减乘除,几句简单程序就行,结果后来在四位数的显示上出了问题,跟本就不是简单的结果除以1000得出千位,于是又重新编制计算部分,后来在同学的帮助下做出了觉得很正确的程序,不过试验还是失败,最后从头重来,一步步研究,一步步计算,终于显示出了正确结果,该程序的逻辑性很强,每个细节都要考虑到,需要一遍遍测试显示结果,知道得出最终正确的答案。
六、实验结论
课程设计是培养学生综合运用所学知识,发现,提出,分析和解决实际问题,锻炼实践能力的重要环节,是对学生实际工作能力的具体训练和考察过程.随着科学技术发展的日新日异,单片机已经成为当今计算机应用中空前活跃的领域,在生活中可以说得是无处不在。
因此作为二十一世纪的大学来说掌握单片机的开发技术是十分重要的。
回顾起此次单片机课程设计,我仍感慨颇多,的确,从选题到定稿,从理论到实践,可以说得是苦多于甜,但是可以学到很多很多的的东西。
通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。
通过这次课程设计使我得到了一次用专业知识、专业技能分析和解决问题全面系统的锻炼。
使我们在单片机的基本原理、单片机应用系统开发过程,以及在常用编程设计思路技巧(特别是汇编语言)的掌握方面都能向前迈了一大步,为日后成为合格的应用型人才打下良好的基础。
七、指导老师评语及得分:
签名:
年月日
附件:
源程序
;
P0接位选,P1接段选
YSEQU20H;
第一个数十位
YGEQU21H;
第一个数个位
ERSEQU22H;
第二个数十位
EGEQU23H;
第二个数个位
YIEQU24H
EREQU25H
JFEQU26H;
结果负号位
JQEQU27H;
结果千位
JBAEQU28H;
结果百位
JSEQU29H;
结果十位
JGEQU30H;
结果个位
JXEQU31H;
结果小数位
JG1EQU32H
ORG0000H
MAIN:
MOV20H,#00H
MOV21H,#00H
MOV22H,#00H
MOV23H,#00H
MOV24H,#00H
MOV25H,#00H
MOV26H,#0C0H
MOV27H,#00H
MOV28H,#00H
MOV29H,#00H
MOV30H,#00H
MOV31H,#00H
MOV32H,#00H
ONE1:
CLRC
ACALLKEYSCAN
JBPSW.5,ONE1
CJNEA,#11,ONE11
SJMPMAIN
ONE11:
CJNEA,#10,ONE12
SJMPONE1
ONE12:
JNCONE1
MOV21H,A
ACALLDELAY
ONE2:
ACALLXS1
JBPSW.5,ONE2
CJNEA,#11,ONE22
ONE22:
CJNEA,#10,ONE23
SJMPONE2
ONE23:
JNCONE31
MOV20H,21H
ACALLDELAY
ONE3:
ACALLXS2
JBPSW.5,ONE3
CJNEA,#11,ONE33
ONE33:
CJNEA,#10,ONE30
SJMPONE3
ONE30:
JCONE3
ONE31:
MOVR5,A;
R5为符号位,表示加或减或乘或除
ONE4:
JBPSW.5,ONE4
CJNEA,#11,ONE44
ONE44:
CJNEA,#10,ONE45
SJMPONE4
ONE45:
JNCONE4
MOV23H,A
ONE5:
ACALLXS4
JBPSW.5,ONE5
CJNEA,#11,ONE55
LJMPMAIN
ONE55:
CJNEA,#10,ONE56
SJMPONE66
ONE56:
JNCONE5
MOV22H,23H
ONE6:
ACALLXS5
JBPSW.5,ONE6
CJNEA,#11,ONE66
ONE66:
CJNEA,#10,ONE6
ACALLGN
ONE61:
ACALLKEYSCAN
JBPSW.5,ONE60
ONE60:
ACALLXS3
SJMPONE61
*********************************************************************
KEYSCAN:
LCALLKAP;
扫描键子程序
JNZKP1
SETBPSW.5;
置无键标志
RET
KP1:
LCALLDELY;
去抖
LCALLKAP;
再次扫描键盘
JNZKP2;
转识键码程序
KP2:
CLRPSW.5;
置有键操作标志
MOVR0,#0FEH;
逐列扫描初始值
MOVR4,#00H;
0列加数
KP4:
MOVA,R0
MOVP0,A;
送列扫描信号
MOVA,P2;
回读行信号
JBACC.0,L1;
不是第一行,转第二行
MOVA,#00H;
是第一行,行吗=0
AJMPKP5
L1:
JBACC.1,L2;
不是第二行,转第三行
JBACC.1,NEXT
MOVA,#08H;
是第二行,行码=8
KP5:
ADDA,R4;
对应的行码+对应的列码=键码
PUSHACC;
保护已经得到的键码
KP3:
LCALLDELY
继续扫描
JNZKP3;
A值不等于0,表示手未松开!
POPACC;
A值等于0,手已经松开,弹回键码!
NEXT:
INCR4;
下一列列码加1
JNBACC.7,KEYSCAN;
列到最后列了吗?
RLA
MOVR0,A;
下一列
AJMPKP4;
扫描下一列
KAP:
MOVA,#00H;
全扫描字(列)
送全扫描字
回读行信息
CPLA
ANLA,#0FH;
得到A值,=0,无键;
≠0,有键
DELY:
MOVR6,#14H;
去抖!
DL:
MOVR7,#0FFH
DJNZR7,$
DJNZR6,DL
******************************************计算加减乘除
GN:
MOVA,20H
MOVB,#10
MULAB
ADDA,21H
MOV24H,A
************************得到第一个数
MOVA,22H
ADDA,23H
MOV25H,A
***************************得到第二个数
MOVA,R5
J0:
CJNEA,#12,J1
SJMPJIA
LJMPXS3
J1:
CJNEA,#13,J2
SJMPJIAN
J2:
CJNEA,#14,J3
SJMPCHENG
J3:
LJMPCHU
JIA:
MOVA,24H
ADDA,25H
MOVJG1,A
LJMPAAAA
RET
JIAN:
MOVA,24H
SUBBA,25H
JNCJIAN1
MOVJF,#0BFH
MOVA,#255
CLRC
SUBBA,32H
INCA
JIAN1:
RET
CHENG:
CLRC;
个位与个位相乘
MOVA,21H
MOVB,23H
DIVAB
MOVJG,B
MOVJS,A
;
*********
MOVA,20H;
十位与个位相乘
MOVJBA,A
MOVA,B
ADDCA,JS
CJNEA,#10,CH1
SJMPCH2
CH1:
JCCH3
CH2:
SUBBA,#10
MOVJS,A
MOVA,JBA
SJMPCH4
CH3:
******************************************
CH4:
MOVA,22H;
个位与十位相乘
MOVB,21H
ADDCA,JBA
CJNEA,#10,CH5
SJMPCH6
CH5:
JCCH7
CH6:
CLRC
SJMPCH8
CH7:
*******************
CH8:
十位与十位相乘
MOVB,22H
MOVJQ,A
CJNEA,#10,CH9
SJMPCH10
CH9:
JCCH11
CH10:
MOVJBA,A
MOVA,JQ
SJMPCH12
CH11:
MOVJBA,A
CH12:
CHU:
MOVB,25H
MOVA,B;
余数
MOVA,B
CJNEA,#5,CHU2
CHU1:
JNCCHU2
SJMPCHU3
CHU2:
INCA
CHU3:
MOVJX,A;
小数
SJMPAAAA
AAAA:
MOVA,JG1
MOVJG,B;
得到JG1个位
MOVJS,B;
得到JG1十位
MOVJBA,A;
得到JG1百位
XS1:
MOVP1,#0FFH;
共阳灭码
MOVP0,#20H
MOVDPTR,#TAB
MOVCA,@A+DPTR;
查出字形代码
MOVP1,A;
送个位
ACALLDELAY
XS2:
MOVA,20H;
显示输入的第一个数
MOVP0,#10H;
送位控信号
送十位
ACALLDELAY;
稳定显示信息
XS4:
MOVA,23H
XS5:
MOVA,22H;
显示输入的第二个数
MOVCA,@A+DPTR;
*********************************************************
XS3:
MOVP0,#01H;
MOVA,JF
送负号位
MOVP0,#02H
MOVA,JQ
送千位
MOVP0,#04H
MOVA,JBA
送百位
MOVP0,#08H
MOVA,JS
MOVP0,#10H
MOVA,JG
查出字码
ANLA,#7FH
共阳灭码
MOVP0,#20H
MOVA,JX
MOVDPTR,#TAB
MOVCA,@A+DPTR
MOVP1,A;
送小数位
TAB
DB0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,88H,83H,0C6H,0A1H,86H,8EH
DELAY:
MOVR6,#0FFH
END