基于单片机(AT89C51)的进制转换及进制计算器

闲来无事,用手头51单片机做个进制计算器

成品功能:能实现十进制带负数、带小数点的加减乘除,不同进制之间的转换,同一进制之间的加减乘。


材料

  • AT89C51开发板要带4x4矩阵按键,再带8个独立按键才够用
  • 用LCD18650显示
  • 杜邦线
  • 用keil4进行开发

开始制作。

制作过程

思考过程

首先要考虑的就是按键数量了:

  1. 十进制的加减乘除带符号和小数需要:0~9十个按键 + 加减乘除四个按键 + 加小数点符号两个按键 = 共16个按键。
  2. 不同进制之间转换需要:0~F十六个按键 + 2 8 10 16进制四个按键 = 共20个按键
  3. 进制之间加减乘需要:0~F十六个按键 + 2 8 10 16进制四个按键+ 加减乘三个按键 = 共23个按键
    这些还不算上回撤键和模式选择等按键。所以设计的时候必须考虑好按键。

我就得出来如下方案:

  1. 用独立按键做为模式选择:三个按键,选择模式之后不能返回,如果要返回可以用复位键。这样几个功能之间相互不联系,没有影响,按键就够用了。
  2. 然后十进制的加减乘除带符号和小数:用4x4按键做出来键盘既789+ 456- 123* 退格0=/ 用两个独立按键做小数点和符号按键。
  3. 不同进制之间转换:4x4按键做0~F既0123 4567 89AB CDEF,独立按键四个做进制选择既 2 8 10 16进制。
  4. 进制之间加减乘 :4x4按键做0~F既0123 4567 89AB CDEF,独立按键四个做进制选择既 2 8 10 16进制,独立按键四个做加减乘。

硬件部分

直接放图
如图所示连接P1接矩阵按键,P3接独立按键。

十进制的加减乘除带符号和小数

这里矩阵按键和独立按键怎么测值就不说了。

整数部分的加减乘除

  1. 将输入的数字连接起来,比如输入5、6,要连接成五十六,方法就是输入5存起来,再输入6,将存起来的数乘10再加上6存起来既五十加六,再输入7,再将存起来的数乘10再加上7存起来既五百六十加七。这样就将数字串起来了。
  2. 按符号之前和按符号之后分别存到不同的变量中。
  3. 当你按下等号之后,再去区别按下的符号是什么,让两次存的数做运算。

代码如下:

if(fuhao==1)//加
{sprintf(Disp,"%-6.3f",a_l+b_l); //将结果存在数组中方便显示//spintf将右边的字符串到左边数组中//%-6.3f为占位符既(1)表示靠左6位保留三位小数的浮点数lcdwrd_string(Disp,6); //显示
}
if(fuhao==2)//减
{sprintf(Disp,"%-6.3f",a_l-b_l);lcdwrd_string(Disp,6);
}
if(fuhao==3)//乘
{sprintf(Disp,"%-9.4f",a_l*b_l);lcdwrd_string(Disp,9);
}
if(fuhao==4)//除
{sprintf(Disp,"%-9.4f",a_l/b_l);lcdwrd_string(Disp,9);
}

这里直接显示运算结果,就避免了运算过程中产生的小数(两数相除)等数据类型问题。

负数问题

  1. 负数问题分情况来分析
  2. 如果两个数相加,都是负号的话结果也有负号,都没有负号的话结果也没有负号;一正一负的话哪个数大结结果的符号就是哪个。
  3. 两个数相减类似两个数相加。
  4. 两个数相乘,看有奇数个还是偶数个负号,奇数个的话结果是负数,偶数个的话结果是正数。
  5. 两数相除类似两数相乘。

小数问题

有小数点的话,我解决的方法是按完小数点之后记录小数点之后有几位,计算结果之前,让存起来的数乘0.1的多少次方。比如输入的3.1415,小数点之后有四位,存起来的数就是31415再四个0.1。

代码如下:

if(fhao_a==1){a_l = a*pow(0.1,a_wei)*(-1);}    //将结果保存到double精度的数中//有几位小数的话要乘0.1的几次方//负数的话要成-1
else {a_l = a*pow(0.1,a_wei);}
if(fhao_b==1){b_l = b*pow(0.1,b_wei)*(-1);}
else {b_l = b*pow(0.1,b_wei);}

部分效果如图。


这样十进制的加减乘除带符号和小数的问题就基本解决完了。

进制转换

思想

  1. 先将输入的数转换成十进制存起来。
  2. 然后再按照要求输出不同进制的数。
  3. 不同进制转10进制按权取数,比如:八进制的76,既6x8^0 +7x8^1 = 62。
    例如二进制的代码:fhao_a = fhao_a*2 + k;
  4. 10进制转不同进制除进制取余,比如:十进制62转八进制,62除8=7余数6,7除8=0余7,结果反过来写就是76。
    例如二进制的代码:
    while(biao!=0) //一位一位显示
    {
    lcdwrd(0x30+biao%2);
    biao=biao/2;
    }
  5. http://c.biancheng.net/view/142.html 可以参考这个网址。
  6. 显示要将数倒过来显示,正好可以从右向左。
    部分效果如图:
    八进制转十六进制

    八进制转二进制

    十六进制转十进制

    这样进制转换问题就基本解决完了。

同一进制之间加减乘

为啥不做除呐,因为按键不够。一除就会出现小数,没想明白怎么表示。

思想还是以十进制保存,然后再做运算,再转化为相应进制的数输出。按键不够用所以没法做不同进制之间的运算。

效果如图所示:
十六进制减

二进制加

