2013 - 2014 学年_一_学期山东科技大学电工电子实验教学中心创新性实验研究报告实验项目名称__基于51单片机的简易计算器设计_2013 年12 月27 日四、实验内容2、实验内容(一)、总体硬件设计本设计选用AT89C52单片机为主控单元。
显示部分:采用六位LED动态数码管显示。
按键部分:采用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)。
单片机是靠程序运行的,并且可以修改。
通过不同的程序实现不同的功能,尤其是特殊的独特的一些功能,通过使用单片机编写的程序可以实现高智能,高效率,以及高可靠性!因此我们采用单片机作为计算器的主要功能部件,可以很快地实现运算功能。
详细算术运算程序设计流程图:五、实验结果与分析1、实验现象、数据记录经过反复测试调整,该计算器可简单进行100以内的加减乘除计算,以及清零功能,结果能保留小数点后一位,能显示计算结果的正负,完成了实验要求。
测试结果记录:加法运算:15+23=38减法运算:65-22=43乘法运算:12*51=612除法运算:99/23=4.32、对实验现象、数据及观察结果的分析与讨论:该实验达到了实验的基本要求,但是需要改进和提高的还有很多,设计的计算器能进行100以内的加减乘除计算,以及清零功能,结果能保留小数点后一位,能显示计算结果的正负,但是只能进行两个操作数的操作,而不能进行连续计算,比如连加、连乘,并且不能进行有符号数的计算,即输入的两个操作数必须是正号的,也不能输入带小数点的操作数,对此,我会课下继续对它进行研究改进,争取做出具有更多功能的更先进的计算器。
六、实验结论七、指导老师评语及得分:附件:源程序等。
YS EQU 20H ;第一个数十位YG EQU 21H ;第一个数个位ERS EQU 22H ;第二个数十位EG EQU 23H ;第二个数个位YI EQU 24HER EQU 25H JF EQU 26H ;结果负号位JQ EQU 27H ;结果千位JBA EQU 28H ;结果百位JS EQU 29H ;结果十位JG EQU 30H ;结果个位JX EQU 31H ;结果小数位JG1 EQU 32HORG 0000HMAIN: MOV 20H,#00HMOV 21H,#00HMOV 22H,#00HMOV 23H,#00HMOV 24H,#00HMOV 25H,#00HMOV 26H,#0C0HMOV 27H,#00HMOV 28H,#00HMOV 29H,#00HMOV 30H,#00HMOV 31H,#00HMOV 32H,#00H ONE1: CLR CACALL KEYSCANJB PSW.5,ONE1CJNE A,#11,ONE11SJMP MAINONE11:CJNE A,#10,ONE12 SJMP ONE1ONE12:JNC ONE1MOV 21H,AACALL DELAY ONE2: ACALL XS1ACALL KEYSCANJB PSW.5,ONE2CJNE A,#11,ONE22SJMP MAINONE22:CJNE A,#10,ONE23 SJMP ONE2ONE23:JNC ONE31MOV 20H,21HMOV 21H,AACALL DELAYONE3: ACALL XS2ACALL KEYSCANJB PSW.5,ONE3CJNE A,#11,ONE33SJMP MAINONE33:CJNE A,#10,ONE30 ACALL DELAYACALL XS1SJMP ONE3ONE30:JC ONE3ONE31: MOV R5,A ;R5为符号位,表示加或减或乘或除ONE4: ACALL XS2ACALL KEYSCANJB PSW.5,ONE4CJNE A,#11,ONE44SJMP MAINONE44:CJNE A,#10,ONE45SJMP ONE4ONE45:JNC ONE4MOV 23H,AACALL DELAYONE5: ACALL XS4ACALL KEYSCANJB PSW.5,ONE5CJNE A,#11,ONE55LJMP MAINONE55:CJNE A,#10,ONE56SJMP ONE66ONE56:JNC ONE5MOV 22H,23HMOV 23H,AACALL DELAYONE6: ACALL XS5ACALL KEYSCANJB PSW.5,ONE6CJNE A,#11,ONE66LJMP MAINONE66:CJNE A,#10,ONE6ACALL GNONE61:ACALL KEYSCANJB PSW.5,ONE60LJMP MAINONE60:ACALL XS3SJMP ONE61KEYSCAN:LCALL KAP ;扫描键子程序JNZ KP1SETB PSW.5 ;置无键标志RETKP1:LCALL DEL Y ;去抖LCALL KAP ;再次扫描键盘JNZ KP2 ;转识键码程序SETB PSW.5 ;置无键标志RETKP2:CLR PSW.5 ;置有键操作标志MOV R0,#0FEH ;逐列扫描初始值MOV R4,#00H ;0列加数KP4:MOV A,R0MOV P0,A ;送列扫描信号MOV A,P2 ;回读行信号JB ACC.0,L1 ;不是第一行,转第二行MOV A,#00H ;是第一行,行吗=0AJMP KP5L1:JB ACC.1,NEXT ;不是第二行,转下一列MOV A,#08H ;是第二行,行码=8AJMP KP5KP5:ADD A,R4;对应的行码+对应的列码=键码PUSH ACC ;保护已经得到的键码KP3:LCALL DEL YLCALL KAP ;继续扫描JNZ KP3 ;A值不等于0,表示手未松开!POP ACC ;A值等于0,手已经松开,弹回键码!RETNEXT:INC R4 ;下一列列码加1MOV A,R0JNB ACC.7,KEYSCAN ;列到最后列了吗?RL AMOV R0,A ;下一列AJMP KP4 ;扫描下一列KAP:MOV A,#00H ;全扫描字(列)MOV P0,A ;送全扫描字MOV A,P2 ;回读行信息CPL AANL A,#0FH ;得到A值,=0,无键;≠0,有键RETDELY:MOV R6,#14H ;去抖!DL:MOV R7,#0FFHDJNZ R7,$DJNZ R6,DLRET;***************************************** *计算加减乘除GN: MOV A,20HMOV B,#10MUL ABADD A,21HMOV 24H,A;************************得到第一个数MOV A,22HMOV B,#10MUL ABADD A,23HMOV 25H,A;************************得到第二个数MOV A,R5J0: CJNE A,#12,J1SJMP JIALJMP XS3RETJ1: CJNE A,#13,J2SJMP JIANLJMP XS3RETJ2: CJNE A,#14,J3SJMP CHENGLJMP XS3RETJ3: LJMP CHULJMP XS3RETJIA: MOV A,24HADD A,25HMOV JG1,ALJMP AAAARETJIAN:MOV A,24HCLR CSUBB A,25HMOV JG1,AJNC JIAN1MOV JF,#0BFHMOV A,#255CLR CSUBB A,32HINC AMOV JG1,AJIAN1: LJMP AAAARETCHENG:CLR C ;个位与个位相乘MOV A,21HMOV B,23HMUL ABMOV B,#10DIV ABMOV JG,BMOV JS,AMOV A,20H ;十位与个位相乘MOV B,23HMUL ABMOV B,#10DIV ABMOV JBA,AMOV A,BADDC A,JSCJNE A,#10,CH1SJMP CH2CH1: JC CH3CH2: CLR CSUBB A,#10MOV JS,AMOV A,JBAINC AMOV JBA,ASJMP CH4CH3: MOV JS,ACH4: MOV A,22H ;个位与十位相乘MOV B,21HMUL ABMOV B,#10DIV ABADDC A,JBAMOV JBA,AMOV A,BADDC A,JSCJNE A,#10,CH5SJMP CH6CH5:JC CH7 CH6:CLR CSUBB A,#10MOV JS,AMOV A,JBAINC AMOV JBA,ASJMP CH8CH7: MOV JS,ACH8: MOV A,20H ;十位与十位相乘MOV B,22HMUL ABMOV B,#10DIV ABMOV JQ,AMOV A,BADDC A,JBACJNE A,#10,CH9SJMP CH10CH9: JC CH11CH10:CLR CSUBB A,#10MOV JBA,AMOV A,JQINC AMOV JQ,ASJMP CH12CH11:MOV JBA,ACH12:RETCHU: MOV A,24HMOV B,25HDIV ABMOV JG1,AMOV A,B ;余数MOV B,#10MUL ABMOV B,25HDIV ABMOV JX,A ;小数SJMP AAAARETAAAA:MOV A,JG1MOV B,#10DIV ABMOV JG,B ;得到JG1个位MOV B,#10DIV ABMOV JS,B ;得到JG1十位MOV JBA ,A ;得到JG1百位RET;***********************************XS1: MOV A,21HMOV P1,#0FFH ;共阳灭码MOV P0,#20HMOV DPTR,#TABMOVC A,@A+DPTR ;查出字形代码MOV P1,A ;送个位ACALL DELAYRETXS2: MOV A,20H ;显示输入的第一个数MOV P1,#0FFH ;共阳灭码MOV P0,#10H ;送位控信号MOV DPTR,#TABMOVC A,@A+DPTR ;查出字形代码MOV P1,A ;送十位ACALL DELAY ;稳定显示信息MOV A,21HMOV P1,#0FFH ;共阳灭码MOV P0,#20HMOV DPTR,#TABMOVC A,@A+DPTR ;查出字形代码MOV P1,A ;送个位ACALL DELAYRETXS4: MOV A,23HMOV P1,#0FFH ;共阳灭码MOV P0,#20HMOV DPTR,#TABMOVC A,@A+DPTR ;查出字形代码MOV P1,A ;送个位ACALL DELAYRETXS5: MOV A,22H;显示输入的第二个数MOV P1,#0FFH ;共阳灭码MOV P0,#10H ;送位控信号MOV DPTR,#TABMOVC A,@A+DPTR;查出字形代码MOV P1,A ;送十位ACALL DELAY ;稳定显示信息MOV A,23HMOV P1,#0FFH ;共阳灭码MOV P0,#20HMOV DPTR,#TABMOVC A,@A+DPTR;查出字形代码MOV P1,A ;送个位ACALL DELAYRET;**********************************XS3: MOV P1,#0FFH ;共阳灭码MOV P0,#01H ;送位控信号MOV A,JFMOV P1,A ;送负号位ACALL DELAY ;稳定显示信息MOV P1,#0FFH ;共阳灭码MOV P0,#02HMOV A,JQMOV DPTR,#TABMOVC A,@A+DPTR ;查出字形代码MOV P1,A ;送千位ACALL DELAY ;稳定显示信息MOV P1,#0FFH ;共阳灭码MOV P0,#04HMOV A,JBAMOV DPTR,#TABMOVC A,@A+DPTR ;查出字形代码MOV P1,A ;送百位ACALL DELAY ;稳定显示信息MOV P1,#0FFH ;共阳灭码MOV P0,#08HMOV A,JSMOV DPTR,#TABMOVC A,@A+DPTR ;查出字形代码MOV P1,A ;送十位ACALL DELAY ;稳定显示信息MOV P1,#0FFH ;共阳灭码MOV P0,#10HMOV A,JGMOV DPTR,#TABMOVC A,@A+DPTR ;查出字码ANL A,#7FHMOV P1,A ;送个位ACALL DELAY ;稳定显示信息MOV P1,#0FFH ;共阳灭码MOV P0,#20HMOV A,JXMOV DPTR,#TABMOVC A,@A+DPTRMOV P1,A ;送小数位ACALL DELAYRETTAB:DB0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H ,90H,88H,83H,0C6H,0A1H,86H,8EH DELAY: MOV R6,#0FFHDJNZ R7,$RETEND。