cnCalc计算器论坛

 找回密码
 注册
搜索
查看: 6313|回复: 3

[贴图] 【51单片机上的】函数型计算器

[复制链接]
发表于 2014-9-6 14:49:25 | 显示全部楼层 |阅读模式
本帖最后由 cnzym 于 2014-9-6 14:55 编辑

南京某大学计算机专业大二生一枚……今年(2014年)暑假开始学习8051系列单片机。短学期作业是MFC科学计算器,由此启发,制作了一个51单片机上的函数计算器。

刚开始设计时,有两个方向:
第一个方向是卡西欧fx-350MS之类函数计算器的风格,即完整输入中缀表达式后按EXE统一进行计算;
第二个方向是夏普EL-501单行计算器的风格,即每输入一个运算符就会返回堆栈中的临时结果,并且对于一元函数采用后缀式输入,请参考维基百科
http://en.wikipedia.org/wiki/Calculator_input_methods#Immediate_execution
考虑之后觉得选择第二个方向比较好:一是1602液晶屏显示字符数太少;二是51单片机RAM极其有限,恐怕不能胜任复杂一点的字符串处理。

关于EL-501计算器,请参考夏普官网介绍:
http://sharp-world.com/products/calculators/sc_calculator/el-501x/index.html

市面上有很多廉价的基于EL-501的山寨计算器,下面这台就是今年春天在淘宝上以10元的价格买到的……

可见,从键盘到屏幕,和夏普EL-501一模一样。


/////////////////////////////////////////////////////////////////////////////////////////////////

下面介绍自制的51单片机上函数计算器。

手上只有一块开发板、一块STC90C516RD+单片机、一块1602LCD、一个红外接收管和一个遥控器。

因为16键矩阵键盘按键太少,所以选择了很常见的红外遥控器如下图:


定义对应功能如下图所示:


开发板如下图:



编写MFC计算器时,曾经用这样一个表达式测试其功能:
5^2+ln(exp(10))*sqrt(100)+(1+(23*2-3)-sqrt(16))

结果是165。

上电复位,初始化显示是这样的
第一排是状态栏,Deg代表角度状态,R代表Ready,就绪,表示现在可以输入数字。



输入第一个数字‘5’……可见右上角R变成了I,代表输入状态,此时可以接受运算符和一元函数。
现在的输入进度是:5……^2+ln(exp(10))*sqrt(100)+(1+(23*2-3)-sqrt(16))



输入乘方符号(2ndF + *),右上角即显示“^”,提示可以输入乘方的第二个操作数,也就是2.
现在的输入进度是:5^……2+ln(exp(10))*sqrt(100)+(1+(23*2-3)-sqrt(16))



输入到第一个加号时,自动计算出乘方运算结果,25
现在的输入进度是:5^2+……ln(exp(10))*sqrt(100)+(1+(23*2-3)-sqrt(16))



输入到第二个加号时,自动计算出乘方运算结果,125。
对于一元函数,本计算器采取后缀输入方式,即
如果要计算sqrt(100),需要先输入100,再输入√
现在的输入进度是:5^2+ln(exp(10))*sqrt(100)+……(1+(23*2-3)-sqrt(16))



现在的输入进度是:5^2+ln(exp(10))*sqrt(100)+(1+(23*2-……3)-sqrt(16))
“B02”代表当前还有两个右括号没有输入。



全部输入完成之后,按“=”,得出结果165.
5^2+ln(exp(10))*sqrt(100)+(1+(23*2……-3)-sqrt(16)) == 165



下面这幅图演示错误提醒,以左括号为例……
若刚刚输入一个数字就输入左括号,会提示出错。



“关于”界面……


源代码在此:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x

评分

参与人数 1金钱 +3 专家 +1 收起 理由
ZephRay + 3 + 1 很给力!

查看全部评分

发表于 2014-9-7 20:14:12 | 显示全部楼层
大角虫!!!
发表于 2014-9-7 20:53:09 | 显示全部楼层
好吧……留一个膝盖就是了……
打码什么的完全没必要,因为可以从源代码偷窥(喂
发表于 2015-12-15 23:24:00 | 显示全部楼层
很好
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|cnCalc计算器论坛

GMT+8, 2024-11-21 23:49 , Processed in 0.074974 second(s), 20 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表