找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2328|回复: 0
收起左侧

串口输入的计算器

[复制链接]
ID:110648 发表于 2016-3-28 22:03 | 显示全部楼层 |阅读模式
这是一个计算器的功能,串口输入,数码管显示结果并在串口处显示,为什么串口和数码管都没有反应??求大神解答
#include<reg52.h>
#include<stdio.h>
#include<ctype.h>//字符类别测试函数库
#define uchar unsigned char
#define uint unsigned int
#define MAXNUM 6
sbit dula=P2^6;
sbit wela=P2^7;
//初始化
uchar Run[MAXNUM] ="7+8*9=";//设定的运算表达式
uchar mark[MAXNUM];//标志字符是运算符号还是数字
float t[MAXNUM];//存放转换结果
uchar j=0;//标志t数组中元素的位置
uchar k=0;//标志t数组中元素的个数
uchar a=0,p=0,q=0;//机动变量
uchar flag1,flag,flag3;//表明是否存在运算符
uchar bracket1[2];//表明前括号的位置
uchar bracket2[2];//表明后括号的位置
uchar count=0;//表示单个括号的个数
uchar i=0,qw=0;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f};
uchar code temp[]={0xfe,0xfd,0xfb,0xf7};
void delay(uint z);
//函数声明
void zzz(char s[]);//字符串转化为整型
void  priority();//判断优先级
void merge();//合并运算
void merge2();//针对括号的合并运算
void brack();//括号的单独运算
void calculate(uint suan);//计算
void  judge(); //判断执行的运算类型
float power(float a,float b); //求阶次方函数
void zzz(char s[]) //字符串转化为整型
{
    char n;
while(s[i])
{
      if(isdigit(s[i]))
   {
      for(n=0;isdigit(s[i]);i++)//若数字为0~9
            {n=n*10+(s[i]-'0');}
   mark[j]='1';
         t[j++]=n;                    
      k++;
            
   }
      if(!isdigit(s[i]))
      {
          mark[j]='0';
    if(s[i]=='.')
    {
       n=46;
    t[j++]=n;
    k++;
    }
       if(s[i]=='+')
       {
          n=43;
          t[j++]=n;
    k++;
       }
       if(s[i]=='-')
       {
          n=45;
          t[j++]=n;
       k++;
       }
       if(s[i]=='*')
       {
          n=42;
          t[j++]=n;
    k++;
       }
       if(s[i]=='/')
       {
          n=47;
          t[j++]=n;
       k++;
       }
       if(s[i]=='(')
       {
          n=40;
          t[j++]=n;
       k++;
    bracket1[count++]=j-1;
       }
    if(s[i]==')')
       {
          n=41;
          t[j++]=n;
       k++;
                bracket2[--count]=j-1;
       }
    if(s[i]=='=')
    {
      j--;
      break;
    }
   }
   i++;
    }
}

