多功能计算器.docx
《多功能计算器.docx》由会员分享,可在线阅读,更多相关《多功能计算器.docx(21页珍藏版)》请在冰点文库上搜索。
多功能计算器
引言
当今社会,计算器作为一种快速、通用的计算工具方便了用户的使用。
单片机由于其微小的体积和极低的成本,广泛的应用于家用电器、工业控制等领域中。
在工业生产中,单片微型计算机是微型计算机的一个重要分支,也是颇具生命里的机种。
单片机的出现是计算机制造技术高速发展的产物,它是嵌入式控制系统的核心。
单片微型计算机简称单片机,特别使用于控制领域,故又称为微控制器。
本文是基于单片机控制的多功能计算器的设计。
设计以单片机为控制核心,运用C语言编写程序,采用矩阵键盘式输入数据、在液晶模块LCD1602上显示计算过程以及结果,该计算器能进行加、减、乘、除运算,此外该计算器还具有计时和倒计时的功能。
这样一个简易的计算器实现了多功能,相比当前一些计算器来说,在功能上增加了却没有增加产品的成本,采用的技术也更趋向于国产化。
1.计算器的发展和分类
计算器的发展
计算器一般由运算器、控制器、存储器、键盘、显示器、电源和一些可选外围设备及电子配件通过人工或机器设备组成。
低档计算器的运算器、控制器由数字逻辑电路实现简单的串行运算,其随机存储器只有一、二个单元,供累加存储用。
高档计算器由微处理器和只读存储器实现各种复杂的运算程序,有较多的随机存储单元以存放输入程序和数据。
键盘是计算器的输入部件,一般采用接触式或传感式。
为减小计算器的尺寸,一键常常有多种功能。
显示器是计算器的输出部件,有发光二极管显示器或液晶显示器等。
除显示计算结果外,还常有溢出指示、错误指示等。
计算器电源采用交流转换器或电池,电池可用交流转换器或太阳能转换器再充电。
为节省电能,计算器都采用CMOS工艺制作的大规模集成电路(见互补金属-氧化物-半导体集成电路),并在内部装有定时不操作自动断电电路。
计算器可选用的外围设备有微型打印机、盒式和磁卡机等。
最早的计算工具诞生在中国。
中国古代最早采用的一种计算工具叫筹策,又被叫做算筹。
这种算筹多用竹子制成,也有用木头,兽骨充当材料的.约二百七十枚一束,放在布袋里可随身携带。
直到今天仍在使用的盘,是中国古代计算工具领域中的另一项发明,明代时的珠已经与现代的珠算盘几乎相同。
17世纪初,西方国家的计算工具有了较大的发展,英国数学家纳皮尔发明的"纳皮尔算筹",英国牧师奥却德发明了圆柱型对数计算尺,这种计算尺不仅能做加减乘除、乘方、开方运算,甚至可以计算三角函数,指数函数和对数函数,这些计算工具不仅带动了计算器的发展,也为现代计算器发展奠定了良好的基础,成为现代社会应用广泛的计算工具。
1642年,年仅19岁的法国伟大科学家引用算盘的原理,发明了第一部机械式计算器,在他的计算器中有一些互相联锁的齿轮,一个转过十位的齿轮会使另一个齿轮转过一位,人们可以像拨电话号码盘那样,把数字拨进去,计算结果就会出现在另一个窗口中,但是只能做加减计算。
1694年,莱布尼兹在德国将其改进成可以进行乘除的计算。
此后,一直要到20世纪50年代末才有电子计算器的出现。
计算器的分类
算术型计算器——可进行加、减、乘、除等简单的四则运算,又称简单计算器。
科学型计算器——可进行乘方、开方、指数、对数、三角函数、统计等方面的运算,又称函数计算器。
程序计算器——可以编程序,把较复杂的运算步骤贮存起来,进行多次重复的运算。
显示计算结果外,还常有溢出指示、错误指示等。
计算器电源一般采用干电池,为节省电能,也可采用充电电池。
2.设计方法
电路采用动态显示,由八位共阳极数码管通过P0口,P2口与单片机分别相连,且数码管A,B,C,D,E,F,G分别依次与单片机的P0口相连,P0口做为字码控制端,数码管的1,2,3,4,5,6,7,8各引脚分别与单片机的—相连,P2口做为数码管的位控制端,动态显示是每次数码管只显示一位,由于人的视觉停留是到秒之间,当数码管依次点亮各个位时,使循环的频率高于人的视觉停留时间,人们就会认为数码管是同时点亮的,就可以达到动态显示的效果。
输入键盘采用4*4键盘。
采用软件识别键值并执行相应的操作,程序运行时依次扫描各行,查询是否有键按下,如果有则进入键盘识别处理程序,实现相应的运算,然后通过数码管输出结果,如果没有按键就调用显示程序显示一个0,等待按键按下,在进入按键扫描程序。
这样循环执行。
3.硬件系统设计
硬件系统是指构成微机系统的实体和装置,通常由运算器、控制器、存储器、输入接口电路和输入设备、输出接口电路和输出设备等组成。
单片机实质上是一个硬件的芯片,在实际应用中,通常很难直接和被控对象进行电气连接,必须外加各种扩展接口电路、外部设备、被控对象等硬件和软件,才能构成一个单片机应用系统。
本设计选用以AT89S51单片机为主控单元。
显示部分:
采用7段LED动态显示。
按键部分,采用4*4键盘。
单片机
单片机实现由于单片机集成了运算器电路、控制电路、存储器、中断系统、定时器/计数器以及输入/输出口电路等,所以用单片机设计控制电路省去了很多分立元器件。
由于单片机是可编程芯片,并且它可以运用C语言编写,对于一些复杂的计算功能,可以调用C语言库函数。
使编写程序变得非常简单。
所以该课题用单片机实现,不仅功能易于实现,而且精确度高,稳定性好,抗干扰能力强。
并且由于其成本低、体积小、技术成熟和功耗小等优点,且技术比较成熟。
性价比也相当高。
更重要的是本人经过几年的学习,对单片机已有深刻的理解,并且可以灵活运用。
4*4矩阵式键盘
计算机输入数字和其他功能按键时要用到很多按键,在这种情况下,编程会很简单,但是会占用大量的I/O口资源,因此在很多情况下都不采用这样的方式,而是采用矩阵键盘的方式。
矩阵键盘采用四条I/O线作为行线,四条I/O线作为列线组成键盘,在行线和列线的每个交叉点上设置一个按键。
这样键盘上按键的数量就为4*4个。
这样行列式键盘结构能有效的提高单片机系统中I/O口的利用率。
计算器的键盘布局如图所示:
一般有16个键组成,在单片机中正好有一个P端口实现16个按键功能,这种形式在单片机系统中最常用。
采用矩阵式键盘作为输入电路,其特点:
电路和软件稍复杂,但相比之下,当键数越多时越节约I/O口,比较节省资源。
本设计使用键盘输入预置用于计算或计时,按键越多。
若采用独立按键,需频繁按键,为软件设计增加负担,且操作界面不友好。
若采用矩阵式键盘,可以方便地输入一个数值,使操作界面更具人性化,节约了宝贵的I/O口资源。
矩阵键盘内部电路
7段LED数码管
利用集成的LED数码管(四位)
程序下载接口
利用串行口芯片232烧录入程序
数码管驱动芯片
利用244芯片驱动数码管显示
单片机时钟电路
时钟电路用于产生单片机工作所需要的时钟信号,单片机本身就是一个复杂的同步时序电路,为了保证同步工作方式的实现,电路应在唯一的时钟信号控制下严格地按时序进行工作。
在MCS-51芯片内部有一个高增益反相放大器,其输入端为芯片引脚X1,输出端为引脚X2,在芯片的外部跨接晶体振荡器和微调电容,形成反馈电路,就构成了一个稳定的自激振荡器。
此电路采用12MHz的石英晶体。
时钟电路如下图:
时钟电路
单片机复位电路
复位是单片机的初始化操作,其主要功能是把PC初始化为0000H,使单片机从0000H单元开始执行程序。
除了进入系统的正常初始化之外,当由于程序运行出错或操作错误是系统处于死锁状态时,为摆脱困境,也需要按复位键以重新启动。
RST引脚是单片机复位信号的输入端,复位信号是高电平有效,其有效时间应持续24个振荡周期(即2个机器周期)以上,若使用频率为12MHz的晶振,则复位信号持续时间应超过4
s才能完成复位操作。
复位操作有上电自动复位和按键手动复位两种方式。
上电自动复位是通过外部复位电路的电容充电来实现的。
按键电平复位是通过使复位端经电阻与Vcc电源接通而实现的。
在本设计中采用了按键电平复位方式,其复位电路如下图:
89C51是一种带4K字节闪烁可编程可擦除只读存储器(FPEROM—FalshProgrammableandErasableReadOnlyMemory)的低电压、高性能CMOS8位微处理器,俗称单片机。
单片机的可擦除只读存储器可以反复擦除100次。
该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。
由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的89C51是一种高效微控制器,89C2051是它的一种精简版本。
89C单片机为很多提供了一种灵活性高且价廉的方案。
89C51引脚图
VCC:
供电电压
GND:
接地。
P0口:
P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。
当P1口的管脚第一次写1时,被定义为输入。
P0能够用于外部程序数据存储器,它可以被定义为数据/地址的低八位。
在FLASH编程时,P0口作为原码输入口,当FLASH进行校验时,P0输出原码,此时P0外部必须被拉高。
P1口:
P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。
P1口管脚写入1后,被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。
在FLASH编程和校验时,P1口作为第八位地址接收。
P2口:
P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。
并因此作为输入时,P2口的管脚被外部拉低,将输出电流。
这是由于内部上拉的缘故。
P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。
在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。
P2口在FLASH编程和校验时接收高八位地址信号和控制信号。
P3口:
P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。
当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。
作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故。
P3口也可作为AT89C51的一些特殊功能口,如下表所示:
口管脚备选功能
RXD(串行输入口)
TXD(串行输出口)
/INT0(外部中断0)
/INT1(外部中断1)
T0(记时器0外部输入)
T1(记时器1外部输入)
/WR(外部数据存储器写选通)
/RD(外部数据存储器读选通)
P3口同时为闪烁编程和编程校验接收一些控制信号。
RET:
复位输入。
当振荡去复位器件时,要保持RST脚两个机器周期的高电平时间。
ALE/PROG:
当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节。
在FLASH编程期间,此引脚用于输入编程脉冲。
在平时,ALE端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。
因此它可用作对外部输出的脉冲或用于定时目的。
然而要注意的是:
每当用作外部数据存储器时,将跳过一个ALE脉冲。
如想禁止ALE的输出可在SFR8EH地址上置0。
此时,ALE只有在执行MOVX,MOVC指令是ALE才起作用。
另外,该引脚被略微拉高。
如果微处理器在外部执行状态ALE禁止,置位无效。
/PSEN:
外部程序存储器的选通信号。
在由外部程序存储器取指期间,每个机器周期两次/PSEN有效。
但在访问外部数据存储器时,这两次有效的/PSEN信号将不出现。
/EA/VPP:
当/EA保持低电平时,则在此期间外部程序存储器(0000H-FFFFH),不管是否有内部程序存储器。
注意加密方式1时,/EA将内部锁定为RESET;当/EA
端保持高电平时,此间内部程序存储器。
在FLASH编程期间,此引脚也用于施加12V编程电源(VPP)。
XTAL1:
反向振荡放大器的输入及内部时钟工作电路的输入。
XTAL2:
来自反向振荡器的输出。
4.软件设计
汇编语言和C语言的特点及选择
本设计是硬件电路和软件编程相结合的设计方案,选择合适的编程语言是一个重要的环节。
在单片机的应用系统程序设计时,常用的是汇编语言和C语言。
机硬件,程序可读性和可移植性比较差。
而C语言虽然执行效率没有汇编语言高,但语言简洁,使用方便,灵活,运算丰富,表达化类型多样化,数据结构类型丰富,具有结构化的控制语句,程序设计自由度大,有很好的可重用性,可移植性等特点。
在本设计中采用C语言编写软件程序。
主程序的设计详见附录。
键扫程序设计
键扫程序的过程为:
开始时,先判断是否有键闭合,无键闭合时,返回继续判断,有键闭合时,先去抖动,然后确定是否有键按下,若无键按下,则返回继续判断是否有键闭合,若有键按下,则判断键号,然后释放,若释放按键完毕,则返回,若没有释放按键,则返回继续释放。
其流程图如图:
算术运算程序设计
算术运算程序的过程为:
先判断输入的运算符是+、-、*、/中的哪一个,若是+或-,则要判断运算结果是否溢出,溢出则显示错误信息,没溢出就显示运算结果,若是/,则要先判断除数是否为零,为零就显示错误信息,不为零则显示运算结果,若是-,则直接显示运算结果。
其流程图如图:
显示原理
LED点阵显示器亦称LED矩阵板,具有亮度高、发光均匀、可靠性好、接线简单、拼装方便等优点,能构成各种尺寸的大屏幕显示器。
因此,它被广泛应用于大型LED智能显示屏、智能仪器仪表和机电一体化设备的显示单元中,取得了较好的效果。
由于它经济、小型的显示系统,同时要求使用方便灵活,方便地组成了由多块大屏幕LED显示器构成的显示系统,该系统可广泛用于商场、车站、码头及其它公共场合。
LED显示屏由ED点阵显示器(常见型号为P2158A)构成。
它是以发光二极管为像素,按照行与列的顺序排列而成的显示器件,采用逐行(或逐列)扫描方式工作,由峰值较大的窄脉冲驱动,从上到下逐次不断地对显示屏的各行进行选通,同时又向各列送出表示图形或文字信息的脉冲信号,反复循环以上操作,就可显示各种图形或文字信息
此设计中LED数码管的显示为动态显示。
各数码管在显示过程中轮流得到送显信号,与各数码管接口的I/O口线是共用的。
动态显示优点是用元器件少,占I/O线少。
但缺点是有闪烁,必须扫描,花费CPU时间,编程复杂。
LED多数情况用于显示十进制数字,要将0~9的数字用7段显示,必须将数字转换为LED对应七段码的信息,比如,要显示“0”,就是让a、b、c、d、e和f段发光,显示“1”,让b和c段发光,等等如表所示。
然后根据LED是共阴极还是共阳极接法确定LED各输入端应接逻辑1还是逻辑0,我选用的是共阴接法,要显示“0”时,a、b、c、d、e和f段就要输入逻辑1,即其段码为3F,将待显示内容“翻译”为LED段码的过程,可以由软件查表方法实现译码。
5.硬件调试
常见故障
1、逻辑错误:
它是由设计错误或加工过程中的工艺性错误所造成的。
这类错误包括错线、开路、短路等。
2、元器件失效:
有两方面的原因:
一是器件本身已损坏或性能不符合要求;二是组装错误造成元件失效,如电解电容、集成电路安装方向错误等。
3、可靠性差:
因其可靠性差的原因很多,如金属化孔、接插件接触不良会造成系统时好时坏,经不起振动;走线和布局不合理也会引起系统可靠性差。
4、电源故障:
若样机由电源故障,则加电后很容易造成器件损坏。
电源故障包括电压值不符合设计要求,电源引线和插座不对,功率不足,负载能力差等。
调试方法:
包括多级调试和联机调试。
在调试过程中要针对可能出现的故障认真分析,直至检查出原因并排除。
本次硬件调试过程中,对所出现的问题进行了认真的分析和改正,最后能够很好的达到设计要求的效果。
6.软件调试
软件调试一般分为以下四个阶段:
1、编写程序并查错;2、在C语言的编译系统中编译源程序3、对程序进行编译连接,并及时发现程序中存在的错误;4、改正错误。
在软件调试过程中,对出现的错误进行了认真的分析和修改,多次调试成功后,能够很好的达到既定的设计效果。
此系统可以改进为增加小数点和负数以及一种科学计算功能,这是一个比较难的挑战。
总结
这次单片机课程设计不仅巩固了以前所学过的知识,而且学到了很多在书本上没有学到过的知识,掌握了一种系统的研究方法,可以进行一些简单的编程。
通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,从而提高自己的实际动手能力和独立思考的能力。
同时在设计的过程中发现了自己的不足之处,例如对以前所学过的知识理解得不够深刻,掌握得不够牢固,学习了单片机C语言。
经过一周的努力,顺利的完成了单片机课设。
这是一个磨练意志的过程。
从课题的选择开始,计算器的设计、硬件和软件系统的设计、到最后的Proteus软件仿真完成,这其中经历了很多困难,但是更重要的是在这个过程中我得到了很大的锻炼。
一方面通过C51单片机等一些器件的设计让我学习和掌握了单片机技术的基础知识和技术要点,也使以前学的很多知识都得到了运用;另一方面在用Proteus软件画电路图时,然后再转换成一维的WORD中进行编辑,这个过程中让我掌握了计算机辅助的设计技术。
当然,这是一个需要不断的尝试,不断的校核,不断的修改,最后完成一个合理的设计的过程。
需要的是细心和耐心。
在很大程度上培养了我拼搏的工作精神。
使我受益匪浅,更加明确了自己专业的方向。
通过本次课设,我不仅学到了关于单片机技术方面的许多专业知识,同时也让我感觉到团队合作的重要性。
其实如何有效和快速的找到资料也是课设给我的启发,利用好图书馆和网络,是资源的到最好的利用。
与他人交流思想是取得成功的关键,在交流中,不仅强化了自己原有的知识体系,也扩展了自己的思维。
课设是一个通过思考、发问、自己解惑并动手、提高的过程。
我会在以后的学习中不断学习,积累经验,完善自己。
这里我要感谢实验室的指导老师,没有老师的细致讲解和耐心的检查,也就没有我的计算器出来,非常感谢!
参考文献
1.李朝青单片机原理及接口技术(第3版)北京航空航天大学出版社
附录
源程序
#include""
sbitP3_0=P3^0;
sbitP3_1=P3^1;
sbitP3_2=P3^2;
sbitP3_3=P3^3;
sbitP3_4=P3^4;
sbitP3_5=P3^5;
sbitP3_6=P3^6;
sbitP3_7=P3^7;
unsignedcharsz[11],xs1[4],xs2[4],sj;
inti,j,cs,bb,t1,t2,fh,s1,s2;
voidchushihua()//初始化
{
bb=1;//bb是标志为第一或者第二个操作数
xs1[0]=10;xs1[1]=10;xs1[2]=10;xs1[3]=10;//xs数组是要显示的数
xs2[0]=10;xs2[1]=10;xs2[2]=10;xs2[3]=10;
t1=0;t2=0;s1=s2=0;
fh=0;//符号
cs=1;
}
voidxianshi(unsignedcharxs[4])//显示子程序
{
inti,j;
unsignedcharzy;
zy=0x08;//位选信号
for(i=0;i<4;i++)
{
P2=zy;
P1=sz[xs[i]];//查表得到显示的代码
zy=(zy>>1);//右移一位
for(j=0;j<100;j++);//显示延时
}
//for(i=0;i<100;i++);
return;
}
unsignedcharsaomiao()//扫描子程序
{
inti;
unsignedcharpp;
for(i=0;i<1000;i++);
P0=0xfe;
P3=0x0f;
pp=P3;
if(P3_0==0){P3=0x0f;pp=P3;while(P3_0==0);for(i=0;i<1000;i++);return7;}//判断按键,含消抖过程。
下同
if(P3_1==0){P3=0x0f;pp=P3;while(P3_1==0);for(i=0;i<1000;i++);return8;}
if(P3_2==0){P3=0x0f;pp=P3;while(P3_2==0);for(i=0;i<1000;i++);return9;}
if(P3_3==0){P3=0x0f;pp=P3;while(P3_3==0);for(i=0;i<1000;i++);return11;}
//==========1
P0=0xfd;
P3=0x0f;
pp=P3;
if(P3_0==0){P3=0x0f;pp=P3;while(P3_0==0);for(i=0;i<1000;i++);return4;}
if(P3_1==0){P3=0x0f;pp=P3;while(P3_1==0);for(i=0;i<1000;i++);return5;}
if(P3_2==0){P3=0x0f;pp=P3;while(P3_2==0);for(i=0;i<1000;i++);return6;}
if(P3_3==0){P3=0x0f;pp=P3;while(P3_3==0);for(i=0;i<1000;i++);return12;}
//==========2
P0=0xfb;
P3=0x0f;
pp=P3;
if(P3_0==0){P3=0x0f;pp=P3;while(P3_0==0);for(i=0;i<1000;i++);return1;}
if(P3_1==0){P3=0x0f;pp=P3;while(P3_1==0);for(i=0;i<1000;i++);return2;}
if(P3_2==0){P3=0x0f;pp=P3;while(P3_2==0);for(i=0;i<1000;i++);return3;}
if(P3_3==0){P3=0x0f;pp=P3;while(P3_3==0);for(i=0;i<1000;i++);return13;}
//==========3
P0=0xf7;
P3=0x0f;
pp=P3;
if(P3_0==0){P3=0x0f;pp=P3;while(P3_0==0);for(i=0;i<1000;i++);return16;}
if(P3_1==0){P3=0x0f;pp=P3;while(P3_1==0);for(i=0;i<1000;i++);return0;}
if(P3_2==0){P3=0x0f;pp=P3;while(P3_2==0);for(i=0;i<1000;i++);return15;}
if(P3_3==0){P3=0x0f;pp=P3;while(P3_3==0);for(i=0;i<1000;i++);return14;}
//===========4
return10;//没按键,返回10
}
voidchuli(unsignedcharx)//处理程序
{
inti;
if(x==16)
{
cs=0;
return;
}
if(x>=0&&x<10)//输入为数字
{
if(bb==1