基于51单片机的科学计算器

科学计算器
1.任务
设计制作一个科学计算器。 
2. 要求
(1)按数字 0-9 时应发出蜂鸣器声音,数越大,频率越高。 (20 分)
(2) 完成任意两位数(范围 0-99)的加减乘除运算,结果只需显示整数部分,但如果结果为负数应显示负号。 (20 分)
(3) 完成任意两位数(范围 0-99)的加减乘除运算, 结果要求有小数部分,显示为 xxxx.xxxx(小数点前不超过四位,小数点后若多于四位,只需显示四位),如果结果为负数应显示负号。 (20 分)
(4) 完成任意三位数(范围 0-999)的加减乘除运算, 结果只需显示整数部分,但如果结果为负数应显示负号。(10 分)
(5) 对任意两位整数进行开方运算,结果保留 4 位有效数字。(10 分)
(6) 请完成由三个任意二位数组成,格式为 dpdpd 形式表达式的运算(假定 d表示任意整数, p 表示任意操作符(加减乘除),x 表示单个数字, 则 dpdpd 的可能形式之一为 11/2+3)。

3.代码

 


#include<reg52.h>
#include<intrins.h>
#include<stdio.h>
#include<math.h>


#define uchar unsigned char
#define uint unsigned int

/************蜂鸣器*****************/
sbit beep=P3^7;

/************LCD*********************/
sbit lcden=P3^4;//液晶使能端
sbit lcdrs=P3^5;//液晶数据命令选择端

/*************按键******************/
sbit key1=P1^0;
sbit key2=P1^1;
sbit key3=P1^2;
sbit key4=P1^3;
sbit key5=P1^4;
sbit key6=P1^5;
sbit key7=P1^6;
sbit key8=P1^7;

sbit key9=P2^0;
sbit key10=P2^1;
sbit key11=P2^2;
sbit key12=P2^3;
sbit key13=P2^4;
sbit key14=P2^5;
sbit key15=P2^6;
sbit key16=P2^7;

sbit key17=P3^0;
sbit key18=P3^1;
sbit key19=P3^2;
sbit key20=P3^3;

                                                                     
uchar array[16]={'\0','\0','\0','\0','\0','\0'};//       键盘扫描
uchar str[16]={'\0','\0','\0','\0'}; //      主函数转换
 


uint idata va1_ge, va1_shi,va1_bai,va1_qian,va1_wan,va2_ge,va2_shi,va2_bai,va3_ge,va3_shi;//获取操作数
uchar idata operator,operator1 ,operator2;
int   idata operator3_int,operator2_int,operator1_int,value_char,value_int,value_int_jueduizhi;//运算结果
float idata value_float;
int   idata value_int_ge, value_int_shi, value_int_bai,value_int_qian,value_int_wan,value_int_shiwan,value_int_shiwan;       //运算结果的各位
unsigned long int  value_int_long;//运算结果
int idata jj=0;//array下标,

/********函数声明*********/
void key_scan(void);

void delay(uint z);

void write_com(uchar com);
void write_data(uchar date);
void LCD_Init(void);


void beep0(void);
void beep1(void);
void beep2(void);
void beep3(void);
void beep4(void);
void beep5(void);
void beep6(void);
void beep7(void);
void beep8(void);
void beep9(void);

