您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 基于89c51的简易计算器的课程设计
-1-51单片机简易计算器设计目录一、设计任务和要求.................................21、设计要求......................................22、设计方案的确定.................................2二、硬件设计.......................................21、单片机最小系统...................................22、键盘电路的设计.................................33、显示电路的设计.................................34、系统硬件电路图.................................4三、软件设计.......................................51系统设计......................................52显示电路的设计.................................63、程序清单......................................8四、调试与仿真.....................................14五、试验箱实物图...................................14六、心得体会.......................................15-2-一、设计任务和要求1、设计要求利用单片机设计并制作简易计算器。具体要求如下:1、4*4按键用于0~9的数字输入、加减乘除、等于、清零功能;2、能实现简单的加减乘除运算;3、输入数字及计算结果通过LED或LCD显示器显示。2、设计方案的确定按照设计要求,本课题需要使用数码管显示和扩展4*4键盘,由于AT89C51芯片的I口不够多,而且为了硬件电路设计的简单化,故选择串行动态显示和用P1口扩展4*4键盘,扩展的4*4键盘定义十个数字键,六个功能键,使用串行动态显示显示运算结果。主程序进行初始化,采用行列扫描进行查表得出键值,每次按键后调用显示子程序。二、硬件设计简易数字计算器系统硬件设计主要包括:键盘电路,显示电路以及其他辅助电路。下面分别进行设计。1.单片机最小系统单片机最小系统就是支持主芯片正常工作的最小部分,包括主控芯片、复位电路和晶振电路。(1)、复位电路复位电路本设计采用上电与手动复位电路,电阻分别选取100和10K,电容选取10uF,系统一上电,芯片就复位,或者中途按按键也可以进行复位。-3-(2)、晶振电路图三晶振电路晶振电路是单片机的心脏,它用于产生单片机工作所需要的时钟信号。单片机的晶振选取11.0592MHz,晶振旁电容选取30pF。2.键盘电路的设计键盘可分为两类:编码键盘和非编码键盘。编码键盘是较多按键(20个以上)和专用驱动芯片的组合,当按下某个按键时,它能够处理按键抖动、连击等问题,直接输出按键的编码,无需系统软件干预。通用计算机使用的标准键盘就是编码键盘。当系统功能比较复杂,按键数量很多时,采用编码键盘可以简化软件设计。但大多数智能仪器和电子产品的按键数目都不太多(20个以内),为了降低成本和简化电路通常采用非编码键盘。非编码键盘的接口电路有设计者根据需要自行决定,按键信息通过接口软件来获取。本课题需要的是16个按键,故选择用非编码键盘。计算器输入数字和其他功能按键要用到很多按键,如果采用独立按键的方式,在这种情况下,编程会很简单,但是会占用大量的I/O口资源,因此在很多情况下都不采用这种方式,而是采用矩阵键盘的方案。矩阵键盘采用四条I/O线作为行线,四条I/O线作为列线组成键盘,在行线和列线的每个交叉点上设置一个按键。这样键盘上按键的个数就为4×4个。这种行列式键盘结构能有效地提高单片机系统中I/O口的利用率。矩阵键盘的工作原理:计算器的键盘布局如图五所示:一般有16个键组成,在单片机中正好可以用一个P口实现16个按键功能,这种形式在单片机系统中也最常用。具体电路连接如图所示:-4-4*4键盘接口电路3.显示电路的设计当系统需要显示少量数据时,采用LED数码管进行显示是一种经济实用的方法。数码管显示有静态显示和动态显示两种方法。为了减少端口的使用,故选择动态显示。电路如下图所示:4、系统硬件电路图总电路原理图-5-三、软件设计在十进制计算器的软件规划要求下,简易计算器的程序主要包括以下功能模块:(1)主模块,为系统的初始化。(2)显示与读键模块,分为判键程序段、运算操作子程序、显示子程序等部分;1.系统设计(一)系统模块图单片机运算模块显示模块输入模块图六系统模块图此系统包括输入、运算和显示模块,由单片机控制。其中通过输入键盘模块将数字0~9和运算符号“+”、“-”、“*”、“/”输入单片机进行运算;运算模块分别根据输入的运算符进行加减乘除运算;显示模块将运算后的数值通过动态扫描使之在数码管上输出。(二)系统总流程图主程序主要是用来进行初始化的,调用其他子程序,清空各个标志位,清空缓存区,读取键码,判断功能,在LED上作出回应,主程序流程图如图六所示。(1)数字送显示缓冲程序设计简易计算器所显示的数值最大位三位。要显示数值,先判断数值大小和位数,如果是超过三位或大于255,将不显示数字。可重新输入数字,再次计算。(2)运算程序的设计首先初始化参数,送LED三位显示“0”,其它位不显示。然后扫描键盘看是否有键输入,若有,读取键码。判断键码是数字键、清零键还是功能键,是数值键则送LED显示并保存数值,是清零键则做清零处理,是功能键则又判断是“=”还是运算键,若是“=”则计算最后结果并送LED显示,若是运算键则保存相对运算程序的首地址。-6-图七主程序流程图2、显示与按键设计初始化参数清零键LED显示输入数值读取键值状态清零数值送显示缓存开始按键输入?分析键值数字键等待数值输入结果送显示缓存保存结果和功能键根据上次功能键和输入的数据计算结果功能键否是是数字键是清零键是功能键-7-(一)LED显示程序设计LED显示器由七段发光二极管组成,排列成8字形状,因此也称为七段LED显示器。为了显示数字或符号,要为LED显示器提供代码,即字形代码。七段发光二极管,再加上一个小数点位,共计8段,因此提供的字形代码的长度正好是一个字节。简易计算器用到的数字0~9的共阳极字形代码如下表:显示字型gfedcba段码001111110c0h100001100f9h210110110a4h310011110b0h4110011099h5110110192h6111110182h700001110f8h8111111180h9110111190h表一共阳极数码管段码对照表(二)读键子程序设计为了实现键盘的数据输入功能和命令处理功能,每个键都有其处理子程序,为此每个键都对应一个码——键码。为了得到被按键的键码,现使用行扫描法识别按键。其程序框图如图八:读键程序使用的是反转法读键,不管键盘矩阵的规模大小,均进行两次读键。第一次所有列线均输出低电平,从所有读入键盘信息(行信息);第二次所有行线均输出低电平,从所有行线读入键盘信息(列信息)。将两次读键信息进行组合就可以得到按键的特征编码,然后通过查表得到按键的顺序编码。将各特征编码按希望的顺序排成一张表,然后用当前读得的特征码来查表。当表中有该特征码时,它的位置就是对应的顺序编码;当表中没有该特征码时,说明这是一个没有定义的键码,与没有按键(0FFH)同等看待。-8-图八计算键值子程序流程图3、程序清单YJEQU50H;结果存放YJ1EQU51H;中间结果存放GONGEQU52H;功能键存放ORG00HSTART:MOVR3,#0;初始化显示为空MOVGONG,#0MOV32H,#00HMOV33H,#00HMOV34H,#00HMLOOP:CALLDISP;调显示子程序WAIT:CALLTESTKEY;判断有无按键JZWAITCALLGETKEY;读键-9-INCR3;按键个数CJNEA,#0,NEXT1;判断是否数字键LJMPE1;转数字键处理NEXT1:CJNEA,#1,NEXT2LJMPE1NEXT2:CJNEA,#2,NEXT3LJMPE1NEXT3:CJNEA,#3,NEXT4LJMPE1NEXT4:CJNEA,#4,NEXT5LJMPE1NEXT5:CJNEA,#5,NEXT6LJMPE1NEXT6:CJNEA,#6,NEXT7LJMPE1NEXT7:CJNEA,#7,NEXT8LJMPE1NEXT8:CJNEA,#8,NEXT9LJMPE1NEXT9:CJNEA,#9,NEXT10LJMPE1NEXT10:CJNEA,#10,NEXT11;判断是否功能键LJMPE2;转功能键处理NEXT11:CJNEA,#11,NEXT12LJMPE2NEXT12:CJNEA,#12,NEXT13LJMPE2NEXT13:CJNEA,#13,NEXT14LJMPE2NEXT14:CJNEA,#14,NEXT15LJMPE2NEXT15:LJMPE3;判断是否清除键E1:CJNER3,#1,N1;判断第几次按键LJMPE11;为第一个数字N1:CJNER3,#2,N2LJMPE12;为第二个数字N2:CJNER3,#3,N3LJMPE13;为第三个数字N3:LJMPE3;第四个数字转溢出E11:MOVR4,A;输入值暂存R4MOV34H,A;输入值送显示缓存MOV33H,#00HMOV32H,#00HLJMPMLOOP;等待再次输入E12:MOVR7,A;个位数暂存R7MOVB,#10-10-MOVA,R4MULAB;十位数ADDA,R7MOVR4,A;输入值存R4MOV32H,#00H;输入值送显示缓存MOV33H,34HMOV34H,R7LJMPMLOOPE13:MOVR7,AMOVB,#10MOVA,R4MULABJBOV,E3;输入溢出ADDA,R7JBCY,E3;输入溢出MOVR4,AMOV32H,33H;输入值送显示缓存MOV33H,34HMOV34H,R7LJMPMLOOPE3:MOVR3,#0;按键次数清零MOVR4,#0;输入值清零MOVYJ,#0;计算结果清零MOVGONG,#0;功能键设为零MOV32H,#00H;显示清空MOV33H,#00HMOV34H,#00HLJMPMLOOPE2:MOV34H,#00HMOV33H,#00HMOV32H,#00HMOVR0,GONG;与上次功能键交换MOVGONG,AMOVA,R0CJNEA,#10,N21;判断功能键LJMPJIA;+N21:CJNEA,#11,N22LJMPJIAN;-N22:CJNEA,#12,N23LJMPCHENG;*N23:CJNEA,#13,N24LJMPCHU;/N24:CJNEA,#0,N25LJMPFIRST;首次按功能键N25:LJMPDEN;=-11-N4:LJMPE3FIRST:MOVYJ,R4;输入值送结果MOVR3,#0;按键次数清零LJMPDISP1;结果处理JIA:MOVA,YJ;上次结果送累加器ADDA,R4;上次结果加输入值JBCY,N4;溢出MOVYJ,A;存本次结果MOVR3,#0;按键次数清零LJMPDISP1JIAN:MOVA,YJSUBBA,R4;上次结果减输入值JBCY,N4;负数溢出MOVYJ,AMOVR3,#0LJMPDISP1CHENG:MOVA,YJMOVB,AMOVA,R4MULAB;上次结果乘输入值JBOV,N4;溢出MOVYJ,ALJMPDISP1CHU:MOVA,R4MOVB,AMOVA,YJDIVAB;上次结果除输入值MOVYJ,AMOVR3,#0LJMPDISP1DEN:MOVR3,#0LJMPDISP1DISP1:MOVB,#10MOVA,YJ;结果送累加器DIVAB;结果除1
本文标题:基于89c51的简易计算器的课程设计
链接地址:https://www.777doc.com/doc-4250622 .html