⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.lst

📁 在MCS51上实现计算器的功能模块 (完成加减乘除正余弦开方正余切E的幂和对数等的运算
💻 LST
字号:
C51 COMPILER V7.20   MAIN                                                                  09/06/2007 15:49:45 PAGE 1   


C51 COMPILER V7.20, COMPILATION OF MODULE MAIN
OBJECT MODULE PLACED IN main.OBJ
COMPILER INVOKED BY: D:\software\up51v7200\C51\BIN\C51.EXE main.c DEBUG OBJECTEXTEND

line level    source

   1          /*********************************************************************************************************
             -                                                   
   2          **                                  
   3          **                         PC control microprocessor by serial port 
   4          **                                  
   5          **                              Copyright 2007, shiyueyong            
   6          **
   7          **                                  All Rights Reserved                
   8          **
   9          **
  10          **--------------文件信息--------------------------------------------------------------------------------
  11          **文   件   名: main.c
  12          **创   建   人: 史跃勇
  13          **最后修改日期: 2007年9月4日
  14          **描        述: 在MCS51上实现计算器和时钟例子的主程序。
  15          **              包括用键盘进行加减乘除正余弦开方正余切E的幂等的运算及调整时钟和控制时钟显示
  16          **------------------------------------------------------------------------------------------------------
  17          ** 修改人:
  18          ** 版  本:
  19          ** 日 期:
  20          ** 描 述:
  21          **
  22          **------------------------------------------------------------------------------------------------------
  23          ********************************************************************************************************/
  24          #include <reg51.h>
  25          #include <stdio.h>
  26          #include <ctype.h>
  27          #include <stdlib.h> 
  28          #include <math.h>
  29          #include <clock.c>
  30          #include <calculator.c>
  31          #define uchar unsigned char 
  32          #define uint unsigned int
  33          uchar idata r_buf[20];
  34          //uchar idata t_buf[20];
  35          uchar yearh,yearl,month,day,hour,min,sec;
  36          uchar workmode=0;
  37          uchar r_pointer;
  38          uchar t_pointer;
  39          int tcnt;
  40          bit display;
  41          /*********************************************************************************************************
  42          ** 函数名称: sysinit
  43          ** 功能描述: 初始化函数,一般在多任务环境启动前调用
  44          ** 输 入: 无
  45          ** 输 出: 无
  46          ** 全局变量: 无
  47          ** 调用模块: 无
  48          **
  49          ** 作 者: 史跃勇
  50          ** 日 期: 2007年9月4日
  51          **-------------------------------------------------------------------------------------------------------
  52          ** 修改人:
  53          ** 日 期:
  54          **------------------------------------------------------------------------------------------------------
C51 COMPILER V7.20   MAIN                                                                  09/06/2007 15:49:45 PAGE 2   

  55          ********************************************************************************************************/ 
             - 
  56          void sysinit(void)
  57          {   
  58   1          IP=0x00;
  59   1          TMOD = 0x22;                        // 定时器1工作于8位自动重载模式, 用于产生波特率
  60   1              TH1 = 0xFD;                             // 波特率9600
  61   1              TL1 = 0xFD;
  62   1              
  63   1          SCON = 0x50;  
  64   1              PCON &= 0x00;                   // 波特率不倍增
  65   1              EA=1;                   // 开启中断总控制
  66   1          ES=1;                   // 允许串口中断
  67   1          
  68   1          TH0=0x06;               // 设置定时器初值,靠TH0存储重装的计数值X0=256-250=6
  69   1          TL0=0x06;
  70   1          ET0=1;                  // 开启定时器T0中断允许
  71   1          TR1=1;                                  // 启动定时器1
  72   1          TR0=1;                  // 启动定时器0
  73   1      }
  74          /*********************************************************************************************************
  75          ** 函数名称: dividesign
  76          ** 功能描述: 利用查表法迅速分辨出输入的命令并转换成可识别的代码
  77                       (例如:对于sum这条命令首先得到s.u.m的对应编号19,21,13.然后把sum的各位乘以相应的位权,在这里为
  78                        3*19+2*21+1*13=112.把结果列成表以供把命令翻译成代码,扩展指令时只需在tab2中加入一个值即可.)
  79          ** 输 入: r_buf:数据接收缓冲区的内容
  80          ** 输 出: sign:转化后的可识别命令代码
  81          ** 全局变量: r_buf
  82          ** 调用模块: tab1,tab2
  83          **
  84          ** 作 者: 史跃勇
  85          ** 日 期: 2007年9月4日
  86          **-------------------------------------------------------------------------------------------------------
  87          ** 修改人:
  88          ** 日 期:
  89          **------------------------------------------------------------------------------------------------------
  90          ********************************************************************************************************/
  91          /*英文字母ASCII表和指令识别内码表tab1[27],tab[15]*/
  92          uchar  idata tab1[27]=
  93          {0x00,
  94           0x61,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6a,0x6b,0x6c,0x6d,     //abcdefghigklm的ASCII码
  95           0x6e,0x6f,0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7a      //nopqrstuvwxyz的ASCII码
  96          };
  97          uchar  idata tab2[18]=
  98          {0,
  99           112,101,105,52,89,58,109,23,44,81,34,91,49,107,76,59,79  //sum,sub,mux,div,sin,cos,sqrt,cal,clk,send,date
             -,time,dis,out,tan,cot,exp,log
 100          };
 101          /*************************************************************/
 102          uchar dividesign(uchar *string)
 103          {
 104   1       char order[2];
 105   1       uchar i,j,method,sign;
 106   1       for(i=0;i<=2;i++)
 107   1        {
 108   2          for(j=0;j<=26;j++){if(tab1[j]==string[i])order[i]=j;}
 109   2        }
 110   1        method=3*order[0]+2*order[1]+order[2];
 111   1        i=0;
 112   1        while((tab2[i]!=method)&&(i<=17)){i++;}
 113   1        sign=i;  
 114   1        if(sign==8){workmode=1;return(0);}
C51 COMPILER V7.20   MAIN                                                                  09/06/2007 15:49:45 PAGE 3   

 115   1        else if(sign==9){workmode=2;return(0);}
 116   1        else{return(sign);}
 117   1      }
 118          /**********************主任务***********************************/
 119          
 120          /*********************************************************************************************************
 121          ** 函数名称: command
 122          ** 功能描述: 命令处理任务,高层命令由这个任务执行,相当于应用程序
 123          ** 输 入: 无
 124          ** 输 出: 无
 125          ** 全局变量: 无
 126          ** 调用模块: calculation();clock();dividesign();tab1[];tab[2] 
 127          **
 128          ** 作 者: 史跃勇
 129          ** 日 期: 2007年9月4日
 130          **-------------------------------------------------------------------------------------------------------
 131          ** 修改人:
 132          ** 日 期:
 133          **------------------------------------------------------------------------------------------------------
 134          ********************************************************************************************************/
 135          void command(void)
 136          {uchar p;uchar i,j,k;uchar idata buf[10],suf[10];float idata num1,num2;
 137   1       p=dividesign(r_buf);
 138   1      if(p!=0)
 139   1        {
 140   2        if(workmode!=0)
 141   2         {
 142   3         for(i=0;i<=10;i++){buf[i]=0;suf[i]=0;}i=0;j=0;
 143   3         while((isdigit(r_buf[i])!=1)&&(i<=20)){i++;}
 144   3         while(((isdigit(r_buf[i])==1)||(r_buf[i])==0x2e)&&(i<=20)){buf[j]=r_buf[i];i++;j++;}
 145   3         num1=atof(buf);k=0;
 146   3         while((isdigit(r_buf[i])!=1)&&(i<=20)){i++;}
 147   3         while(((isdigit(r_buf[i])==1)||(r_buf[i])==0x2e)&&(i<=20)){suf[k]=r_buf[i];i++;k++;}
 148   3         num2=atof(suf);
 149   3         }
 150   2       switch(workmode)
 151   2         {
 152   3           case 1:
 153   3           p=dividesign(r_buf);
 154   3           calculator(p,num1,num2);
 155   3           break;
 156   3           case 2:
 157   3           p=dividesign(r_buf);
 158   3           clock(p,num1);  
 159   3           break;
 160   3           default:
 161   3           break;
 162   3         }
 163   2       }
 164   1      }
 165          /*********************************************************************************************************
 166          ** 函数名称: main
 167          ** 功能描述: 主函数,用户程序从这里执行
 168          ** 输 入: 无
 169          ** 输 出: 无
 170          ** 全局变量: 无
 171          ** 调用模块: sysinit()
 172          **
 173          ** 作 者: 史跃勇
 174          ** 日 期: 2007年9月4日
 175          **-------------------------------------------------------------------------------------------------------
 176          ** 修改人:
C51 COMPILER V7.20   MAIN                                                                  09/06/2007 15:49:45 PAGE 4   

 177          ** 日 期:
 178          **------------------------------------------------------------------------------------------------------
 179          ********************************************************************************************************/
 180          main()
 181          { 
 182   1        sysinit();
 183   1        while(1);
 184   1      }
 185          /*********************************************************************************************************
 186          ** 函数名称: UART
 187          ** 功能描述: 串口中断处理程序
 188          ** 输 入: 无
 189          ** 输 出: 无
 190          ** 全局变量:r_buf,t_buf,out 
 191          ** 调用模块:trans_data(),rece_data();command();
 192          **
 193          ** 作 者: 史跃勇
 194          ** 日 期: 2007年9月4日
 195          **-------------------------------------------------------------------------------------------------------
 196          ** 修改人:
 197          ** 日 期:
 198          **------------------------------------------------------------------------------------------------------
 199          ********************************************************************************************************/
 200          void UART(void) interrupt 4 
 201          { 
 202   1       unsigned char  dataBUF;
 203   1       if(RI==1)                
 204   1       {
 205   2        RI=0;
 206   2        display=0;
 207   2        dataBUF=SBUF;
 208   2        SBUF=dataBUF;
 209   2        r_buf[r_pointer++]=dataBUF;  
 210   2        if(dataBUF==0x0d)
 211   2        { 
 212   3           r_pointer=0;
 213   3           command();   
 214   3        }
 215   2        else if(dataBUF=='\b')
 216   2        {
 217   3         r_pointer--;
 218   3         r_buf[r_pointer--]=0;
 219   3        }
 220   2       }
 221   1      /*if(TI==1)                
 222   1       {
 223   1        TI=0;
 224   1         {
 225   1          if(t_buf[t_pointer-2]=='\r'||t_buf[t_pointer-1]=='\n')
 226   1          { 
 227   1               t_pointer=0; 
 228   1          }
 229   1         
 230   1          else
 231   1          {
 232   1           SBUF=t_buf[t_pointer++]; 
 233   1          }
 234   1         }
 235   1        }*/
 236   1      }
 237          /**********************end****************************************/
 238          
C51 COMPILER V7.20   MAIN                                                                  09/06/2007 15:49:45 PAGE 5   

 239          


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =   2127    ----
   CONSTANT SIZE    =    330    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     12      34
   IDATA SIZE       =     65      70
   BIT SIZE         =      1    ----
END OF MODULE INFORMATION.


C51 COMPILATION COMPLETE.  0 WARNING(S),  0 ERROR(S)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -