毕业设计(论文)-简易计算器系统设计(20页).doc
-毕业设计(论文)-简易计算器系统设计-第 15 页目 录课程设计任务书I摘要1关键词1引言21 课程设计用的仪器和器件 31.1 单片机的选择方案和论证31.2 显示器的选择方案和论证31.3 按键部分的选择方案和论证32 课程设计方法和内容33 元件介绍43.1 STC89C51单片机特点及引脚图43.2 LCD1602液晶显示器53.2.1 LCD1602基本组成53.2.2 LCD1602基本参数及引脚功能63.2.3LCD1602指令说明及时序64 系统概述74.1 系统设计结构图74.2 简易计算器工作流程75 系统硬件设计75.1 时钟电路85.2 复位电路85.3 键盘电路95.4 显示电路96 程序流程图107.课程设计总结11参考文献12附录 13简易计算器系统设计2010级自动化专业学生 张高强指导教师 龚长青摘要:本文主要介绍了简易计算器系统设计,用51单片机作为主控芯片,通过矩阵键盘作为输入,计算器可以进行2位数的四则运算。在设计过程中,选择STC89C51系列单片机,单片机通过采集键盘上的输入,自行判断运算数字和运算法则。同时将输入的结果和运算结果通过1602显示屏输出。简易计算器的设计,极大的降低了人们的计算量,尤其在大数据的计算上有明显的优势,计算器还具有连续计算功能,能提高人们的工作效率。关键词:单片机;矩阵键盘;1602显示; The Design Of Simple Calculator System Student majoring in automation Zhang Gaoqiang Tutor Gong ChangqingAbstract:This paper mainly introduces the design of simple calculator system ,the system chooses the 51 single chip microcomputer as main control chip and uses the matrix keyboard as input, the calculator can compute in 2 digits. The design process chooses STC89C51 microcontroller series and the single-chip microcomputer judge crunching Numbers and algorithms automatically through acquisition on the keyboard input,.At the same time 1602 display can output the input results and computation results .The design of simple calculator greatly reduces the burden of the humans computing especially in the big datacompution and the calculator can also compute continuously in that enhance people's working efficiency. Key words: singlechip;matrix keyboard;1602display;引言当今时代,是一个新技术层出不穷的时代。在电子领域,尤其是自动化智能控制领域,传统的分立元件或数字逻辑电路构成的控制系统正以前所未见的速度被单片机智能控制系统所取代。单片机具有体积小、功能强、成本低、应用面广等优点,可以说,智能控制与自动控制的核心就是单片机。目前,一个学习与应用单片机的高潮正在工厂、学校及企事业单位大规模地兴起。过去习惯于传统电子领域的工程师、技术员正面临着全新的挑战,如不能在较短时间内学会单片机,势必会被时代所遗弃,只有勇敢地面对现实,挑战自我,加强学习,争取在较短的时间内将单片机技术融会贯通,才能跟上时代的步伐。 它所给人带来的方便也是不可否定的,它在一块芯片内集成了计算机的各种功能部件,构成一种单片式的微型计算机。20世纪80年代以来,国际上单片机的发展迅速,其产品之多令人目不暇接,单片机应用不断深入,新技术层出不穷。20世纪末,电子技术获得了飞速的发展,在其推动下,现代电子产品几乎渗透了社会的各个领域,有力地推动了社会生产力的发展和社会信息化程度的提高,同时也使现代电子产品性能进一步提高,产品更新换代的节奏也越来越快。本次做的计算器是以单片机STC89C51为核心结合相关的元器件LCD1602液晶、矩阵键盘等再配以相关的程序达到制作计算器的目的电子计算器是日常生活中常用的电子计算仪器广泛应用于超市、大中型商场、大小企业。电子计算器具有精度高、体积小、应用范围广、易于操作使用等优点。目前科技的进步告别了以前复杂的模拟电路一块几平方厘米的单片机可以省去很多繁琐的电路。现在应用较广泛的是科学计算器与我们日常所用的简单计算器有较大差别除了能进行加减乘除科学计算器还可以进行正数的四则运算和乘方、开方运算具有指数、对数、三角函数、反三角函数及存储等计算功能。未来的智能化计算器将是我们的发展方向,所以对计算器的研究十分有意义。综述国内外有关本课题的研究进展状况。随着社会的不断发展科技的不断创新。计算器已在数十年间遍布千家万户。计算器拥有几百年历史,1946年2月15日在美国宾夕法尼亚大学世界上第一台电子计算器ENIAC正式投入了运行。数学家把“智慧”给了电子计算器,电子计算器将使数学家变得更加聪明。而且电子计算器不仅是一种工具,它与其它的工具都不相同,电子计算器是人脑的一个侧面的延伸。因为电子计算器不仅具有非凡的计算能力,速度之快令人望尘莫及而且还能够仿真人的某些思维功能按照一定的规则进行逻辑判和逻辑推理代替人的部分脑力劳动。1976年数学家凭借电子计算器去证明四色定理“依靠机器完成了人没有能够完成的事情”轰动了整个国际数学界。计算器的未来是小型化和轻便化,现在市面上出现的使用太阳能电池的计算器,使用ASCII码设计的计算器,如使用纯软件实现的计算器等未来的智能化计算器将是我们的发展方向更希望成为应用广泛的计算工具。1 课程设计用的仪器和器件1.1 单片机的选择方案与论证方案一:采用STC89C51单片机。STC89C51单片机是一种低功耗、高性能CMOS 8位微控制器,具有8K在系统可编程Flash存储器,而且价格优惠。STC89C51使用高密度非易失性存储器技术制造,与工业80C51产品指令和引脚完全兼容。片上Flash允许程序存储器在系统可编程,亦适于常规编程器。在单芯片上,拥有灵巧的8位CPU和在系统可编程Flash,使得STC89C51单片机为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。方案二:采用STC12C5A60S2系列单片机。STC12C5A60S2系列单片机是高速、低功耗、超强抗干扰的新一代8051单片机,指令代码完全兼容8051,但速度快812倍。内部集成MAX810专用复用电路,2路PWM,8路10位高速A/D转换(80K/S),针对电机控制,强干扰场合。STC12C5A60S2系列单片机适合程序大,储存器容量大使用,但价格较昂贵。由于STC89C51价格实惠,又可实现系统需要,因此采用方案一。1.2 显示器的选择方案和论证方案一:使用8位LED数码管来做显示。LED显示器是由发光二极管显示字段组成的显示器件,在单片机应用系统中通常使用的是七段LED,这种显示器有共阴极和共阳极两种,它具有成本低廉、配置灵活和单片机接口方便等特点。方案二:使用LCD1602液晶显示器来显示。液晶是介于固态和液态间的有机化合物,将其加热会变成透明液态,冷却后变成结晶的混作固态。在电极的作用下,产生冷热变化,从而影响它的透光性,来达到显示的目的。LCD1602液晶显示器还具有以下几个优点:低压、微功耗、显示信息量大、长寿命、无辐射、无污染。考虑到是否能清晰地实现本系统的要求,我们决定采用方案二实现本系统的显示功能。1.3 按键部分的选择方案和论证方案一:使用独立式键盘。对于独立式键盘来说,当某个按键按下时,对应的单片机I/O口线为低电平,反之为高电平,但会占用大量的I/O口。方案二:使用矩阵式键盘。矩阵式键盘不会占用很多的I/O口,是一种比较节省资源的方法。为了能减少所占用的I/O口,我们采用方案二。2 课程设计方法和内容设计一个可以进行2位数四则运算的计算器,要求:1、用按键输入数和运算符号;2、用LED显示运算过程和结果(十进制数);3、可以表示出当前的运算类型;4、具有清零和复位功能;5、具有连续运算功能。3 元件介绍3.1 STC89C51单片机特点及引脚图STC89C51是一种低功耗、高性能CMOS8位微控制器,具有8K在系统可编程Flash 存储器。STC89C51使用高密度非易失性存储器技术制造,与工业80C51产品指令和引脚完全兼容。片上Flash允许程序存储器在系统 可编程,亦适于常规编程器。在单芯片上,STC89C51拥有灵巧的8位CPU和在系统可编程Flash,使STC89C51为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。STC89C51具有以下标准功能:与MCS51兼容; 8K支持在线编程(ISP)的FLASH结构程序存储器,1000次擦写寿命;工作电压为4.0V5.5V;全静态工作:024MHz;3级程序安全加密保护;256*8位内部RAM;32个可编程I/O端口;3个16位定时器/计数器;8个中断源;一个全双工异步串口;支持低功耗及掉电模式;高抗静电(ESD保护);宽温度范围,-4085;典型功耗低<0.1ua;掉电模式可由外部中断唤醒支持中断从掉电模式唤醒;内置看门狗; 双数据指针;工业级产品,温度范围(-40°C到85°C),PU为无铅环保产品。另外,STC89C51可降至0Hz静态逻辑操作,支持2种软件可选择节电模式。空闲模式下,CPU停止工作,允许RAM、定时器/计数器、串口中断继续工作。掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。 其PDIP图如下图3-1所示:图3-1 单片机示意图3.2 LCD1602液晶显示器3.2.1 LCD1602基本组成 LCD1602液晶显示器用5*7点阵图形来显示西文字符,有阿拉伯数字、英文字母的大小写、常用符号等。单片机通过写控制方式访问驱动控制器来实现对显示屏的控制。LCD主要由3个部分组成:LCD控制器、LCD驱动器、LCD显示装置。如图3-2所示。 LCD控制器LCD驱动器LCD显示装置VSSVDDVLRSR/WEDB0DB7图3-2 LCD示意图3.2.2 LCD1602基本参数及引脚功能 LCD1602分为带背光和不带背光两种,基控制器大部分为HD44780。1、主要技术参数显示容量:16×2个字符芯片工作电压:4.55.5V工作电流:2.0mA(5.0V)模块最佳工作电压:5.0V字符尺寸:2.95×4.35(W×H)mm在对液晶模块的初始化中要先设置其显示模式,在液晶模块显示字符时光标是自动右移的,无需人工干预。每次输入指令前都要判断液晶模块是否处于忙的状态。1602液晶模块内部的字符发生存储器(CGROM)已经存储了160个不同的点阵字符图形,这些字符有:阿拉伯数字、英文字母的大小写、常用的符号、和日文假名等,每一个字符都有一个固定的代码,比如大写的英文字母“A”的代码是01000001B(41H),显示时模块把地址41H中的点阵字符图形显示出来,我们就能看到字母“A”。2、引脚功能说明LCD1602采用标准的16脚(带背光)接口,各引脚接口说明如表3-1所示。表3-1 LCD1602引脚功能说明引脚编号名称功能操作1VSS电源接地0V2VDD电源正极+5V3VEELCD亮度调整电压输入电压越低,屏幕越亮4RS寄存器选择信号1=选择数据寄存器0=选择指令寄存器5R/W读/写信号1=读取 0=写入6ELCD响应信号1=响应LCD 0=禁用LCD710DB0DB3低4位总线可用4位输入数据、命令及地址1114DB4DB7高4位总线配合DB0DB3的8位输入数据、命令及地址15LED+背光源正极+5V16LED-背光源负极0V3.23 LCD1602的指令说明及时序1602液晶模块内部的控制器共有11条控制指令,如表3-2所示。 表 3-2控制命令表序号指令RSR/WD7D6D5D4D3D2D1D01清显示00000000012光标返回000000001*3置输入模式00000001I/DS4显示开/关控制0000001DCB5光标或字符移位000001S/CR/L*6置功能00001DLNF*7置字符发生存贮器地址0001字符发生存贮器地址8置数据存贮器地址001显示数据存贮器地址9读忙标志或地址01BF计数器地址10写数到CGRAM或DDRAM)10要写的数据内容11从CGRAM或DDRAM读数11读出的数据内容4 系统概述4.1 系统设计结构图时钟电路复位电路主控制器显示电路键盘电路电源电路简易计算器主要由STC89C51主控制器、键盘电路、显示电路等部分组成。其中键盘电路用于数字法号的输入,进行加减乘除运算。简易计算器的系统设计结构图如4-1所示。图4-1 系统结构图4.2 简易计算器工作流程1、上电后,屏幕初始化,显示Welcome comments of teachers。2、5S后清屏,开始进入计算。3、计算。按下09中的数字键,屏幕显示要运算的第一个数值,再按下“+ - * /”中一个符号键,然后再按下数字键,屏幕显示要运算的第二个数值,最后按下“=”键,屏幕显示计算结果。4、再次计算时,先按下清除键“ON/C”,清除屏幕上的计算结果,再重新计算。5 系统硬件设计简易计算器电路由单片机最小系统、时钟电路、4*4矩阵式键盘、LCD1602液晶显示器等组成。其原理图如图5-1所示。图5-1 计算器电路图5.1 时钟电路在MCS51单片机片内有一个高增益的反相放大器,反相放大器的输入端为XTAL1,输出端为XTAL2,由该放大器构成的振荡电路和时钟电路一起构成了单片机的时钟方式。根据硬件电路的不同,单片机的时钟连接方式可分为内部时钟方式和外部时钟方式。我们采用内部时钟方式,如图5-2所示。图5-2 晶振振荡电路在内部方式时钟电路中,必须在X1和X2引脚两端跨接石英晶体振荡器和两个微调电容构成振荡电路, C1和C2取 30pF左右,晶振的频率取值范围1.2MHz12MHz。根据实际情况,本设计采用12MHz作为系统的外部晶振,电容值取22pF。5.2 复位电路 单片机复位是使CPU和系统中的其他功能部件都处在一个确定的初始状态,并从这个状态开始工作。无论是单片机刚开始接上电源时,还是断电后或者发生故障后都要复位。所以,必须弄清楚MCS-51单片机复位的条件、复位电路和复位后的状态。如图5-3图5-3 复位电路单片机复位的条件是:必须使RST/Vpd或RST引脚(9脚)加上持续两个机器周期(即24个振荡周期)的高电平。例如,若时钟频率为12MHz,每机器周期为1us,则只需2us以上时间的高电平。在RST引脚出现高电平后的第二个周期执行复位。单片机常见的复位电路有上电复位电路和按键复位电路。为了方便系统的硬件初始化,我们采用按键复位电路。按键复位电路除具有上电复位功能外,若要复位,只需要按下S22键,在RST端产生一个复位高电平。5.3 键盘电路在键盘中按键数量较多时,为了减少I/O口的占用,通常将按键排列成矩阵形式,如图5-4所示。图5-4 矩阵键盘电路在矩阵式键盘电路中,行连接线和列连接线分别占用4条I/O口线,共连接16个按键。行线连接的接口为输入口,用于输入按键的行位置信息,列线连接的接口为输出口,用于输出扫描电平。5.4 显示电路显示电路由液晶显示器LCD1602取代普通的数码管完成。P0口作为液晶显示的数据端口,P3.4、P3.5、P3.6作为其控制端口,控制LCD液晶显示屏显示输出数据。其电路如图5-5所示。图5-5 LCD电路6 程序流程图系统软件设计设计程序时,首先初始化参数,送LED低位显示“Welcome comments of teachers”,高位不显示。延时5S后清屏,按下数字键输入数值,在LCD1602显示,然后按下“+ - / *”符号键,再输入数值并在LED显示器上显示,最后按下“=”键得出运算结果。若再次计算,需按下清除键“ON/C”清屏后再按数字键输入数值开始计算。程序流程图如6-1所示。图6-1 程序流程图7 课程设计总结本课程设计实现了一个简易计算器设计与制作,利用到了STC89C51、矩阵键盘、LCD1602显示器等,通过C语言编译的程序实现计算功能。计算器实现的是将输入的数字及四则运算显示在LCD中。这是一个非常基础的实验,在很多中型或大型的实验中,例如倒计时钟、交通灯实验中都需要实现这一部分的功能。因此力求做到简洁和容易实现,并需要有较好的可移植性,可以比较容易的移植到其它复杂的程序。这次课程设计锻炼了我多方面的能力。在考虑逻辑图的具体设计方案时,经过查找各种资料先选出可用的芯片,最后通过比较他们的技术参数、特点及性价比等选出最适合本设计的硬件搭配。简易计算器的设计,掌握了单片机中常用接口电路的应用和设计技术,了解了LCD显示器的显示原理。在写控制程序前,首先应该准备好设计思路和画流程图,流程图的设计可以使我更有针对性的编写程序,可以有效的避免和及时发现错误。通过本次设计,我最深的感触就是处理问题不要急于求成,要不断的对问题进行思考,以减少失败的概率。对任何实际问题的处理,都是建立在我们所学的基础知识之上,只有牢固熟练的掌握了基础知识,才能够对问题的解决有个宏观准确的把握,找到解决问题的切入点,攻克难点。同时要有严谨的态度,对问题的思考不要畏难,因为任何一点小的思路的错误或者语法的错误,都会导致功能不能实现。同时查阅参考书,在网上查找相关资料都能够给我们提供很多宝贵的信息。最重要的是,在找不到突破的时候要向老师请教,龚老师的指导言简意赅,给我的设计带来了极大的帮助,最后在此再次感谢龚老师对我的课程设计的支持。参考文献:1 张永格.单片机C语言应用技术与实践M.2版.北京:北京交通大学出版社,2009 2 胡辉.单片机原理与应用M. 第6版. 北京中国水利水电出版社.2007年3 王东锋,董冠强.单片机C语言应用100例M. 第2版. 电子工业出版社.2009年4 郭惠,吴迅. 单片机C语言程序设计完全自学手册M. 第3版. 电子工业出版社.2008年.5 国兵.模拟电子技术M. 第2版.高等教育出版社. 2008.附录 #include"reg52.h" #define uchar unsigned char#define uint unsigned intuchar code table2="Welcome comments" ;/“欢迎老师点评!”英文字样uchar code table3=" of teachers! "/“欢迎老师点评!”英文字样uchar code table4="0" /初始化sbit busy=P07;void delay(uint z) uint x,y; for(x=z;x>0;x-) for(y=110;y>0;y-);char i,j,temp,num;long a,b,c; /a,第一个数 b,第二个数 c,得数uchar flag,fuhao;/flag表示是否有符号键按下,fuhao表征按下的是哪个符号uchar code table=7,8,9,0,4,5,6,0,1,2,3,0,0,0,0,0;uchar code table1=7,8,9,0x2f-0x30,4,5,6,0x2a-0x30,1,2,3,0x2d-0x30,0x01-0x30,0,0x3d-0x30,0x2b-0x30; /按键显示编码表sbit lcden=P36;sbit lcdwrite=P35;sbit lcdrs=P34;/lcd的写指令void write_com(uchar com) lcdrs=0; lcden=0; P0=com; delay(1); lcden=1; delay(1); lcden=0;/lcd的写数据void write_date(uchar da) lcdrs=1; lcden=0; P0=da; delay(1); lcden=1; delay(1); lcden=0;/初始化void init() /初始化 uchar num; num=-1; lcdwrite=0; lcden=0; write_com(0x38); write_com(0x0c); write_com(0x06); write_com(0x01); for (num=0;num<16;num+) write_date(table2num); delay(5); write_com(0x80+0x40); for (num=0;num<16;num+) write_date(table3num); delay(5); delay(5000);/延时5s write_com(0x01); i=0; j=0; a=0; /第一个参与运算的数 b=0; /第二个参与运算的数 c=0; flag=0; /flag表示是否有符号键按下, fuhao=0; / fuhao表征按下的是哪个符号void keyscan() / 键盘扫描程序 P1=0xfe; if(P1!=0xfe) delay(10); /延迟20ms if(P1!=0xfe) temp=P1&0xf0; switch(temp) case 0xe0:num=0; break; case 0xd0:num=1; break; case 0xb0:num=2; break; case 0x70:num=3; break; while(P1!=0xfe); if(num=0|num=1|num=2)/如果按下的是'7','8'或'9 if(j=1)/确认一次计算完毕,清屏 write_com(0x01); j=0; if(flag=0)/没有按过符号键 a=a*10+tablenum; else/如果按过符号键 b=b*10+tablenum; else/如果按下的是'/' flag=1; fuhao=4;/4表示除号已按 i=table1num; write_date(0x30+i); P1=0xfd; if(P1!=0xfd) delay(5); if(P1!=0xfd) temp=P1&0xf0; switch(temp) case 0xe0:num=4; break; case 0xd0:num=5; break; case 0xb0:num=6; break; case 0x70:num=7; break; while(P1!=0xfd); if(num=4|num=5|num=6)/如果按下的是'4','5'或'6' if(j=1) write_com(0x01); j=0; if(flag=0)/没有按过符号键 a=a*10+tablenum; else/如果按过符号键 b=b*10+tablenum; else/如果按下的是'X' flag=1; fuhao=3;/3表示乘号已按 i=table1num; write_date(0x30+i); P1=0xfb; if(P1!=0xfb) delay(10); if(P1!=0xfb) temp=P1&0xf0; switch(temp) case 0xe0:num=8; break; case 0xd0:num=9; break; case 0xb0:num=10; break; case 0x70:num=11; break; while(P1!=0xfb); if(num=8|num=9|num=10)/如果按下的是'1','2'或'3' if(j=1) write_com(0x01); j=0; if(flag=0)/没有按过符号键 a=a*10+tablenum; else/如果按过符号键 b=b*10+tablenum; else if(num=11)/如果按下的是'-' flag=1; fuhao=2;/2表示减号已按 i=table1num; write_date(0x30+i); P1=0xf7; if(P1!=0xf7) delay(5); if(P1!=0xf7) temp=P1&0xf0; switch(temp) case 0xe0:num=12; break; case 0xd0:num=13; break; case 0xb0:num=14; break; case 0x70:num=15; break; while(P1!=0xf7); switch(num) case 12:/按下的是"清零" write_com(0x01); a=0; b=0; flag=0; fuhao=0; break; case 13:/按下的是"0" if(flag=0)/没有按过符号键 a=a*10; write_date(0x30); if(flag=1)/如果按过符号键 b=b*10; write_date(0x30); break; case 14: j=1; if(fuhao=1) write_com(0x80+0x4f);/按下加号键,光标前进至第二行最后一个显示处 write_com(0x04); /设置从后住前写数据 c=a+b; while(c!=0) write_date(0x30+c%10); c=c/10; write_date(0x3d); /写"=" a=0;b=0;flag=0;fuhao=0; else if(fuhao=2) write_com(0x80+0x4f);/按下减号按键 write_com(0x04); /设置从后住前写数据 if(a-b>0) c=a-b; else c=b-a; while(c!=0) write_date(0x30+c%10); c=c/10; if(a-b<0) write_date(0x2d); /写负号"-" write_date(0x3d); /再写"=" a=0;b=0;flag=0;fuhao=0; else if(fuhao=3)/按下乘号按键 write_com(0x80+0x4f); write_com(0x04); c=a*b; while(c!=0) write_date(0x30+c%10); c=c/10; write_date(0x3d); a=0;b=0;flag=0;fuhao=0; else if(fuhao=4)/按下除号按键 write_com(0x80+0x4f); write_com(0x04); i=0; c=(long)(float)a/b)*1000); while(c!=0) write_date(0x30+c%10); c=c/10; i+; if(i=3) /精确到小数点后三位 write_date(0x2e); /写小数点 if(a/b<=0) write_date(0x30); write_date(0x3d); a=0;b=0;flag=0;fuhao=0; break; case 15: write_date(0x30+table1num);flag=1;fuhao=1; break;main() init(); while(1) keyscan();