单片机计算器,计算结果不准确为什么?

作者&投稿:宓裴 (若有异议请与网页底部的电邮联系)
51单片机的计算器计算结果会不会有误差?~

浮点数计算有误差,整数计算没有误差。你的算法如果采用了浮点计算,就会有误差,为了减小误差,可采用双精度型浮点运算。不过,对于单片机而言,这个要求太高了。
另外,也可检查一下程序,应该不会有这么大的误差。

//程序测试通过
//能使用的功能:输入K1(+,-,*,/)K2,按=得到结果,然后按on/c或0重新开始
//不能输入K1+K2+K3或者类似的输入,这种输入导致程序出错
//计算除法的时候不能显示小数,如5/3得到的结果是1
#include
unsigned char code tab[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
sbit P2_0=P2^0;
sbit P2_1=P2^1;
sbit P2_2=P2^2;
sbit P2_3=P2^3;
sbit P2_4=P2^4;
sbit P2_5=P2^5;
sbit P3_4=P3^4;
sbit P3_5=P3^5;
sbit P3_6=P3^6;
sbit P3_7=P3^7;
long int n=0;
unsigned int flag;
void display();
void delay();
void keyboard();
main()
{
//m1,m2分别保存第一次和第二次输入的两个数据
//当m1,m2的输入值超过999999时,此时将其情0
long int m1,m2;
P2=0xff;
while(1)
{
//检测输入的第一个数据
while(1)
{
display();
keyboard();
if(n>999999) n=0;
P3=0xf7;
if(P3_7==0) {flag=1; while(!P3_7); m1=n; n=0; break; }
P3=0xfb;
if(P3_7==0) {flag=2; while(!P3_7); m1=n; n=0; break; }
P3=0xfd;
if(P3_7==0) {flag=3; while(!P3_7); m1=n; n=0; break; }
P3=0xfe;
if(P3_7==0) {flag=4; while(!P3_7); m1=n; n=0; break; }
}
//检测输入的第二个数据
while(1)
{
display();
keyboard();
if(n>999999) n=0;
P3=0xf7;
if(P3_6==0) {m2=n; break;}
}
//计算结果,将其保存在n中然后进行显示,注意当n的值太大超过4字节时,此时显示乱码
while(1)
{
if(flag==1) n=m1+m2;
if(flag==2) n=m1-m2;
if(flag==3) n=m1*m2;
//由于类型原因,计算结果没有小数
if(flag==4) n=m1/m2;
if(n>999999) n=0;
display();
P3=0xf7;
//计算完成之后,可以用on/c或者是0进行清0,然后进行下一轮计算
if(P3_4==0||P3_5==0) {n=0;break;}
}
}
}
void keyboard()
{
//检测第一行的按键
P3=0xfe;
if(P3_4==0)
{
n=n*10+7;
while(!P3_4);
}
if(P3_5==0)
{
n=n*10+8;
while(!P3_5);
}
if(P3_6==0)
{
n=n*10+9;
while(!P3_6);
}
//检测第二行的按键
P3=0xfd;
if(P3_4==0)
{
n=n*10+4;
while(!P3_4);
}
if(P3_5==0)
{
n=n*10+5;
while(!P3_5);
}
if(P3_6==0)
{
n=n*10+6;
while(!P3_6);
}
//检测第三行的按键
P3=0xfb;
if(P3_4==0)
{
n=n*10+1;
while(!P3_4);
}
if(P3_5==0)
{
n=n*10+2;
while(!P3_5);
}
if(P3_6==0)
{
n=n*10+3;
while(!P3_6);
}
P3=0xf7;
if(P3_5==0)
{
n=n*10+0;
while(!P3_5);
}
}
//显示子程序
void display()
{
P0=tab[n%10];
P2_5=0;
delay();
P2_5=1;
P0=tab[n/10%10];
P2_4=0;
delay();
P2_4=1;
P0=tab[n/100%10];
P2_3=0;
delay();
P2_3=1;
P0=tab[n/1000%10];
P2_2=0;
delay();
P2_2=1;
P0=tab[n/10000%10];
P2_1=0;
delay();
P2_1=1;
P0=tab[n/100000];
P2_0=0;
delay();
P2_0=1;
}
void delay()
{
int i;
for(i=0;i<500;i++);
}

看了下,大概明白您的计算器能有些什么功能:是不是就是一个不带括号的四则计算器啊(但看程序,您可能想设计一个带括号的)?而且是不是当输入数字、按下运算符后(但不知道您按那个键出发in_put函数),启动计算过程,而且计算结果参与下一次计算?
如果这样,可能你第二次进行计算就会出错,因为您的“K”变量是一个局部变量,每次调用“in_put”函数后,依照计算次数,最新的输入数据会存储在sum(p),但你这次计算时,使用的是sum(k),而当您使用sum(k)时,k=0,所以实际上每次您都在使用sum(0)在进行计算。
而且,我很好奇,您为什么设计连加、连减等功能?
其实,自己使用单步仿真就能知道哪里出问题了。试试吧!


计算器怎么计算分数
如果是普通计算器,直接用分子除以分母,显示结果为小数,如果是多功能的,也是这样输入,现在好多还能直观按自然书写输入显示,通过转换键可以得到小数或者分数答案。如果用手机算分数,“计算机”是电脑,专门用来算数学题的那种叫“计算器”。计算器上有个“a\/b”(注意了,是a\/b键,,看清楚了),那个就...

常用计算器工具有哪些
详细>>通用计算器函数计算器金融计算器图形计算器Casio\/卡西欧JW-200SC商务计算器日常商务办公时尚可爱送礼超薄计算机¥129月销:200+店Casio卡西欧旗舰店>>得力计算器837经济型太阳能双电源计算机¥10.94个商家月销:3万+店得力旗舰店>>得力自营旗舰店>>¥16得力康乐专卖店>>¥24.9得力展翔专卖店>>¥...

计算器什么原理进行计算?
计算器一般由运算器、控制器、存储器、键盘、显示器、电源和一些可选外围设备组成。低档计算器的运算器、控制器由数字逻辑电路实现简单的串行运算,其随机存储器只有一、二个单元,供累加存储用。高档计算器由微处理器和只读存储器实现各种复杂的运算程序,有较多的随机存储单元以存放输入程序和数据。键盘是计算器的输入...

计算器十一x÷是什么键
叫做运算符号键。+是加号键,-是减号键,×是乘号键,÷是除号键。四个键位都是最基本的数学加减乘除算法使用的。实物计算器,此类计算器一般是手持式计算器, 便于携带, 使用也较方便, 但一般情况下, 功能较简单, 也不太方便进行功能升级,也有少部功能强大的图形式手持计算器。但由于价格最贵, 在...

计算器的功能类型
一般都是实物计算器②科学型计算器——可进行乘方、开方、指数、对数、三角函数、统计等方面的运算,又称函数计算器。 可以是软件,也可以是实物。 ③程序员计算器——专门为程序员设计的计算器, 主要特点是支持And, Or, Not, Xor: 最基本的与或非和异或操作, 移位操作 Lsh, Rsh:全称是Left ...

计算器什么牌子好?
第一名:1、CASIO卡西欧计算器 隶属于卡西欧计算机株式会社,始于1946年日本,世界领先的提供电子消费产品和商务解决方案的知名厂商。卡西欧一直秉持“创造贡献”的经营理念,运用其跨时代的先进电子科技,为用户提供各种创新产品。今天,卡西欧为用户提供的产品种类已扩展到腕表、数码相机、电子辞典、计算器、...

计算器的种类有哪几种
也可以是实物。③程序员计算器——专门为程序员设计的计算器, 主要特点是支持And, Or, Not, Xor: 最基本的与或非和异或操作, 移位操作 Lsh, Rsh:全称是Left Shift和Right Shift,也就是左移和右移操作。④ 统计计算器-- 为有统计要求的人员设计的设计的计算器, 可以是软件,也可以是实物。

计算器有哪些分类
Windows计算器是电脑系统中自带的计算器,可以在简易计算器和科学型计算器之间进行切换。打开方式有三种,1. 开始-程序-附件-计算器。2. 开始-运行-输入"calc"-回车。3. 通过网页调用本机程序实现在线计算器的所有功能。常用电子计算器一般是手持式计算器, 只是简单的计算工具,有些机型具备函数计算功能...

OPPO r11计算器怎么查计算记录?
一、首先在OPPO R11手机桌面点击“计算器”图标,如下提示。二、 进入OPPO R11手机的计算器界面以后,点击下图红框内的符号进入,如下图所示。三、这样就可以查询到计算器使用的记录了,如下图所示。

如何用计算器算对数?
一般的计算器,只有10进对数lg x和以e为底的自然对数ln x 可用;为了计算以m为底n的对数log m n,(m>1的正整数)必须应用换底公式:令:y=log m n,m^y=n,两边取10进对数:lg m^y = lg n -> ylg m = lg n 解出: y = lg n \/ lg m (1)同样: y = ln n ...

南安市18691046940: 单片机编写计算器的程序,得数显示的不正确有哪些原因 -
贯莲木瓜: 肯定是程序编得不对了,呵呵,不要不好意思,将你的程序贴上来,帮你诊断诊断.

南安市18691046940: 51单片机的计算器计算结果会不会有误差? -
贯莲木瓜: 浮点数计算有误差,整数计算没有误差.你的算法如果采用了浮点计算,就会有误差,为了减小误差,可采用双精度型浮点运算.不过,对于单片机而言,这个要求太高了. 另外,也可检查一下程序,应该不会有这么大的误差.

南安市18691046940: 我的科学计算器为什么算的结果不准? -
贯莲木瓜: sin,cos之类的的确跟设置有关,mode中选择Deg,再试试. 另外,fx-es系列通过同时按住shift 7 on可以进入自检模式,再按一下on就可以清空所有设置. fx-ms系列可以通过shift-mode(clr)-3-=来清空所有设置.

南安市18691046940: 我用的计算器经常失灵 计算结果不正确 要怎么样验证计算器是否失真 -
贯莲木瓜: 最好的办法是用1/3=0.333333333........,不管是几位的,你看是不是这个数,如果是,说明你计算器是正确的,如果不是,则你的计算器就是失真的.

南安市18691046940: 我用的计算器经常失灵 计算结果不正确 要怎么样验证计算器是否失真我用的计算器经常失灵 计算结果不正确 要怎么样验证计算器是否失真 -
贯莲木瓜:[答案] 最好的办法是用1/3=0.333333333.,不管是几位的,你看是不是这个数,如果是,说明你计算器是正确的,如果不是,则你的计算器就是失真的.

南安市18691046940: 我的计算器不知道怎么的,算三角函数的值不准,这是为什么啊?急啊!快告诉我啊!! -
贯莲木瓜: 应该是你角度的单位设置错了计算器屏幕最上方有显示你所选择的单位:D是角度;R是弧度;G是百分度设置:Shift+Mode(就是Setup)3: Deg 角度4: Reg 弧度5: Gra 百分度根据你的需要设置咯~比如算sin60°一定要在角度模式,sin(π/3)要在弧度模式,在其他模式中就不对咯

南安市18691046940: 为什么我的计算器算平方差老算不准?
贯莲木瓜: 有些计算器计算顺序是即输即算的,没考虑到先乘除后加减的运算优先等级法则,这种计算器一般无“(”,“)”键.如,你本来想算5*5-3*3的结果的,但按顺序计算时,得到(5*5-3)*3=66的结果. 但有些科学型计算器就能识别到运算优先等级法则,这种计算器一般有“(”,“)”键.电脑上也附代有计算器.(开始->程序->附件->计算器)使用时,在“查看”中若选“标准型”,就是上面所说的第一种计算器,若选“科学型”,就是上面所说的第二种.

南安市18691046940: 为什么计算结果不正确?
贯莲木瓜: 1、d=b+d;这个你本来是想表示d=y+b的吧;2、那个printf语句中你直接写:printf("c=%d,d=%d\n",c,d) 3、还有就是你在定义时,x,y是长整型、而a,b,c,d,是整型;数据类型不一致,输出的时候还用%d,搞混了,前面应用强制类型转换运算符.

南安市18691046940: 为什么单片机定时不准??? -
贯莲木瓜: 理论上没错. 但是,定时10us,时间太短了.中断、返回,重新装入初始值,期间还要把一个变量加一,压栈... C语言,10us不够用的. 汇编速度快,10us也未必够.根本没有时间去检测 if(Time10usFlag>=12) ,单片机净顾着忙活中断了.

南安市18691046940: 单片机频率计如何计算更精确? -
贯莲木瓜: 展开全部//定时器1工作于定时方式,方式1,定时器0工作于计数方式,方式1 方式1不太好,每触发一次中断,需要重新赋初值,有时间浪费,累积多了,就会有偏差,用方式2,8位自动重装方式较好.如果要求十分精确,最好使用时钟芯片.

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网