找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2179|回复: 3
打印 上一主题 下一主题
收起左侧

51单片机设计高级计算器

[复制链接]
跳转到指定楼层
楼主
ID:268235 发表于 2017-12-28 11:33 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
目前只能实现加减乘除的简单运算,想加函数运算和开方进去,用独立按键来操作,但是不知道函数运算和开方的代码该怎么写,目前只写了部分代码,有大神可以发些资料参考一下吗?

  • #include<reg52.h>
  • #include<stdlib.h>
  • #define uchar unsigned char
  • #define uint unsigned int
  • #define lcd P0
  • #define key P3
  • void write_com(uchar com);
  • void write_dat(uchar dat);
  • void delay(uchar z);
  • void Init_lcd();
  • void keyscan1();
  • void keyscan2();
  • void keyscan3();
  • void keyscan4();
  • void count_add();
  • void count_sub();
  • void count_mul();
  • void count_div();
  • void show_int();
  • void show_float();
  • sbit RS=P1^0;
  • sbit RW=P1^1;
  • sbit E=P2^5;
  • uchar temp,i=0,a=0,b=0,c=0,d=0,e=0,f=0,g=0;
  • long num,num1,num2,num3,value,value1;
  • uchar table[10];
  • uchar table2[10];
  • uchar table3[10];
  • uchar table4[10];
  • uchar code table1[]="0123456789";
  • void main()
  • {
  •         Init_lcd();
  •         while(1)
  •         {
  •           keyscan1();
  •           keyscan2();
  •           keyscan3();
  •           keyscan4();
  •         }
  • }
  • void keyscan1()
  • {
  •   key=0xfe;
  •         temp=key;
  •         temp=temp&0xf0;
  •         if(temp!=0xf0)
  •         {
  •                 delay(10);
  •                 temp=key;
  •           temp=temp&0xf0;
  •                 if(temp!=0xf0)
  •                 {
  •                         switch(temp)
  •                     {
  •           case 0xe0:
  •                                                         if(f==0)
  •                                                                                 {
  •                                                           if(e==0)
  •                                                             table='1';
  •                                                     if(e==1)
  •                                                             table2='1';
  •                                                                            }
  •                                                                                 if(f==1)
  •                                                           table3='1';
  •                                                                                 if(f==2)
  •                                                           table4='1';
  •                                                                                  write_dat('1');
  •                                                   break;
  •                                         case 0xd0:
  •                                                         if(f==0)
  •                                                                                 {
  •                                                           if(e==0)
  •                                                              table='2';
  •                                                     if(e==1)
  •                                                              table2='2';
  •                                                                           }
  •                                                                                 if(f==1)
  •                                                           table3='2';
  •                                                                                 if(f==2)
  •                                                           table4='2';
  •                                                   write_dat('2');
  •                                                   break;
  •                                         case 0xb0:
  •                                                         if(f==0)
  •                                                                                 {
  •                                                           if(e==0)
  •                                                             table='3';
  •                                                     if(e==1)
  •                                                             table2='3';
  •                                                                           }
  •                                                                                 if(f==1)
  •                                                           table3='3';
  •                                                                                 if(f==2)
  •                                                           table4='3';
  •                                                   write_dat('3');
  •                                                   break;
  •                                         case 0x70:
  •                                                         if(f==0)
  •                                                                                 {
  •                                                           if(e==0)
  •                                                              table='4';
  •                                                     if(e==1)
  •                                                              table2='4';
  •                                                                           }
  •                                                                                 if(f==1)
  •                                                           table3='4';
  •                                                                                 if(f==2)
  •                                                           table4='4';
  •                                                   write_dat('4');
  •                                                   break;
  •         }
  •                                 i++;
  •                                 while(temp!=0xf0)
  •                                 {
  •                                         temp=key;
  •                 temp=temp&0xf0;
  •         }
  •                 }
  •         }
  • }
  • void keyscan2()
  • {
  •   key=0xfd;
  •         temp=key;
  •         temp=temp&0xf0;
  •         if(temp!=0xf0)
  •         {
  •                 delay(10);
  •                 temp=key;
  •           temp=temp&0xf0;
  •                 if(temp!=0xf0)
  •                 {
  •                         switch(temp)
  •                     {
  •           case 0xe0:
  •                                                         if(f==0)
  •                                                                                 {
  •                                                           if(e==0)
  •                                                              table='5';
  •                                                     if(e==1)
  •                                                              table2='5';
  •                                                                           }
  •                                                                                 if(f==1)
  •                                                           table3='5';
  •                                                                                 if(f==2)
  •                                                           table4='5';
  •                                                   write_dat('5');
  •                                                   break;
  •                                         case 0xd0:
  •                                                         if(f==0)
  •                                                                                 {
  •                                                           if(e==0)
  •                                                              table='6';
  •                                                     if(e==1)
  •                                                              table2='6';
  •                                                                           }
  •                                                                                 if(f==1)
  •                                                           table3='6';
  •                                                                                 if(f==2)
  •                                                           table4='6';
  •                                                   write_dat('6');
  •                                                   break;
  •                                         case 0xb0:
  •                                                         if(f==0)
  •                                                                                 {
  •                                                           if(e==0)
  •                                                              table='7';
  •                                                     if(e==1)
  •                                                              table2='7';
  •                                                                           }
  •                                                                                 if(f==1)
  •                                                           table3='7';
  •                                                                                 if(f==2)
  •                                                           table4='7';
  •                                                   write_dat('7');
  •                                                   break;
  •                                         case 0x70:
  •                                                         if(f==0)
  •                                                                                 {
  •                                                           if(e==0)
  •                                                              table='8';
  •                                                     if(e==1)
  •                                                              table2='8';
  •                                                                           }
  •                                                                                 if(f==1)
  •                                                           table3='8';
  •                                                                                 if(f==2)
  •                                                           table4='8';
  •                                                   write_dat('8');
  •                                                   break;
  •         }
  •                                 i++;
  •                                 while(temp!=0xf0)
  •                                 {
  •                                         temp=key;
  •                 temp=temp&0xf0;
  •         }
  •                 }
  •         }
  • }
  • void keyscan3()
  • {
  •   key=0xfb;
  •         temp=key;
  •         temp=temp&0xf0;
  •         if(temp!=0xf0)
  •         {
  •                 delay(10);
  •                 temp=key;
  •           temp=temp&0xf0;
  •                 if(temp!=0xf0)
  •                 {
  •                         switch(temp)
  •                     {
  •           case 0xe0:
  •                                                         if(f==0)
  •                                                                                 {
  •                                                           if(e==0)
  •                                                              table='9';
  •                                                     if(e==1)
  •                                                              table2='9';
  •                                                                           }
  •                                                                                 if(f==1)
  •                                                           table3='9';
  •                                                                                 if(f==2)
  •                                                           table4='9';
  •                                                                                 i++;
  •                                                   write_dat('9');
  •                                                   break;
  •                                         case 0xd0:
  •                                                         if(f==0)
  •                                                                                 {
  •                                                           if(e==0)
  •                                                              table='0';
  •                                                     if(e==1)
  •                                                              table2='0';
  •                                                                           }
  •                                                                                 if(f==1)
  •                                                           table3='0';
  •                                                                                 if(f==2)
  •                                                           table4='0';
  •                                                                                 i++;
  •                                                   write_dat('0');
  •                                                   break;
  •                                         case 0xb0:
  •                                                          f++;
  •                                                   g++;
  •                                                   if(g==2)
  •                                                                                         f++;
  •                                                   i=0;
  •                                                         write_dat('.');
  •                                                   break;
  •                                         case 0x70:
  •                                                         write_dat('=');
  •                                                         num=atol(table);
  •                                                   num1=atol(table2);
  •                                                   num2=atol(table3);
  •                                                   num3=atol(table4);
  •                                                   if(a==1)
  •                                                     count_add();
  •                                                                                 if(b==1)
  •                                                     count_sub();
  •                                                                                 if(c==1)
  •                                                     count_mul();
  •                                                                                 if(d==1)
  •                       count_div();
  •                                                   break;
  •         }
  •                                 while(temp!=0xf0)
  •                                 {
  •                                         temp=key;
  •                 temp=temp&0xf0;
  •         }
  •                 }
  •         }
  • }
  • void keyscan4()
  • {
  •   key=0xf7;
  •         temp=key;
  •         temp=temp&0xf0;
  •         if(temp!=0xf0)
  •         {
  •                 delay(10);
  •                 temp=key;
  •           temp=temp&0xf0;
  •                 if(temp!=0xf0)
  •                 {
  •                         switch(temp)
  •                     {
  •           case 0xe0:
  •                                                         write_dat('+');
  •                                                   a++;
  •                                                   break;
  •                                         case 0xd0:
  •                                                         write_dat('-');
  •                                                   b++;
  •                                                   break;
  •                                         case 0xb0:
  •                                                         write_dat('*');
  •                                                   c++;
  •                                                   break;
  •                                         case 0x70:
  •                                                         write_dat('/');
  •                                                   d++;
  •                                                   break;
  •         }
  •                                 i=0;
  •                                 f=0;
  •                                 e++;
  •                                 while(temp!=0xf0)
  •                                 {
  •           temp=key;
  •                 temp=temp&0xf0;
  •         }
  •                 }
  •         }
  • }
  • void Init_lcd()
  • {
  •   write_com(0x38);
  •         write_com(0x0e);
  •         write_com(0x06);
  •         write_com(0x01);
  •         write_com(0x80);
  • }
  • void write_com(uchar com)
  • {
  •   RS=0;
  •         RW=0;
  •         E=1;
  •         lcd=com;
  •         delay(10);
  •         E=0;
  • }
  • void write_dat(uchar dat)
  • {
  •   RS=1;
  •         RW=0;
  •         E=1;
  •         lcd=dat;
  •         delay(10);
  •         E=0;
  • }
  • void delay(uchar z)
  • {
  •   uchar x,y;
  •         for(x=z;x>0;x--)
  •             for(y=112;y>0;y--);
  • }
  • void count_add()
  • {
  •   value=num+num1;
  •         value1=num2+num3;
  •         if(value1>=10)
  •         {
  •                 value++;
  •           value1=value1-10;
  •         }
  •         write_com(0x80+0x49);
  •         show_int();
  •         show_float();
  •         while(1);
  • }
  • void count_sub()
  • {
  •   value=num-num1;
  •         value1=num2-num3;
  •         if(value1<0)
  •         {
  •    value--;
  •          value1=num2-num3+10;
  •   }
  •         write_com(0x80+0x49);
  •         show_int();
  •         show_float();
  •         while(1);
  • }
  • void count_mul()
  • {
  •   value=num*num1;
  •         write_com(0x80+0x49);
  •         show_int();
  •         while(1);
  • }
  • void count_div()
  • {
  •   value=num/num1;
  •         write_com(0x80+0x49);
  •         show_int();
  •         while(1);
  • }


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:123289 发表于 2017-12-28 22:07 | 只看该作者
方法1、找到高级函数库。
方法2、自己用+-*/编写高级函数,这需要你有非常好的数学水准。
如:开方可用牛顿叠代;SIN可用泰勒级数……当然也有其它方式。

我自己只用汇编写过开方程序,估计不合你的需求。
回复

使用道具 举报

板凳
ID:164602 发表于 2017-12-29 08:54 | 只看该作者
Keil自带的数学计算库函数MATH.H中有部分高级计算:
绝对值、指数函数、自然对数、10为底的对数、平方根、正弦、余弦、正切、反正弦、反余弦、反正切、双曲余弦、双曲正弦、双曲正切、返回最小、最大整数、x的y次方。
呵呵,够你用一阵子了!
回复

使用道具 举报

地板
ID:78322 发表于 2017-12-29 11:27 | 只看该作者
这个自己写算法不太现实,一来这不是你学习的重点,二来有些算法很复杂难保准确性,三大多数编译器有自带的函数库,调用即可,方便可行。所以我建议,直接找函数库调用。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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