/*************************主函数*****************/
void main(void)
{
   int i=0;
   LCD_Init();

   beep=0;//不响

   

    while(1)
    {         
        key_scan(); 
/******************************两位数算数运算****************************/
         if(array[5]=='='&&(array[2]=='+'||array[2]=='-'||array[2]=='*'||array[2]=='/')) 
        {     
            va1_shi=array[0]-48;
            va1_ge=array[1]-48;

            operator=array[2];

            va2_shi=array[3]-48;
            va2_ge=array[4]-48;

            operator1_int=va1_shi*10+va1_ge;// 操作数1(十)
            operator2_int=va2_shi*10+va2_ge;//操作数2(十)

            switch(operator)
            {
                case '+':
                 
                value_int=operator1_int+operator2_int; //value_int(20-198)
                if(value_int<=99)
                {
                  value_int_ge= value_int%10;//取出个位数
                  str[0]=value_int_ge+48;
                  
                  value_int_shi= value_int/10;//取出十位数
                  str[1]= value_int_shi+48;

                  write_data(str[1]); 
                  write_data(str[0]); 
                }
                else if(value_int>=100)
                {
                  value_int_ge= value_int%10;//取出个位数
                  str[0]=value_int_ge+48;

                  value_int_shi= value_int/10%10;//取出十位数
                  str[1]= value_int_shi+48;

                  value_int_bai=value_int/100;//取出百位数
                  str[2]= value_int_bai+48;

                  write_data(str[2]); 
                  write_data(str[1]); 
                  write_data(str[0]); 
                }
                break;

                case '-':
                value_int=operator1_int-operator2_int; //value_int(-99-99)
                if(value_int<0)
                {
                    if(value_int>-10)
                    {
                        value_int_jueduizhi=operator2_int-operator1_int;
                        str[0]=value_int_jueduizhi+48;
                        write_data('-'); 
                        write_data(str[0]); 
                    }
                    else if(value_int<-10)
                    {
                        value_int_jueduizhi=operator2_int-operator1_int;
                        str[0]=value_int_jueduizhi%10+48;
                        str[1]=value_int_jueduizhi/10+48;
                        write_data('-'); 
                        write_data(str[1]); 
                        write_data(str[0]); 
                    }
                }
                else if(value_int==0)
                {
                       write_data('0'); 
                }
               else    if(value_int>0)
               {
                    if(value_int>10)
                    {
                      value_int_ge= value_int%10;//取出个位数
                      str[6]=value_int_ge+48;
                      
                      value_int_shi= value_int/10;//取出十位数
                      str[7]= value_int_shi+48;
    
                      write_data(str[7]); 
                      write_data(str[6]); 
                    } 
                    else if(value_int<10)
                    {       
                      str[8]=value_int+48;
                      write_data(str[8]);    
                    }
                }
                break;
             case '*':

                value_int=operator2_int*operator1_int;
                if(value_int<1000)
                {
                  value_int_ge= value_int%10;//取出个位数
                  str[0]=value_int_ge+48;

                  value_int_shi= value_int/10%10;//取出十位数
                  str[1]= value_int_shi+48;

                  value_int_bai=value_int/100;//取出百位数
                  str[2]= value_int_bai+48;

                  write_data(str[2]); 
                  write_data(str[1]); 
                  write_data(str[0]); 
                }
                else if(value_int>=1000)
                {
                  value_int_ge= value_int%10;//取出个位数
                  str[0]=value_int_ge+48;

                  value_int_shi= value_int/10%10;//取出十位数
                  str[1]= value_int_shi+48;

                  value_int_bai=value_int/100%10;//取出百位数
                  str[2]= value_int_bai+48;

                  value_int_qian=value_int/1000;//取出千位数
                  str[3]= value_int_qian+48;

                  write_data(str[3]);
                  write_data(str[2]); 
                  write_data(str[1]); 
                  write_data(str[0]); 
                }
                break;

                 //两位数除法运算
                case '/': //0.101010-9.9
                value_float=operator1_int/((float)operator2_int);

                sprintf(str,"%1.4f",value_float);

               if(operator1_int==operator2_int)
               write_data(str[0]);

              else  if((str[2]!='0')&&(str[3]=='0')&&(str[4]=='0')&&(str[5]=='0'))
               {write_data(str[0]);write_data(str[1]);write_data(str[2]); }

//               if((str[2]!='0')&&(str[3]!='0')&&(str[4]=='0')&&(str[5]=='0'))
//               {write_data(str[0]);write_data(str[1]);write_data(str[2]);write_data(str[3]); }
//
//               if((str[2]!='0')&&(str[3]!='0')&&(str[4]!='0')&&(str[5]=='0'))
//                {write_data(str[0]);write_data(str[1]);write_data(str[2]);write_data(str[3]);write_data(str[4]); }
//
              else 
                {write_data(str[0]);write_data(str[1]);write_data(str[2]);write_data(str[3]);write_data(str[4]); write_data(str[5]);}
                break;
                }
                for(i=0;i<=15;i++)
                {
                      array[i]='\0';
                }
                jj=0;
        }
/******************************二进制转换********************************************************/
         else if((array[1]=='B')&&(array[2]=='='))
         {
             if(array[0]=='0')
            {
                 write_data('0'); 
                 write_data('0');
                 write_data('0');
                 write_data('0');    
            }
             if(array[0]=='1')
            {
                 write_data('0'); 
                 write_data('0');
                 write_data('0');
                 write_data('1');    
            }
                if(array[0]=='2')
            {
                 write_data('0'); 
                 write_data('0');
                 write_data('1');
                 write_data('0');    
            }
                if(array[0]=='3')
            {
                 write_data('0'); 
                 write_data('0');
                 write_data('1');
                 write_data('1');    
            }
                if(array[0]=='4')
            {
                 write_data('0'); 
                 write_data('1');
                 write_data('0');
                 write_data('0');    
            }
                if(array[0]=='5')
            {
                 write_data('0'); 
                 write_data('1');
                 write_data('0');
                 write_data('1');    
            }
                if(array[0]=='6')
            {
                 write_data('0'); 
                 write_data('1');
                 write_data('1');
                 write_data('0');    
            }
                      if(array[0]=='7')
            {
                 write_data('0'); 
                 write_data('1');
                 write_data('1');
                 write_data('1');    
            }
                if(array[0]=='8')
            {
                 write_data('1'); 
                 write_data('0');
                 write_data('0');
                 write_data('0');    
            }
                if(array[0]=='9')
            {
                 write_data('1'); 
                 write_data('0');
                 write_data('0');
                 write_data('1');    
            }
             for(i=0;i<=15;i++)
            {
                  array[i]='\0';
            }
            jj=0;
         }

/****************************三位数算数运算**********************************************************/
        else if((array[7]=='=')&

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Poetry _Distance

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值