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

📄 text1.lst

📁 数字电压表,电压表能实现档位自动切换,让使用者方便,不必手动切换档位.
💻 LST
字号:
C51 COMPILER V8.05a   TEXT1                                                                02/05/2009 20:39:53 PAGE 1   


C51 COMPILER V8.05a, COMPILATION OF MODULE TEXT1
OBJECT MODULE PLACED IN Text1.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE Text1.c BROWSE DEBUG OBJECTEXTEND

line level    source

   1          #include "reg51.h"
   2          #define uint unsigned int
   3          #define uchar unsigned char
   4          uchar disbuf[6];
   5          unsigned char code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,
   6                                 0xf8,0x80,0x90,0x88,0x83,0xc6,0xa2,0x86,0x8e};
   7          float      VolTureValudeA;
   8          #define V_hig 0x80
   9          #define V_mid 0x40
  10          #define V_low 0x20
  11          sbit e=P2^3;
  12          sbit cs=P2^5;
  13          sbit din=P2^6;
  14          sbit clk=P2^4; 
  15          sbit out=P2^7;
  16          bdata bit busy=0;
  17          uchar disp_move=0;
  18          long float Vol_actual;
  19          uchar Level=2; //0,1,2三个电压等级标志
  20          
  21          void delay3(int a)
  22          {
  23   1          while(a--);
  24   1      }
  25          
  26          uint read1543(uchar port) //从TLC1543读取采样值,形参port是采样的通道号
  27          {
  28   1      uint data ad;uint data i;
  29   1      uchar data al=0,ah=0;
  30   1      
  31   1      busy=1;
  32   1      clk=0;
  33   1      cs=0;
  34   1      port<<=4;
  35   1      for (i=0;i<4;i++) //把通道号打入1543
  36   1      {
  37   2      din=(bit)(port&0x80);clk=1;clk=0;
  38   2      port<<=1;
  39   2      }
  40   1      
  41   1      for (i=0;i<6;i++) //填充6个CLOCK
  42   1      {
  43   2      clk=1;clk=0;
  44   2      }
  45   1      
  46   1      cs=1;
  47   1      delay3(20);
  48   1      cs=0; //等待AD转换
  49   1       while(e==0);
  50   1      delay3(5);
  51   1      
  52   1      for (i=0;i<2;i++) //取D9,D8
  53   1      {
  54   2      out=1;
  55   2      clk=1;
C51 COMPILER V8.05a   TEXT1                                                                02/05/2009 20:39:53 PAGE 2   

  56   2      ah<<=1;
  57   2      if (out) ah|=0x01;
  58   2      clk=0;
  59   2      } 
  60   1      
  61   1      for (i=0;i<8;i++) //取D7--D0
  62   1      {
  63   2      out=1;
  64   2      clk=1;
  65   2      al<<=1;
  66   2      if (out) al|=0x01;
  67   2      clk=0;
  68   2      } 
  69   1      
  70   1      cs=1;
  71   1      ad=(uint)ah;ad<<=8;ad|=(uint)al; //得到AD值
  72   1      busy=0;
  73   1      return (ad);
  74   1      }
  75          
  76          /*float GetData_MedianFilter()
  77          {
  78                          unsigned int xdata m=0,i,k;
  79                  float xdata d_p,mad,d[11],z,b[11],v_sum=0,data_p;
  80                 float VolTureValude;
  81                 for(i=0;i<10;i++)//取出窗口中的n个收据
  82                 {
  83                  b[i]=read1543(0x0a);
  84                 }  
  85                 
  86                          delay3(100);
  87                                    
  88                         for(i=0;i<10;i++)
  89                                     v_sum=v_sum+b[i];
  90                                     delay3(100);
  91                                     VolTureValude=v_sum/10;
  92                          return(VolTureValude);                           }                      */      
  93          
  94          
  95          
  96          float filter(uchar v)
  97          {  float sum=0;
  98   1      float value_buf[11],temp;
  99   1      char count,i,j;
 100   1      for (count=0;count<11;count++)
 101   1      {
 102   2      value_buf[count]=read1543(v);    //获取采样值
 103   2      delay3(300);
 104   2      }
 105   1      for (j=0;j<10;j++)  //采样值由小到大排列,排序采用冒泡法
 106   1      {
 107   2      for (i=0;i<11-j;i++)
 108   2      {
 109   3      if(value_buf[i]>value_buf[i+1])
 110   3      {
 111   4      temp=value_buf[i];
 112   4      value_buf[i]=value_buf[i+1];
 113   4      value_buf[i+1]=temp;
 114   4      }
 115   3      }
 116   2      }
 117   1        for(count=1;count<10;count++)    //去掉第一个和末一个数
C51 COMPILER V8.05a   TEXT1                                                                02/05/2009 20:39:53 PAGE 3   

 118   1      {
 119   2      sum+=value_buf[count];
 120   2      delay3(100);
 121   2      }
 122   1      return (float)(sum/9);
 123   1      }
 124                  
 125          
 126                                                                    
 127          timer0() interrupt 1 using 1  //显示处理部分
 128          {
 129   1              if(busy==0)
 130   1              {
 131   2                      if(Level!=3)
 132   2                      {
 133   3                              disbuf[0]=Vol_actual/10;
 134   3                              disbuf[1]=(uchar)Vol_actual%10; 
 135   3                              disbuf[2]=(uint)(Vol_actual*10)%10;
 136   3                              disbuf[3]=(uint)(Vol_actual*100)%10;
 137   3                              disbuf[4]=(unsigned long)(Vol_actual*1000)%10;                                                                                                  
 138   3                              disbuf[5]=(unsigned long)(Vol_actual*10000)%10;
 139   3      
 140   3                              P0=0x00;
 141   3                              if(disp_move==1)
 142   3                              {
 143   4                                        P1=table[disbuf[disp_move]]&0x7f;
 144   4                              }
 145   3                              else
 146   3                              P1=table[disbuf[disp_move]];
 147   3                              P0=0x01<<disp_move;
 148   3                              disp_move=(disp_move+1)%6;
 149   3                      }
 150   2                      else
 151   2                      {
 152   3                              P0=0xff;
 153   3                              P1=table[15];
 154   3                      }
 155   2              }
 156   1              TH0=(65536-2000)/256; //定时器1定时50ms
 157   1              TL0=(65536-2000)%256;
 158   1      } 
 159          main()
 160          {  
 161   1              long float Vol_test;
 162   1              TMOD=0x01; //定时器0在工作方式1
 163   1              TH0=(65536-2000)/256; //定时器1定时50ms
 164   1              TL0=(65536-2000)%256;
 165   1              ET0=1; 
 166   1              EA=1; 
 167   1              TR0=1;
 168   1          while(1)
 169   1              {       
 170   2                      if(  filter(0x0a)>=0x3ff)         //超出总量程
 171   2                      {
 172   3                              P3=0x00;
 173   3                              Level=3;
 174   3                      }
 175   2                      else 
 176   2                      {
 177   3                              Vol_test= filter(0x0a)/1024*5;
 178   3                              if(Vol_test<=2.4658)
 179   3                              {
C51 COMPILER V8.05a   TEXT1                                                                02/05/2009 20:39:53 PAGE 4   

 180   4                                              if(Vol_test<=0.2490)
 181   4                                              {
 182   5                                                      P3=V_low;
 183   5                                                      Level=0;
 184   5                                              }
 185   4                                              else
 186   4                                              {
 187   5                                                      P3=V_mid;
 188   5                                                      Level=1;
 189   5                                              }
 190   4      
 191   4      
 192   4                              } 
 193   3                              else
 194   3                              {
 195   4                                      P3=V_hig;
 196   4                                      Level=2;
 197   4                              }         
 198   3                      }                        
 199   2                      delay3(1000);                                                                     
 200   2                      switch(Level)
 201   2                      {
 202   3                              case 0:
 203   3                              {
 204   4                                              Vol_actual=(float)filter(0x09)/1024*5+0.0005;
 205   4                                              break;
 206   4                              }
 207   3                              case 1:
 208   3                              {
 209   4                                         Vol_actual=(float)filter(0x08)/1024*5*10+0.0005;
 210   4                                         break;
 211   4                              }
 212   3                              case 2:
 213   3                              {
 214   4                                      Vol_actual=(float)filter(0x07)/1024*5*20+0.0005;
 215   4                                      break;
 216   4                              }
 217   3                              default: break;
 218   3                      }
 219   2              }        
 220   1      }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    988    ----
   CONSTANT SIZE    =     16    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     16      60
   IDATA SIZE       =   ----    ----
   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 + -