模拟计算器.docx
《模拟计算器.docx》由会员分享,可在线阅读,更多相关《模拟计算器.docx(16页珍藏版)》请在冰点文库上搜索。
![模拟计算器.docx](https://file1.bingdoc.com/fileroot1/2023-7/16/0263def6-5c72-4f64-9f5c-17a59e5620c2/0263def6-5c72-4f64-9f5c-17a59e5620c21.gif)
模拟计算器
摘要
计算器是微型计算机的一种特殊类型,它与一般通用计算机的主要区别在于程序输入的方式不同计算机的程序一般都已经固定,只需按键输入数据和运算符号就会得出结果,很容易就能掌握。
而一般计算机的程序可以根据需要随时改动,或重新输入新的程序。
简易计算器主要用于加减乘除。
科学计算器,又增添了初等函数运算(有的还带有数据总加、求平均值等统计运算)。
现代电子计算器首次问世是1963年。
那时的计算器是台式的,在美国波士顿的电子博览会上展出过。
与计算机相比,它小巧玲珑,计算迅捷,一般问题不必事先编写复杂的程序。
随着微电子技术的不断发展,微处理器芯片的集成程度越来越高,单片机已可以在一块芯片上同时集成CPU、存储器、定时器/计数器、并行和串行接口、看门狗、前置放大电路、A/D转换器、D/A转换器等多种电路,这就很容易将计算机技术与测量控制技术结合,组成智能化测量控制系统。
随着社会需求,计算器也从原有单一的数字加减计算演变为复杂的多种计算。
现在不再单一的在某一方面,而是涉及到生活的方方面面。
本设计是由单片机实现的模拟计算器,它不仅能实现数据的加减乘除运算,而且还能使数据及其计算结果数码管上显示出来数据和结果,能够实现个位数的四则运算。
本设计是用单片机STC89C52来控制,采用共阳极数码管显示,软件部分是由C语言来编写的。
关键词STC89C52计算器显示器单片机
目录
第一章绪论
1.1课题研究的可行性
当今时代,是一个新技术层出不穷的时代。
在电子领域,尤其是自动化智能控制领域,传统的分立元件或数字逻辑电路构成的控制系统正以前所未见的速度被单片机智能控制系统所取代。
单片机具有体积小、功能强、成本低、应用面广等优点,可以说,智能控制与自动控制的核心就是单片机。
目前,一个学习与应用单片机的高潮正在工厂、学校及企事业单位大规模地兴起。
过去习惯于传统电子领域的工程师、技术员正面临着全新的挑战,如不能在较短时间内学会单片机,势必会被时代所遗弃,只有勇敢地面对现实,挑战自我,加强学习,争取在较短的时间内将单片机技术融会贯通,才能跟上时代的步伐。
它所给人带来的方便也是不可否定的,它在一块芯片内集成了计算机的各种功能部件,构成一种单片式的微型计算机。
20世纪80年代以来,国际上单片机的发展迅速,其产品之多令人目不暇接,单片机应用不断深入,新技术层出不穷。
20世纪末,电子技术获得了飞速的发展,在其推动下,现代电子产品几乎渗透了社会的各个领域,有力地推动了社会生产力的发展和社会信息化程度的提高,同时也使现代电子产品性能进一步提高,产品更新换代的节奏也越来越快。
计算器一般有运算器、控制器、存储器、键盘、显示器、电源和一些可选外围设备及电子配件通过人工或机器设备组成。
低档计算器的运算器、控制器由数字逻辑电路实现简单的串行运算,其随机存储器只有一、二个单元,供累加存储用。
高档计算器由微处理器和只读存储器实现各种复杂的运算程序,有较多的随机存储单元以存放输入程序和数据。
键盘是计算器的输入部件,一般采用接触式或传感式。
为减少计算器的尺寸,一键常常有多种功能。
显示器是计算器的输出部件,有发光二极管显示器或液晶显示器等。
除显示计算结果外,还常有溢出指示、错误指示等。
计算器电源采用交流转换器或电池,电池可用交流转换器或太阳能转换器再充电。
为节省电能,计算器都采用CMOS工艺制作的大规模集成电路,并在内部装有定时不操作自动断电电路。
计算器可选用的外围设备有微型打印机、盒式磁带机和磁卡机等。
计算器这一小小的程序机器实际上是从计算机中割裂出来的衍生品,但因其方便快捷的操作模式,已经被广泛应用于工程、学习、商业等日常生活中,极大的方便了人们对于数字的整合运算。
目前计算器的应用越来越广泛,计算器在国内外的发展水平越来越高。
而目前,计算器的应用现状是:
种类多样,技术含量高,具有良好的稳定性,抗冲击能力强。
功能齐全的计算器都涌现出来。
随着科技的不断发展,在电子技术领域里,计算器将得到越来越广泛的应用;计算器也将向着更合理,更科学,更适用的方向不断向前发展!
1.2课题研究的方案
1.2.1硬件部分设计方案
(1)单片机部分
单片机以STC89C52作为核心元件
(2)按键部分
采用4*4行列式键盘,
(3)显示部分
在单片机应用系统中,使用的显示器主要有LED(发光二极管显示器)、LCD液晶显示器以及CRT接口。
设计思路:
使用LCD液晶显示器来显示。
液晶是介于固态和液态间的有机化合物,将其加热会变成透明液态,冷却后变成结晶的混浊固态。
在电的作用下,产生冷热变化,从而影响它的透光性,来达到显示的目的。
LCD还具有以下几个优点:
低压、微功耗;显示信息量大;寿命长;无辐射、无污染。
1.2.2软件部分设计方案
设计思路是将整个程序划分为键盘扫描部分,显示部分,运算程序部分,清屏显示部分。
对于其中的键盘扫描部分,在编写时又分为动态扫描和静态扫描;运算程序部分包括加、减、乘、除四个子程序。
软件流程大致如下:
开始,然后是系统的初始化,进行键盘扫描,对扫描的键值进行判断(分为数字键和功能键)。
如果是数字键,执行数字键处理子程序,即显示数字并将数值存储;如果是命令键,即先判断是否为清屏,如为清屏键,则执行清屏子程序,若为“+-*/”运算键,则显示相应的符号并存储结果,若都不是则为“=”键,即要先判断上个符号位,然后调用对应的运算子程序运算,就可以得到需要的结果。
1.2.3硬件设计原理图
计算器大致分为:
单片机、液晶显示、键盘三大部分。
因此,总的电路设计方案以单片机STC89C52来作为核心元器件,外围采用4*4行列式键盘作为输入,采用LCD液晶显示器来作为输出。
1.3课题研究的意义
通过本次设计能够更好的掌握C语言编程技巧,增强实践编程能力,以及团队合作能力,为以后的编程道路奠下坚实的基础。
这次编写的C语言计算器是用来进行简单运算的,随着人们通信或了解信息的越来越数据化,特别是要求高速度的获取想要的信息,计算器的要求越来越高,不仅是在其容量上越来越大,特别是在其功能上要求的实现越来越多,数据类型和精确度越来越准确。
该程序是一个基于C语言的程序设计界面设计的功能简单的计算器,实现了加、减、乘、除等功能,而且还具有保存等记忆功能,还具有清除,归零等功能。
它具有简单方便的特点,是人们在运用计算机时必不可少的一个工具。
第二章系统总体设计的概述
2.1单元电路设计
2.1.1单片机的复位
电路如图2.1所示。
RST:
复位输入,在RST输入端出现高电平时,实
复位和初始化。
当振荡器复位时,要保持RST脚两个机器周期的高电平时间。
在振荡运行的情况下,要实现复位操作,必须使RES引脚至少保持两个机器周期(24个振荡周期)的高电平,CPU在第二个机器周期内执行内部复位操作,以后每一个机器周期重复一次,直至RES端电平变低。
复位期间不产生ALE及PSEN信号。
内部复位操作使堆栈指示器SP为07H,各端口都为1(P0-P3的内容均为0FFH),特殊功能寄存器都复位为0,但不影响RAM的状态。
当RST引脚返回低电平以后,CPU从0地址开始执行程序。
图2.1(a)为加电自动复位电路。
加电瞬间,RES端的电位与VCC相同,随着RC电路充电电路的减少RES的电位下降,只要RST端保持10毫秒以上的高电平就能使单片机有效的复位,复位电路中的RC参数通常由实验调整。
当振荡频率选用12MHz时,电容器选10uf,电阻选4.7k,便能可靠地实现加电自动复位,若采用RC电路接斯密特电路的输入端,斯密特电路的输出端接单片机和外围电路的复位端,能使系统可靠地同步复位。
图2.1(b)为人工复位电路。
2.1.2振荡器特性
XTAL1:
反向振荡放大器的输入及内部时钟工作电路的输入。
XTAL2:
来自反向振荡器的输出。
XTAL1和XTAL2分别为反向放大器可以配置为片内振荡器。
石晶振荡和陶瓷振荡均可采用。
如采用外部时钟源驱动器件,XTAL2应不接。
有余输入至内部时钟信号要通过一个二分频触发器,因此对外部时钟信号的脉宽无任何要求,但必须保证脉冲的高低电平要求的宽度。
2.1.3显示及显示接口
本设计在显示部分采用的是HDSP-B03E,它是一个单行显示的液晶显示器。
其采用标准的12脚接口(图2.2)
它的读写操作、屏幕显示都是通过指令编程来实现的。
2.1.4键盘、液晶显示的组合接口
在单片机应用系统中为了控制系统的工作状态,以及向系统输入数据,应用系统有按键或键盘。
例如复位用的复位键,功能转换用的功能键以及数据输入用的数字键盘等。
按键或键盘中的每一个键都赋予特定的功能,它们通过接口电路与单片机相连。
通过软件了解按键的状态及键信息的输入,并转去执行该功能键的功能处理程序,键盘的接口方法有多种,但输入过程、软件结构基本是一样的。
对键盘上的每一个键,都有一个编号(即键号),CPU可采用中断方式或查询方式了解有无按键按下,并检查是哪一个按键按下,确定键号,将该键号送到累加器,然后通过散转指令转入执行该键的功能程序,最后返回到原处。
键盘接口和键输入软件中应解决的几个问题
●消除键抖动
按键的合断都存在一个抖动的暂态过程。
这种抖动的暂态过程约5-10ms的时间,人的肉眼是察觉不到的,但对高速的CPU是有反应的,可能产生误差处理,为了按键的动作一次,仅做一次处理,必须采取措施消除抖动。
消除抖动的措施有两种:
硬件消除和软件消除。
硬件消除抖动可采用简单的R-S触发器或单稳态电路构成。
软件消除抖动是用延时来躲过暂态抖动过程,执行一段大于10ms的延时程序后,再读取稳定的键状态。
●键编码及键值
一组按键或键盘都要通过I/O口线查询按键的开关状态。
根据键盘结构不同,采用不同的编码方法。
但无论有无编码,以及采用什么编码,最后都要转换成为与累加器中的数值相对应的键值,以实现按键功能程序的散转。
顺序排列键编码。
采用此种方法,键值的形成要根据I/O线的状态来做相应处理。
键码可按下式形成:
键码=行首键号+列号
●键盘的检测方法
对于计算机应用系统,键盘扫描只是CPU工作的一部分,键盘处理只是在有键按下时才有意义。
对是否有键按下的信息输入方式有中断方式与查询方式两种。
2.1.5行列式键盘工作原理
行列式键盘又称矩阵式键盘。
用I/O线组成行、列结构,按键设置行列的交点上。
例如4*4的行列结构可组成16个键的键盘。
因此在按键数量较多时,可节省I/O口线。
(1)行列式键盘的接口
行列式键盘的接口方法有很多。
例如直接接口与单片机的I/O口上;用扩展的并行I/O接口;用串行口扩展并行I/O接口;利用一种可编程的键盘、显示接口芯片进行接口等。
其中,利用扩展的并行I/O接口方法方便灵活,在单片机应用系统中比较常用。
(2)键盘工作原理
按键设置在行、列线的交点上,行、列线分别连接到按键开关的两端。
行线通过上拉电阻+5V,被置位在高电平状态。
对键盘的工作过程可分为两步:
第一步是CPU首先检测键盘上是否有键按下;第二步是识别哪一键按下。
检测键盘上有无按键按下可采用查询工作方式、定时扫描方式和中断工作方式。
2.2元器件清单
序号
元器件名称
参数规格
数量
1
万用板
150*90mm
1
2
STC89C52
1
3
液晶显示器
四位七段式
1
4
三极管8550
4
5
电阻
1k
8
6
电阻
4.7k
2
7
电容
10uf
1
8
电容
30pf
2
9
晶振
12MHz
1
10
复位按钮
17
2.3调试结果
2.3.1硬件调试
一、把电路板焊好后,先通过检查电路板表面检查是否有漏焊、错焊、接触不良等
二、编写检测程序检测矩阵扫描是否有硬件问题
三、上电后,屏幕初始化
四、计算。
按下数字键,屏幕显示要运算的第一个数字,在按下符号键,然后再按下数字键,屏幕显示要运算的第二个数字,最后按下“=”号键,屏幕上显示出计算结果。
2.3.2常见故障
逻辑错误,它是由设计错误或加工过程中的工艺性错误所造成的。
这类错误包括错线、开路、短路等。
元器件失效:
两方面的原因:
一是器件本身已损坏或性能不符合要求;二是组装错误造成元件失效,如电解电容、二极管的极性错误、集成电路安装方向错误等。
可靠性差:
引起可靠性差的原因很多,如金属化孔、接插件接触不良会造成系统时好时坏,经不起振动;走线和布局不合理也会引起系统可靠性差。
调试方法包括多级调试和联机调试。
在调试过程中要针对可能出现的故障认真分析,直至检查出原因并且排除。
第三章总结与体会
通过这段时间终于完成了计算器的设计,在本次设计的过程中,我们发现很多问题,也让我收获了很多。
单片机的设计重点在于软件程序的设计,需要有很巧妙的编程方法及反复的推敲与尝试,来验证程序是否合理。
程序只有在反复的写与读的过程中才能进一步的提高与完善。
电路的布局重点在于要符合设计原理,布局时不要太过于紧凑以防给焊接电路带来困难,出现误焊等现象。
焊接电路的重点在于不要出现虚焊、误焊等现象,还要讲究电路焊接的美观性及工艺性。
按钮的连接重点在于测试按钮时不按下按钮用电压表测量电压表发出蜂鸣声时,表明这两脚为同一电位点另外两个为另一个电位点,经测试发现同一电位点的两个管脚都相邻。
从此次的课题设计中,我们真真正正的意识到我们在动手能力方面的不足,在以后的学习及生活中我们要避免眼高手低,要积极动手实践,锻炼自己的动手能力。
要理论联系实际,把我们所学的理论知识用到实际当中,不做只会在纸上谈兵的赵括,我们要用理论指导实践,在实践中对理论知识加以理解补充,争取做一个知识与技能并存的人;在团队合作中要互相取长补短,弥补各自的不足;做事仔细认真;还要有独立思考能力和团队协作的精神,个人的能力固然重要,集体的力量更是伟大的。
我们要学会善用集体的力量,把集体中每一个人的才能发挥到最大。
附录1
软件程序
采用C语言编程:
#include
#defineuintunsignedint
#defineucharunsignedchar
ucharcodetable[]={0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80};//显示段码值12345678
ucharcodeseg[]={0xf7,0xfb,0xfd,0xfe};//分别对应相应的数码管点亮
ucharx,a,b,c,n,m,j,k;
voiddelay_ms(uinta)//延时函数
{
uniti;
while(a--!
=0)
{
for(i=0;i<600;i++);
}
}
ucharkeyscan(void)//键盘扫描函数,使用行列反转扫描法
{
ucharcord_h,cord_l;//行列值
P3=0x0f;//行线输出全为0
cord_h=P3&0x0f;//读入列线值
if(cord_h!
=0x0f)//先检测有无按键按下
{
delay_ms(30);//去抖
if(cord_h!
=0x0f)
{
cord_h=P3&0x0f;//读入列线值
P3=cord_h︳0xf0;//输出当前列线值
cord_l=P3&0xf0;//读入行线值
return(cord_h+cord_l);//键盘最后组合码值并返回
}
}return(0xff);//否则返回固定值0xff
}
voidxian()//显示按键
{
P0=table[x];
P2=seg[0];
delay_ms(30);
}
voidsxian()//显示结果
{
if(c>=10)
{
j=c/10;
k=c%10;
P0=table[j];
P2=seg[1];
delay_ms(30);
P0=table[k];
P2=seg[0];
delay_ms(30);
}
else
{
P0=table[c];
P2=seg[0];
delay_ms(30);
}
}
voidfuzhi()
{//赋值
if(n==0)
{
a=x;
}
if(n==1)
{
b=x;
}
}
voidjisuan()//计算
{
if(m==1)
{
c=a+b;
}
if(m==2)
{
c=a-b;
}
if(m==3)
{
c=a*b;
}
if(m==4)
{
c=a/b;
}
}
voidqingling()//清零
{
m=n=a=b=c=0;
}
voidmain()
{
ucharkey;
while
(1)
{
key=keyscan();//调用键盘扫描,
switch(key)
{
case0x7e:
x=0;fuzhi();xian();break;//0按下相应的键显示相对应的码值
case0x7d:
x=1;fuzhi();xian();break;//1
case0x7b:
x=2;fuzhi();xian();break;//2
case0x77:
x=3;fuzhi();xian();break;//3
case0xbe:
x=4;fuzhi();xian();break;//4
case0xbd:
x=5;fuzhi();xian();break;//5
case0xbb:
x=6;fuzhi();xian();break;//6
case0xb7:
x=7;fuzhi();xian();break;//7
case0xde:
x=8;fuzhi();xian();break;//8
case0xdd:
x=9;fuzhi();xian();break;//9
case0xdb:
m=1;n=0;break;//加
case0xd7:
m=2;n=0;break;//减
case0xee:
m=3;n=0;break;//乘
case0xed:
m=4;n=0;break;//除
case0xeb:
n=1;jisuan();sxian();break;//等于
case0xe7:
qingling();break;//清零
}
附录2
系统电路总体图
参考文献