void  priority()//判断优先级
{
    while(flag1==1)
    {
    flag1=0;
    if(t[j]==40)//括号运算
    {
       a=j;
    for(j=a+1;j<k;j++)
    {
      if(t[j]==40)
      {
        flag1=1;
     break;
      }
     }
    j=a;
    if(flag1==0)
    {
      flag3=1;
      calculate(0);
   count--;
    }
    count++;
    flag1=0;
    }
  if(t[j]==42)//乘法运算
  {
     a=j;
     for(j=p;j<q;j++)
        {
           if(t[j]==40&&j==bracket1[0])
     {
      flag1=1;
      break;
     }
      }
   j=a;
   if(flag1==0)
      {calculate(1);}
      flag1=0;
   }
  if(t[j]==47)//除法运算
  {
     a=j;
     for(j=p;j<q;j++)
        {
           if(t[j]==40&&j==bracket1[count])
     {
      flag1=1;
      break;
     }
      }
   j=a;
   if(flag1==0)
      {calculate(2);}
      flag1=0;
   }
   if(t[j]==43)//加法运算
   {
   a=j;
   for(j=p;j<q;j++)
         {
            if(t[j]==42||t[j]==47||(t[j]==40&&j==bracket1[count]))
      {
       flag1=1;
       break;
      }
      }
   j=a;
   if(flag1==0)
      {calculate(3);}
   flag1=0;
    }
    if(t[j]==45)//减法运算
    {
    a=j;
    for(j=p;j<q;j++)
          {
             if(t[j]==42||t[j]==47||(t[j]==40&&j==bracket1[count]))
    {
     flag1=1;
        break;
    }
    }
    j=a;
    if(flag1==0)
       {calculate(4);}
    flag1=0;
    }
    }
}
void merge()//合并运算
{
     for( j=a;j<k;j++)
  {t[j]=t[j+2];}
  k-=2;
  j=p;  
}
void merge2()//针对括号的合并运算
{
     for(j=bracket1[count];j<k;j++)
  {
    t[j]=t[j+1];
  }
  k--;
  bracket2[count]--;
  for(j=bracket2[count];j<k;j++)
  {
    t[j]=t[j+1];
  }
  k--;
  count=0;
  j=0;
}
void brack()//括号的单独运算
{
   j=a;
   for(j=bracket1[count]+1;j<bracket2[count];j++)
     {
     if((mark[j]=='0'&&j>bracket1[count]+1)&&t[j]!=3)
         {
     p=bracket1[count]+1;
     q=bracket2[count];
     flag1=1;
     priority();
     flag3=0;
      }
      }
}
void calculate(uint suan)//计算
{
     switch(suan)
  {
     case 0:
    brack();
   
    merge2();
          j=0;
    break;
     case 1:
    j=a;
    t[j-1]=t[j-1]*t[j+1];
    merge();
    if(flag3==1)
       {
       bracket2[count]-=2;
    bracket2[count-1]-=2;
    }
    j=p;
    break;
  case 2:
    j=a;
    t[j-1]=t[j-1]/t[j+1];
    merge();
    if(flag3==1)
       {
        bracket2[count]-=2;
     bracket2[count-1]-=2;
    }
    j=p;
    break;
   case 3:
    j=a;
    t[j-1]=t[j-1]+t[j+1];
    merge();
    if(flag3==1)
    {
        bracket2[count]-=2;
     bracket2[count-1]-=2;
    }
    j=p;
    break;
  case 4:
    j=a;
    t[j-1]=t[j-1]-t[j+1];
    merge();
    if(flag3==1)
    {
        bracket2[count]-=2;
     bracket2[count-1]-=2;
    }
       j=p;
    break;
  default:break;
   }
}
void  judge() //判断执行的运算类型
{   
   for(j=0;j<k;j++)
   {
     if(mark[j]=='0')
         {
     p=0;
     q=k;
     flag1=1;
     priority();
      }
      }
}
void serial() interrupt 4 //串口接收
{
if(RI)
{  
   Run[qw]=SBUF;  
        if(Run[qw]=='=')
   {
    flag=1;
    i=qw;
    qw=0;
   }
  RI=0;
  qw++;
}   
}
void main()
{
    float answer=0;//标注结果
    uchar e,L,num=0;
    uchar ans[5];//表示结果的字符数组
    TMOD=0x20;
    TH1=0xF3;
    TL1=0xF3;
    TR1=1;
    SM0=0;
    SM1=1;
    REN=1;
SCON=0x50;
    EA=1;
    ES=1;
while(1)
    {
   if(flag==1)
   {
    ES=0;
    zzz(Run);
    judge();
    answer=t[0];
    L=sprintf(ans,"%.2f",answer); //字符串长度
    for(e=0;e<L;e++)
    {
      SBUF=ans[e];
      wela=1;
     P0=temp[num++];
     wela=0;
     dula=1;
     P0=ans[e];
     dula=0;
     delay(50);
      while(!TI);
      TI=0;
       }
  flag=0;
  ES=1;
    for(e=0;e<L;e++)
    {ans[e]='\0';}
  }
    i=0;
  
}
}
void delay(uint z)
{
uint x;
uchar y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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