2022年基于51单片机的多功能计算器设计课程设计.docx
精品学习资源微机原理课程设计设计课题基于 51 单片机地运算器设计学院姓名学号专业班级指导老师设计时间南华高校欢迎下载精品学习资源【摘要】 当今社会,随着人们物质生活地不断提高,电子产品已经走进了家家户户, 无论是生活或学习,仍是消遣和消遣几乎样样都离不开电子产品,大型复杂地运算才能是人脑所不能胜任地,而且人脑比较简洁出错.运算器作为一种快速通用地运算工具便利了用户地使用 .运算器可谓是我们最亲热地电子伙伴之一.本设计着重在于分析运算器设计开发过程中地环节和步骤,并从实践体会动身对运算器设计做了具体地分析和讨论.本设计是以 STC89C52 单片机为核心地运算器模拟系统设计,输入采纳4×4 矩阵键盘再加上 4 个独立按键,可以进行加、减、乘、除7 位带符号数字运算,同时支持括号地嵌套使用级浮点数地运算,并在LCD1602 上显示操作过程 .本次设计留意设计方法及流程,第一依据原理设计电路,利用keil 编程,借助试验开发平台进行仿真试验,进而利用altium designer 制作 PCB ,最终到焊接元器件,直至调试胜利 .在设计地同时,特殊留意keil 软件和 altium designer 软件地使用方法和技巧以及常用地 LCD 显示器和矩阵键盘地设计和使用方法.【关键词】 运算器, STC89C52 ,矩阵键盘, 1602 液晶欢迎下载精品学习资源目录1 系统方案设计 . - 5 -1.1 设计目地及要求 . - 5 -1.1.1 设计目地 . - 5 -1.1.2 设计要求 . - 5 -1.2 方案论证及挑选 . - 5 -1.2.1 方案一 采纳 FPGA 掌握 . - 6 -1.2.2 方案二 采纳 STC89C52. - 6 -1.2.3 方案比较及挑选 . - 6 -2 单元电路设计 . - 7 -2.1 工作原理 . - 7 -2.2 硬件电路设计 . - 8 -2.2.1 单片机电路设计 . - 8 -2.2.2 键盘模块电路 . - 9 -2.2.3 蜂鸣器提示电路 . - 9 -2.2.4 液晶显示电路 . - 10 -2.3 软件设计 . - 11 -2.3.1 键盘扫描 . - 11 -2.3.2 表达式地处理 . - 11 -2.4 altium designer 原理图设计及PCB 制作 . - 13 -2.4.1 原理图设计 . - 13 -2.4.2 PCB 制作 . - 14 -2.4.3设计结果 . - 15 -3 系统测试 . - 16 -3.1 整数运算 . - 16 -欢迎下载精品学习资源3.2 浮点数运算 . - 17 -3.3 输入出错地情形 . - 17 -4 结论与心得体会 . - 19 -5 参考文献 . - 20 -附录 1 元器件清单 . - 21 -附录 2 程序清单 . - 22 -欢迎下载精品学习资源1 系统方案设计1.1 设计目地及要求1.1.1 设计目地通过本次课题设计,应用单片机应用基础、数据结构等所学相关学问及查阅资料,完成有用运算器地设计,以达到理论与实践更好地结合、进一步提高综合运用所学学问和设计地才能地目地 .通过本次设计地训练,可以使我在基本思路和基本方法上对基于 MCS-51 单片机地嵌入式系统设计有一个比较感性地熟悉,并具备肯定程度地设计才能 .1.1.2 设计要求在本次课程设计中,主要完成如下方面地设计要求:1、把握 MCS-51系列某种产品(例如8051)地最小电路及外围扩展电路地设计方法;2、运算器能实现基本地加、减、乘、除四就运算;3、支持浮点数运算;4、支持括号运算,答应括号地多层正确嵌套;5、较为友好地界面显示,对输入实时显示,对运算结果输出显示;6、能够具备比较完善地报错系统1.2 方案论证及挑选基于设计要求,笨设计考虑了两种设计方案,他们均可以实现运算器地功能,但基于设计目地及微掌握器地广泛运用,比较两种方案地优劣,最终挑选基于51 单片机地运算器设计 .欢迎下载精品学习资源1.2.1 方案一 采纳 FPGA 掌握FPGA 是一种高密度地可编程规律器件 ,自从 Xilinx 公司 1985 年推出第一片 FPGA 以来,FPGA 地集成密度和性能提高很快 , 其集成密度最高达 500 万门 / 片以上 , 系统性能可达200MHz. 由于 FPGA 器件集成度高 ,便利易用 ,开发和上市周期短 ,在数字设计和电子生产中得到快速普及和应用 ,并一度在高密度地可编程规律器件领域中独占鳌头 .但是而基于 SRAM 编程地 FPGA, 其编程信息需存放在外部储备器上 ,需外部储备器芯片 ,且使用方法复杂 ,保密性差,而其对于一个简洁地运算器而言,有用 FPGA 有点大材小用,成本太高 .1.2.2 方案二 采纳 STC89C52单片机是单片微型机地简称,故又称为微掌握器 MCU ( Micro Control Unit ) .通常由单块集成电路芯片组成,内部包含有运算机地基本功能部件:中心处理器 CPU ,储备器和I/O 接口电路等 .因此,单片机只要和适当地软件及外部设备相结合,便可成为一个单片机掌握系统 .单片机广泛用于智能产品,智能外表,测控技术,智能接口等,具有操作简洁,有用便利,价格廉价等优点,而其中 AT89S52 以 MCS-51 为内核,是单片机中最典型地代表,应用于各种掌握领域 .1.2.3 方案比较及挑选通过以上两种方案论证和比较,从设计地有用性,便利性和成本动身,挑选了以STC89C52 单片机作为中心处理单元进行运算器地设计,这样设计能够实现对六位浮点数地加减和三位浮点数地乘除运算.欢迎下载精品学习资源2 单元电路设计2.1 工作原理利用矩阵键盘进行按键地输入,通过对矩阵键盘地扫描,猎取用户地输入,并实时地显示在1602 液晶上,每次猎取到输入时,依据软件设计地相应方法对输入进行处理、运算,输入终止后(以 “=“为标志),将最终地运算结果输出地液晶上.系统组成及整体框图如图2.1 所示 .LCD液晶显示屏模块STC89C52主掌握模块( 处 理 、 运键盘模块电源算)图 2.1 系统组成及总体框图欢迎下载精品学习资源2.2 硬件电路设计2.2.1 单片机电路设计为使单片机正常工作,除电源供电部格外,仍需供应晶振电路和复位电路.具体电路如下:图 2.2 单片机工作电路由图 2.2 可知, 9 脚外接地是按键复位电路,18,19 脚外接地是晶振电路,这样,就构成了单片机正常工作地必备电路.同时,为使 P0 口正常工作,并增加其带负载才能,P0 口需接了上拉电阻 .图中 EA 为外部拜访答应,欲使CPU 仅拜访外部程序储备器(地址为0000H-FFFFH ), EA 端必需保持低电平(接地).在这里, STC89C52 单片机 8k 地程序储备器已经够本设计使用,无需外部程序储存器,故EA 直接接高电平 .欢迎下载精品学习资源2.2.2 键盘模块电路图 2.3 是键盘电路,共20 个按键,用来实现人机交互和运算表达式地输入,S0S3、S5S8、S10S13、S15S18 共 16 个按键组成一组4*4 地矩阵键盘,行线第一行到第四行分别接在 P3.0P3.3 口,列线第一列到第四列分别接在P3.4P3.7 口,这样 P3 口就完成了对4*4地矩阵键盘地接线. 同时,留意到按键数量仍达不到要求,故增加了四个独立按键S4,S9,S14,S19.他们依次接在 P20P23 口.可见,矩阵键盘相对来讲更节约I/O 口,但本着学习地目地,加之本设计并不需要太多地I/O 口,故为充分学习和利用资源,在这里也设计了 4 个这样地独立按键 .图 2.3 键盘模块电路2.2.3 蜂鸣器提示电路蜂鸣器主要用于按键时发出声音,提示当前地按键操作,电路如图 2.5 所示,三极管主要用于驱动蜂鸣器,由于单片机 I/O 地驱动才能有限 .同时单片机 I/O 口仍在这里仍起到开关作用,为 0时打开蜂鸣器通道,使蜂鸣器发声 .欢迎下载精品学习资源图 2.4 蜂鸣器提示电路2.2.4 液晶显示电路LCD 也是本次设计地重要组成部分之一,主要用于显示输入和输出.电路如图2.5 所示, LCD 数据端与单片机 P0 口相连,掌握端与P24P26 连接,电位器用于调剂对比度.图 2.5 LCD 显示电路至此,整个电容测量仪地硬件设计部分就基本设计完成,接下来,需要地就是与之相匹配地软件支持了 .欢迎下载精品学习资源2.3 软件设计软件编程平台挑选最常用地 keil 软件 .由于该程序并未涉及究竟层地驱动问题,因此选择便利快捷地 C 语言编程 .在编程中,将该程序分为四个模块:延时模块、 1602 显示模块、用于处理运算表达式地对战模块及主函数模块 .采纳模块化设计,便利调试与懂得 .具体程序见附录二 .在这里重点介绍软件核心地表达式处理程序算法 .2.3.1 键盘扫描独立键盘很好实现,只需不停地检测即可,显现低电平即显现按键,在经过肯定地延时消抖,再确认判定即可.矩阵键盘扫描程序,第一读出 P3 地低四位,然后读出 P3 口地高四位 .然后确定键值并显示缓存,最终将按键地值通过一个预先定义好地数组转换为相应地ASCII 码值送给 LCD显示和与表达式相应地堆栈进行处理,读键程序使用地是反转法读键,不管键盘矩阵地规模大小,均进行两次读键.第一次全部行线均输出高电平,从P3 口地值读入键盘信息(行信息);其次次全部列线均输出高电平,从P3 口地值读入键盘信息(列信息).2.3.2 表达式地处理表达式包含加、减、乘、除、括号等,必需依据相应地优先级运算,才可能得出正确地结果 .在这儿采纳栈结构,可以有效地进行表达式地处理.栈结构具有 “后进先出 ”地固有属性,借助这个属性我们可以随时对刚输入地元素进行操作,从而实现边输入边运算.为了实现算符优先算法.可以使用两个工作栈 .一个称为 OPTR,用以寄存运算符,另一个称做 OPND ,用以寄存操作数或运算结果.1. 第一置操作数栈为空栈,表达式起始符” #为”运算符栈地栈底元素;2. 依次读入表达式,如是操作符即进OPND 栈,如是运算符就和OPTR 栈地栈顶运算符比较优先权后作相应地操作,直至整个表达式求值完毕(即OPTR 栈地栈顶元素和当前读入地字符均为 ”#”).欢迎下载精品学习资源在这里,相应地处理指地是,假如当前符号地优先级比栈顶优先级低,就将该符号连续压入堆栈,不做其它操作;假如当前符号地优先级比栈顶优先级高,就依次取出操作数栈地栈顶两个数据和符号栈地栈顶符号进行这两个数地运算,运算结果数据再压入操作数栈中 .如优先级相等,就弹出符号栈栈顶符号 .算符间地优先关系如下( #表示开头和结束):+-*/#+><<<<>>->><<<>>*>>>><>>/>>>><>><<<<<=>>>>>>#<<<<<=表 2.1 运算符优先级表欢迎下载精品学习资源2.4 altium designer原理图设计及PCB 制作2.4.1 原理图设计图 2.6 原理图设计( 1) 单片机部分图 2.7 原理图设计 2 键盘、蜂鸣器部分欢迎下载精品学习资源2.4.2 PCB 制作图 2.8 PCB 设计( 1) 单片机部分图 2.9 原理图设计( 2) 键盘、蜂鸣器部分注:在此并没有布双层板,红色地线仅仅只是为了标志出跳线或者本质上实物已经连接上了 .欢迎下载精品学习资源2.4.3 设计结果图 2.10设计结果实物图如下列图,各个按键功能如图中文字说明,电源为5V 直流电源 .欢迎下载精品学习资源3 系统测试测试主要测试其运算是否正确,及检错才能.3.1 整数运算在此以整数运算为例,介绍运算器地使用方法即流程.第一打开电源,看到LCD 打开显示,说明运行正常,接着,输入表达式:12* ( 56+23 ) *2 ,其结果本身应为1896.输入终止后,点 “=”按键,即可在其次行显示出运算结果,由图可见运算完全正确.在使用时,可以通过声音开关按钮掌握按键音地打开和关闭,在LCD 上也有显示,假如再其次行第一个位置没有显示,就没有打开声音,可以通过按钮打开.如有显示,就声音已经打 开,可以通过按钮关闭声音.如图 3.1 所示,此时已经打开声音.图 3.1 整数运算欢迎下载精品学习资源3.2 浮点数运算图 3.2 浮点数运算由图可以看出,可以进行浮点数运算,仍可以从其次行第一个字符,蜂鸣器处于关闭状态 .3.3 输入出错地情形输入一个错误地表达式,如图3.3 所示 .欢迎下载精品学习资源图 3.3 输入错误地情形下再按 “=”号,将会显现出错画面 .如图 3.4 所示 .图 3.4 输入错误地显示由以上测试可知,整个设计运行正常,能够正确地进行运算和出错提示.由此可得,整个设计是胜利地 .欢迎下载精品学习资源4 结论与心得体会总之,通过一系列仿真和设计,基于单片机地运算器设计仍是比较胜利地做出来了.一路下来仍是比较坎坷,从原理到实物,从调试到调试胜利,遇到了许多问题,特殊是在软件编程时,开头以为既然单片机具有数据处理与运算地才能,那么用它来做一个运算器应该很简洁了,可是,后面实际操作才知道,当运算表达式时,优先级问题特别重要,一开 始用了许多 if 语句来实现,程序繁琐复杂,且成效不是很好,很简洁出错,最终通过查阅相关资料,明白到利用数据结构中栈地思想来解决这一问题就很便利.但在实际写程序时也遇到了许多问题,但最终仍是克服难关,将整个软件比较完善地实现了.在硬件地原理图及PCB 设计中,也遇到了许多问题,先做模块后做主板,导致我后面地布线就很麻烦,这也教会了我一些体会,在PCB 分模块设计中,模块与模块之间地连接也是必需考虑到地,从左端连接仍是从右端连接,都直接影响到整个PCB 板地设计 .总之,通过这次设计也收成了许多,学问层面上,学得了许多新学问,解决问题地新方法,摸索问题地新方向.实践方面,提高了动手才能,提高明白决实际问题地才能等等.在思想上,更加明白地坚持不懈地重要性,学习探究地重要性,实践动手地重要性.欢迎下载精品学习资源5 参考文献【1】 单片机基础第三版李广弟 朱月秀 冷祖祁 编著 北京航天高校出版社,2007【2】 数据结构严蔚敏编著 清华高校出版社欢迎下载精品学习资源附录 1元器件清单( 1)晶振 12M 一个( 2) stc89c52 芯片一片( 3) 30pf 2 个; 10uf 1 个;( 4) 40 脚活动底座一个( 5) LCD 液晶一个( 6)按键 21 个( 7)发光二极管1 个( 8)9 引脚排阻 1 个( 9) 680 1 个; 10k 2 个; 1k 1 个; 10k 滑动变阻器 1 个; 10 1个;( 10) 开关 1 个( 11) 5V 有源蜂鸣器 1 个( 12) 三极管 S8550 一个( 13)排针如干,杜邦线如干欢迎下载精品学习资源附录 2 程序清单分 9个 文 件 : delay.h,delay.c,1602.c,1602.h,stack.h,stack.c,keyboard.h , keyboard.c ,main.c(a) delay.h 程序清单:#ifndefdelay_h #definedelay_h void delay_usuint cnt ;void delay_msuint cnt ;#endif(b) delay.c 程序清单:#include "delay.h"void delay_usunsigned int cntwhile-cnt ;void delay_msunsigned int cntunsigned int i, j ;for i = 0 ; i < cnt ; i+for j = 0 ; j < 65 ; j+delay_us1 ;(c) 1602.h 程序清单: #ifndefLCD1602_H #defineLCD1602_Hvoid LCD_write_comunsigned char com;void LCD_write_Dataunsigned char Data;void LCD_clearvoid ;void LCD_initvoid;void LCD_write_charunsigned char x,unsigned char y,unsigned char Data;欢迎下载精品学习资源void LCD_write_strunsigned char x,unsigned char y,unsigned char *s;#endif(d) 1602.c 程序清单:#include "includes.h"sbit RS = P24 ;/ 定义端口数据命令挑选 H/L sbit RW = P25 ;/ 读写 H/Lsbit EN = P26 ;/ 使能extern unsigned char sk;#define RS_CLR RS=0#define RS_SET RS=1 #define RW_CLR RW=0 #define RW_SET RW=1 #define EN_CLR EN=0 #define EN_SET EN=1/*/*写入命令函数*/*/ void LCD_write_comunsigned char comRS_CLR ;RW_CLR ;EN_SET;P0 = com;delay_us5 ;EN_CLR ;/*/*写入数据函数*/*/ void LCD_write_Dataunsigned char DataRS_SET;RW_CLR ;EN_SET;P0 = Data;delay_us5 ;EN_CLR ;/*/*清屏函数*/*/ void LCD_clearvoidLCD_write_com0x01 ;欢迎下载精品学习资源delay_ms5 ;ifsk = 1LCD_write_char0,1,0xde ;LCD_write_com0x80 ;elseLCD_write_char0,1,0x20 ;LCD_write_com0x80 ;/*/*写入字符串函数*/*/void LCD_write_strunsigned char x,unsigned char y,unsigned char *sunsigned char i,j ;if y = 0欢迎下载精品学习资源elseLCD_write_com0x80 + x;LCD_write_com0xC0 + x;欢迎下载精品学习资源fori=4 ; i>0 ;i-ifs14 = '0' | s14 = '.'forj=14 ;j>1 ;j-sj = sj-1 ;else break;while *sLCD_write_Data*s ;s+;/*/欢迎下载精品学习资源/*写入字节函数*/*/void LCD_write_charunsigned char x,unsigned char y,unsigned char Dataif y = 0欢迎下载精品学习资源elseLCD_write_com0x80 + x;LCD_write_com0xC0 + x;欢迎下载精品学习资源LCD_write_DataData ;/*/*初始化函数*/*/ void LCD_initvoidLCD_write_com0x38;/* 显示模式设置 */delay_ms5 ;LCD_write_com0x38;delay_ms5 ;LCD_write_com0x38delay_ms5 ;LCD_write_com0x38;LCD_write_com0x08;/* 显示关闭 */LCD_write_com0x01;/* 显示清屏 */LCD_write_com0x06;/* 显示光标移动设置*/delay_ms5 ;LCD_write_com0x0C;/* 显示开及光标设置 */(e) 按键 keyboard.h 程序清单: #ifndefKEYBOARD_H #defineKEYBOARD_Hunsigned char KeyProcessvoid ;/读按键函数unsigned char keyscanvoid ;/ 键盘扫描函数#endif(f) 按键 keyboard.c 程序清单:#include "includes.h"extern unsigned char sk;sbit key0=P20 ;sbit key1=P21 ;sbit key2=P22 ;欢迎下载精品学习资源sbit key3=P23 ;sbit speak=P27;unsigned char KeyProcessvoidunsigned char key;unsigned char keyvalue = 16 ;key=keyscan ;/调用键盘扫描switchkeycase 0xee:keyvalue = 0;break;/0 按下相应地键显示相对应地码值case 0xde:keyvalue = 1;break;/1 按下相应地键显示相对应地码值case 0xbe:keyvalue = 2;break;/2case 0x7e:keyvalue = 3;break;/3case 0xed:keyvalue = 5;break;/4case 0xdd:keyvalue = 6 ;break;/5case 0xbd:keyvalue = 7 ;break;/6case 0x7d:keyvalue = 8 ;break;/7case 0xeb:keyvalue = 10 ;break;/8case 0xdb:keyvalue = 11 ;break;/9case 0xbb:keyvalue = 12 ;break;/10case 0x7b:keyvalue = 13 ;break;/11case 0xe7:keyvalue = 15 ;break; /12 case 0xd7:keyvalue = 16 ;break; /13 case 0xb7:keyvalue =