这个51单片机多功能科学计算器项目,是我去年帮电子系学弟做毕业设计时折腾出来的玩意儿。别看它体积小,功能可一点不含糊——除了基础四则运算,还能搞定三角函数、对数、指数、开方等科学计算,甚至支持简单的统计运算。最让我自豪的是,整套系统成本控制在50元以内,比市面上的科学计算器便宜了不止一个数量级。
选择51单片机作为核心,主要是考虑到教学和入门开发的友好性。STC89C52这颗老将虽然性能比不上ARM,但胜在资料丰富、开发简单,特别适合学生党练手。整个项目从电路设计到代码编写,一个人两周就能搞定,对想入门嵌入式开发的朋友来说是个绝佳的练手项目。
主控芯片最终选定STC89C52RC,主要基于三点考虑:
显示部分用了经典的1602液晶屏,相比数码管有以下优势:
键盘矩阵采用4x4薄膜按键,布局参考了卡西欧计算器:
code复制[7][8][9][÷]
[4][5][6][×]
[1][2][3][-]
[0][.][=][+]
实际焊接时发现薄膜按键容易接触不良,后来改用了机械按键,手感更清脆可靠。
电源部分特别加了AMS1117-3.3V稳压芯片,虽然51单片机用5V供电,但预留3.3V接口方便后续升级。实测发现,当使用USB转TTL下载程序时,最好断开稳压芯片输出,否则容易导致下载失败。
LCD背光电路有个小技巧:在VCC和背光阳极间串联一个100Ω电阻,既能保证亮度又不会过流。有次忘记加这个电阻,连续工作半小时后屏幕就开始发烫。
矩阵键盘的消抖处理很关键,我采用了硬件+软件双重方案:
整个系统采用状态机模型,主要状态包括:
运算核心采用逆波兰算法实现,具体流程:
c复制while(有输入字符){
if(是数字) 压入数字栈;
else if(是运算符){
while(栈顶运算符优先级≥当前运算符)
弹出栈顶运算符并计算;
当前运算符入栈;
}
}
while(运算符栈不空) 弹出栈顶计算;
三角函数的实现最有意思,因为51单片机没有FPU,所有浮点运算都得软件模拟。我采用了查表法+泰勒展开的混合方案:
c复制float sin_taylor(float x){ // x in radians
return x - x*x*x/6 + x*x*x*x*x/120;
}
实测最大误差不超过0.001,完全满足教学用途。
51单片机仅有256字节RAM,内存管理必须精打细算:
有个坑我踩了两次:局部变量数组不要超过30字节,否则容易导致堆栈溢出。后来改用全局数组后问题解决。
最初使用keil自带的浮点库,发现连续运算后误差累积严重。改进方案:
当处理复杂运算时,按键响应会有明显延迟。通过以下优化将响应时间控制在50ms内:
在进行连续运算时屏幕会出现闪烁,解决方法:
后来应导师要求增加了统计功能,可以计算:
通过模式切换键可进入单位换算子菜单:
c复制void (*conv_func[])(void) = {deg2rad, hex2dec, inch2cm};
经过实际使用测试,总结出几个改进方向:
电源部分可以升级为锂电池+充电管理,实测整机工作电流仅15mA,800mAh电池可连续使用50小时以上。如果加入自动关机功能,待机时间还能延长数倍。