找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2328|回復: 0
收起左側

串口輸入的計算器

[復制鏈接]
ID:110648 發(fā)表于 2016-3-28 22:03 | 顯示全部樓層 |閱讀模式
這是一個計算器的功能,串口輸入,數(shù)碼管顯示結果并在串口處顯示,為什么串口和數(shù)碼管都沒有反應??求大神解答
#include<reg52.h>
#include<stdio.h>
#include<ctype.h>//字符類別測試函數(shù)庫
#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];//標志字符是運算符號還是數(shù)字
float t[MAXNUM];//存放轉換結果
uchar j=0;//標志t數(shù)組中元素的位置
uchar k=0;//標志t數(shù)組中元素的個數(shù)
uchar a=0,p=0,q=0;//機動變量
uchar flag1,flag,flag3;//表明是否存在運算符
uchar bracket1[2];//表明前括號的位置
uchar bracket2[2];//表明后括號的位置
uchar count=0;//表示單個括號的個數(shù)
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);
//函數(shù)聲明
void zzz(char s[]);//字符串轉化為整型
void  priority();//判斷優(yōu)先級
void merge();//合并運算
void merge2();//針對括號的合并運算
void brack();//括號的單獨運算
void calculate(uint suan);//計算
void  judge(); //判斷執(zhí)行的運算類型
float power(float a,float b); //求階次方函數(shù)
void zzz(char s[]) //字符串轉化為整型
{
    char n;
while(s[i])
{
      if(isdigit(s[i]))
   {
      for(n=0;isdigit(s[i]);i++)//若數(shù)字為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()//判斷優(yōu)先級
{
    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() //判斷執(zhí)行的運算類型
{   
   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];//表示結果的字符數(shù)組
    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--);
}
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表