最后附上完整的项目文件。自行下载。
https://download.csdn.net/download/weixin_42320020/16593760

这个项目到这里就算完了。
还有很多不足的地方,希望大佬可以指正。也希望和爱好者交流学习。


大家有想法可以私信或者留言,博主有时间会帮大家做一些项目。

禁止转载!!!
QQ:2039723308
VX:Shiboven

基于单片机(AT89C51)的进制转换及进制计算器相关推荐

  1. 单片机串口中断控制流水灯c语言,基于单片机AT89C51控制的中断控制流水灯_课程设计报告...

    <基于单片机AT89C51控制的中断控制流水灯_课程设计报告>由会员分享,可在线阅读,更多相关<基于单片机AT89C51控制的中断控制流水灯_课程设计报告(25页珍藏版)>请在 ...

  2. 【进制转换】负进制转换 多进制转换

    1.负进制转换 洛谷P1017 进制转换 负进制的转换和正进制的转换雷同,都是用短除取余法,这里要保证余数都要是正数才行: 要想让本来余数是负数变为正数,其实很好操作,就直接让商+1,余数-(相应的进 ...

  3. 利用10位AD转换器 及 LED 数码管,实现由AD转换器采集温度,并用数码管显示。温度超出一定范围,LED 指示灯闪烁报警。(主要分析进制16进制转换10进制,并用数码管显示问题)

    ** 题目: ** 利用原有的电路 AD 及 LED 数码管显示等例子,进行整合.实现由 AD转换器采集温度(用可调电阻模拟),温度在数码管上显示.当温度超出一定范围,用 LED 指示灯进行闪烁报警. ...

  4. 讲清楚进制转换、进制计算那些事 —— 二进制转换十进制、十六进制

    讲清楚进制转换.进制计算那些事 信息在计算机中的表示 1.易于物理实现 2.可靠性高 3.运算规则简单 数制及其不同进制之间的转换 1.常用进制数及其对应关系 表 1-2 常见进制数所使用的基本符号 ...

  5. Python进制转换10进制转换为16进制,不使用hex函数

    笔试中遇到的问题 Python进制转换10进制转换为16进制,不使用hex函数 给定一个整数,编写一个算法将这个数转换为十六进制数.对于负整数,我们通常使用 补码运算 方法. 注意: 十六进制中所有字 ...

  6. HDU2031 进制转换【进制】

    问题链接:HDU2031 进制转换.这是一个入门训练题,自然用C语言编写程序. 问题简述:参见上述链接. 问题分析:(略). 程序说明:需要注意的一点是,将一个10进制数转换为2进制的话,字符串可能很 ...

  7. 10进制转换16进制补足0_信息技术教师资格必考内容——进制换算(一)

    前两天给大家整理了信息技术教师资格笔试科目三的必考内容,戳蓝字回顾弄懂这些,信息技术教师资格笔试提高30分!信息技术教师资格笔试--这道20分的题居然这么简单!有小伙伴问还有哪些必考内容进制换算也是必 ...

  8. JSK-127 进制转换【进制】

    进制转换 相信你知道2进制,16进制吧?是否听说过7进制呢?或者9进制? 10进制转2进制是挺简单的,那么转其他进制呢? 没错,右侧的代码实现10进制数到任意进制(2~9)的转换,试试修改吧- 修改后 ...

  9. 进制转换——36进制

    题目:进制转换类 题目描述 将M进制的数X转换为N进制的数输出. 输入 第一行,一个整数T,代表测试数据组数. 接着T行,输入32位二进制数 输出 输出X的N进制表示的数. 测试样例 输入 10 2 ...

最新文章

  1. Html5 Json应用
  2. VC2008下编译使用OpenSSL
  3. c#_Func和Action委托简介
  4. Python selenium 滑块验证--分析与实现
  5. jquery判断checkbox是否选中及改变checkbox状态
  6. c语言题-牛牛做水题
  7. android 自定义view实现拖动放大缩小_自定义itemCheckView
  8. 基于VHDL自动售邮票机设计
  9. dbf文件怎么创建_ThinkPHP6开发博客实战入门(三),创建admin后台入口
  10. php 5.5 xhprof for windows
  11. OpenCV-图像处理(24、直方图计算)
  12. c语言编程有限次数猜数游戏,用c语言编程猜数字
  13. word输入带圈字符快捷键(0-20)
  14. java利用梦网云通讯发送短信
  15. html怎么置顶图像,css怎么固定图片位置不变?
  16. easyphp(xctf)
  17. RSA算法详解与举例
  18. 【无标题】2021年烷基化工艺证考试及烷基化工艺操作证考试
  19. Unity 3D 图形学 Shader之顶点与片段着色器(五)
  20. 多个Ajax请求成功后再执行后续方法

热门文章

  1. Verilog快速入门(13)—— 用3-8译码器实现全减器
  2. 渗透测试工程师都需要什么工具呢?网络安全(三)
  3. 探究js中arguments
  4. 利用JAVA多线程模拟售票系统,对统一资源进行处理
  5. 【Jlink烧录自动化】一台电脑连接 多个Jlink 用 J-flash批处理程序烧写多个单片机(生产批量烧录)
  6. 【Pytorch-从一团乱麻到入门】:4、模型效果评估指标:ROC-AUC、PR-AUC及可能遇到的问题(1)
  7. 开源与标准协同发展研究报告(2022)
  8. Flink之Trigger
  9. 【无标题】宅家抗疫也风流
  10. a卡gpuz,MSI Afterburner显卡不显示温度,启动OverdriveNTool提示atiadlxx.dll不存在的错误