基于单片机的计算器

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

基于单片机的计算器编程语言用的是C语言。要做好计算器,4KB的程序存储空间已经不够用了,所以这里没有用51单片机,这里用的是AT89S52,拥有8KB程序存储空间。第一次写这种文章,写的不对的地方请大家提出来我好修改。实现功能:1、一定数值范围内的加减乘除、开方、倒数运算,能计算小数、负数,以及记忆功能。2、时钟功能,能直接用键盘上的数字键设置时间,一定时间内无操作能自动显示时间。3、闹铃功能及可控制的按键声音。基本思路:每按一个按键,单片机做出一个反应。计算的过程实际上就是对以下对象进行操作:比如2+4=6。写程序时脑中要时常想着这张图片,弄清除现在该对哪个对象进行操作。比如:用h1,h2,h3,h4分别存放数1、符号、数2、结果,刚开始输入时是对h1进行操作,将输入的数存入h1内,当按下一个”+”,用h2存放”+”代表的值,再次输入数字时就是对h3进行操作,最后按下等号就是将h1+h3的值赋给h4,并清空h1、h2、h3。但如果最后不是按下的等号,而是又按下了一个运算符号呢?这是就要想我们用计算器时这样操作是希望干什么,我们是希望将上一个运算结果接着用在下一个运算中,这时就不将h1+h2赋给h4了,而是赋给h1。假设又一次按下的是”-”,判断h2的值得知前一次按下的是加号,于是执行h1=h1+h3;,并将这次按下的减号存入h2。于是就构成了“上次运算结果(h1)”减(h2)“等着输入的数(h3)”,又处于上面第一次运算按下”+”时的状态了。像这样就可以无限计算下去,直到按下等号,将最终结果存入h4,整个计算结束。硬件电路:下面是方框图:个人认为数字电路虽然连线多,但非常容易理解,元器件的值也不像模拟电路中那样必须为多少,在一定范围内可为任意值。详细电路:数码管用的是两个共阳极的四连体。S8550为PNP型三极管,发射极接VCC,集电极接数码管公共端,基极通过电阻接单片机IO口,这里是P2口。低电平时导通。P2口与三极管基极之间的电阻这里用的是10K的,估计600~60K都行,用的越大越省电,对亮度几乎没有影响。对亮度影响大的是P0口与数码管之间的电阻,这里用的510K。键盘是普通的矩阵按键。程序设计:1、计算部分:计算流程图如下:这里输入一个符号指的是“加减乘除”任意一个。前面说过,用分别用两个变量存输入的数,一个变量符号,一个变量结果。比如h1、h2、h3、h4。输入的数是存到h1还是h3中,就要判断h2的值,若h2=0,存入h1中,反之存入h3中,h2=0表示没有输入符号。最后一个运算结果很特殊,与之前的运算结果是用不同的变量来存放的,基本思路中提到过,之前的是存在h1中用来参与紧接着的运算。按了等号之后是存在h4中,清空h1,h2,h3等待再一次全新的运算。输入一个数时显示输入的那个数,数入一个符号时是显示h1中的数,即参与运算在这个符号之前的数。按了等号后显示h4中的数。在这里说一下数码管显示,定义一个有8个值的数组,如x[8],这八个数分别对应每个数码管,扫描中就是让P0口分别等于这8个数,这样改变x[8]中的值就能改变数码管显示。显示一个数是通过一个函数实现,这个函数根据传入的数值改变x[8]中各成员的值达到显示目的。开方与求倒数也是判断各h的值,来确定是对哪个数操作,与按数字键类似。看的同时想象自己在使用计算器,应该就好理解这个图了。2、时间部分:与普通数字钟设计相似,这里只说明下时间设置部分。通过一个bit变量sjtz的值0与1,判断是否进入了时间设置模式,长按“时间”可切让sjtz=1,为1时让数码管闪烁显示时间,用另一个bit型变量sjtzdx判断调整的对象及闪烁的对象。通过按键“时”、“分”改变sjtzdx的值。处于时间调整模式时,再按数字键,是将输入的数存入调整的对象里,用判断语句可以实现。短按时间让sjtz=0,退出时间调整模式。闹钟调整与时间调整类似,另设一组变量存放闹钟时间,判断当闹钟时间与时间相等时让定时器1开始工作(TR=1;),同时有一个变量从0开始每分钟加1,达到30后让定时器1停止。定时器1内就是让蜂鸣器按自己设定的规律响起的代码。3、按键与按键声音部分我是用普通的翻转法扫描的键盘,每个按键对应一个唯一的值。很多同学问我是怎么实现长按、短按的,其实很简单,基本的思想就是当有键被按下时有一个变量从0开始累加,当没有键被按下时,让它等于0。如uk,在对应的键被按下且uk=0时执行一段代码,这不就是短按吗,当uk=100时再执行一段另外的代码就是长按了。图中k=0表示没有按下任何键,我的程序中是用k=32表示的。其实最初设计时有一个问题,就是按下一个键时,由于对于人来说单片机速度很快,只希望执行一次的代码被执行了多次,为了解决这个问题加入了uk这个变量,只当uk=0时对应代码才执行,后来很容易就想利用uk的累加实现长按。按键声音也很简单,用一个bit型变量sykz控制声音的开关,当k!=0且sykz=1时让蜂鸣器响一会儿。我是通过长按“声音”按键切换sykz的值。成果展示:刘言2009/11/25

1 / 6
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功