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

📄 main.lst

📁 基于AT89S52的RLC测试仪
💻 LST
字号:
C51 COMPILER V6.12  MAIN                                                                   06/28/2007 13:08:17 PAGE 1   


C51 COMPILER V6.12, COMPILATION OF MODULE MAIN
OBJECT MODULE PLACED IN .\main.OBJ
COMPILER INVOKED BY: D:\Program Files\Keil\C51\BIN\C51.EXE .\main.c DEBUG OBJECTEXTEND

stmt level    source

   1          /***************************************
   2          RLC测试仪
   3          ***************************************/
   4          #include<stdio.h>
   5          #include<reg52.h>
   6          #include<math.h>
   7          #include<string.h>
   8          #include"tdp.h"
   9          #define FUN_PORT P2
  10          #define T_STOP			TCON&=~0X50		
  11          #define T_RUN			TCON|=0X50
  12          #define PRINTF(x)		LCD_puts(ftos(x))	
  13          #define PUTS(s)		LCD_puts(s)	
  14          #define PUTCHAR(c)	w_dat(c)
  15          #define GOTO(x,y)		LCD_gotoxy(x,y)
  16          #define R_MAX			3e6
  17          #define L_MAX			1
  18          #define C_MAX			1
  19          #define T_MAX			3
  20          //#define SOFT
  21          bit JIAOZHUN;			//校准模式标志位
  22          uchar function;		//正在使用的功能代号
  23          uchar THH0;				//T0计数扩展单元
  24          uchar	THH1;
  25          LONG_CHAR  Time;		
  26          LONG_CHAR  Count;
  27          bit have_cy;			//有采样值标志位
  28          uchar liangcheng;		//量程号
  29          uchar code count_chuzhi[]=				//各量程计数初值
  30          	{//THH0,TH0,TL0,TH1,TL1
  31          	0x1f,0x3c,0xb0,0x00,0x00,			
  32          	0x00,0x00,0x00,(65536-20)>>8,65536-20,
  33          	0x00,0x00,0x00,0xff,0xff	
  34          	};	
  35          float Tin,Tout;
  36          uchar fun_addr[]={0x08,0xE0,0x11};//RLC
  37          sbit key =P3^3;
  38          sbit LED=P0^1;
  39          void R_disp(float r)
  40          {
  41   1      	if (JIAOZHUN)		//较准
  42   1      		{
  43   2      		GOTO(0,0);
  44   2      		PUTS("T=");
  45   2      		PRINTF(Tout);
  46   2      		PUTS("s  ");
  47   2      		PRINTF(Tin);
  48   2      		PUTS("s     ");
  49   2      		}
  50   1      	else
  51   1      		{
  52   2      		GOTO(0,0);
  53   2      		PUTS("-------R--------");
  54   2      		}
  55   1      	GOTO(1,0);
C51 COMPILER V6.12  MAIN                                                                   06/28/2007 13:08:17 PAGE 2   

  56   1      	PUTS("  Rx=");
  57   1      	if(r<R_MAX) 
  58   1      		{
  59   2      		PRINTF(r);
  60   2      		PUTS("\1 \0025%      ");
  61   2      		}
  62   1      	else
  63   1      	PUTS("OVER       ");
  64   1      }
  65          
  66          void L_disp(float l)
  67          {
  68   1      	if (JIAOZHUN)		//较准
  69   1      		{
  70   2      		GOTO(0,0);
  71   2      		PUTS("T=");
  72   2      		PRINTF(Tout*Tout);
  73   2      		PUTS("s  ");
  74   2      		PRINTF(Tin*Tin);
  75   2      		PUTS("s     ");
  76   2      		}
  77   1      	else
  78   1      		{
  79   2      		GOTO(0,0);
  80   2      		PUTS("-------L--------");
  81   2      		}
  82   1      	GOTO(1,0);
  83   1      	PUTS("  Lx=");
  84   1      	if(l<L_MAX) 
  85   1      		{
  86   2      		PRINTF(l);
  87   2      		PUTS("H \0025%       ");
  88   2      		}
  89   1      	else
  90   1      	PUTS("OVER       ");
  91   1      }
  92          
  93          void C_disp(float c)
  94          {
  95   1      	if (JIAOZHUN)		//较准
  96   1      		{
  97   2      		GOTO(0,0);
  98   2      		PUTS("T=");
  99   2      		PRINTF(Tout);
 100   2      		PUTS("s  ");
 101   2      		PRINTF(Tin);
 102   2      		PUTS("s     ");
 103   2      		}
 104   1      	else
 105   1      		{
 106   2      		GOTO(0,0);
 107   2      		PUTS("-------C--------");
 108   2      		}
 109   1      	GOTO(1,0);
 110   1      	PUTS("  Cx=");
 111   1      	if(c<C_MAX) 
 112   1      		{
 113   2      		PRINTF(c);
 114   2      		PUTS("F \0025%      ");
 115   2      		}
 116   1      	else
 117   1      	PUTS("OVER       ");
C51 COMPILER V6.12  MAIN                                                                   06/28/2007 13:08:17 PAGE 3   

 118   1      }
 119          
 120          float R_value(float T)
 121          {
 122   1      	float code tab[][2]=
 123   1      	{//Ti,Ri;	按Ti升序排列
 124   1      	12.85e-6,0,
 125   1      	12.91e-6,10,
 126   1      	13.82e-6,100,
 127   1      	14.20e-6,120,
 128   1      	15.20e-6,220,
 129   1      	18.20e-6,400,
 130   1      	18.28e-6,470,
 131   1      	19.38e-6,560,
 132   1      	20.85e-6,610,
 133   1      	25.06e-6,1e3,
 134   1      	80.42e-6,5.1e3,
 135   1      	149.5e-6,10e3,
 136   1      	284.2e-6,20e3,
 137   1      	424.7e-6,30e3,
 138   1      //	649.7e-6,41e3,
 139   1      	592.4e-6,43e3,
 140   1      	701.9e-6,51e3,
 141   1      	946.6e-6,68e3,
 142   1      	1.362e-3,100e3,
 143   1      	1.608e-3,120e3,
 144   1      	2.048e-3,150e3,
 145   1      	7.490e-3,560e3,
 146   1      	12.51e-3,1e6,
 147   1      	15.89e-3,1.2e6,
 148   1      	25.01e-3,2e6
 149   1      	};
 150   1      	float rx;
 151   1      	char i;
 152   1      	if(T<T_MAX)
 153   1      		{
 154   2      		for(i=0;i<sizeof(tab)/8-2;i++)
 155   2      			{
 156   3      			if(T<tab[i+1][0])break;
 157   3      			}
 158   2      		rx=tab[i][1]+(tab[i+1][1]-tab[i][1])*(T-tab[i][0])/(tab[i+1][0]-tab[i][0]);
 159   2      		}
 160   1      	else  rx=R_MAX;		//rx=INF
 161   1      	if(rx<0) rx=0;
 162   1      	return rx;
 163   1      }
 164          
 165          float L_value(float T)
 166          {
 167   1      	float code tab[][2]=
 168   1      	{//Ti*Ti,Li;	按Ti*Ti升序排列
 169   1      	43.76e-12,5.6e-6,
 170   1      	70.55e-12,10e-6,
 171   1      	649.7e-12,100e-6,
 172   1      	6.076e-9,1e-3
 173   1      	};
 174   1      	float lx;
 175   1      	char i;
 176   1      	T*=T;
 177   1      	if(T<T_MAX*T_MAX)
 178   1      		{
 179   2      		for(i=0;i<sizeof(tab)/8-2;i++)
C51 COMPILER V6.12  MAIN                                                                   06/28/2007 13:08:17 PAGE 4   

 180   2      			{
 181   3      			if(T<tab[i+1][0])break;
 182   3      			}
 183   2      		lx=tab[i][1]+(tab[i+1][1]-tab[i][1])*(T-tab[i][0])/(tab[i+1][0]-tab[i][0]);
 184   2      		}
 185   1      	else	lx=L_MAX;
 186   1      	return lx;
 187   1      }
 188          
 189          float C_value(float T)
 190          {
 191   1      	float code tab[][2]=
 192   1      	{//Ti,Ci;	按Ti升序排列
 193   1      	4.578e-6,0,
 194   1      	4.657e-6,5e-12,
 195   1      	4.736e-6,10e-12,
 196   1      	4.911e-6,22e-12,
 197   1      	5.031e-6,30e-12,
 198   1      	5.065e-6,33e-12,
 199   1      	6.045e-6,100e-12,
 200   1      	7.311e-6,200e-12,
 201   1      	10.27e-6,470e-12,
 202   1      	15.88e-6,1e-9,
 203   1      	18.89e-6,1.5e-9,
 204   1      	48.03e-6,4.7e-9,
 205   1      	88.70e-6,6.8e-9,
 206   1      	111.6e-6,10e-9,
 207   1      	239.0e-6,20e-9,
 208   1      	395.7e-6,47e-9,
 209   1      	980.0e-6,100e-9
 210   1      	};
 211   1      	float cx;
 212   1      	char i;
 213   1      	if(T<T_MAX)
 214   1      		{
 215   2      		for(i=0;i<sizeof(tab)/8-2;i++)
 216   2      			{
 217   3      			if(T<tab[i+1][0])break;
 218   3      			}
 219   2      		cx=tab[i][1]+(tab[i+1][1]-tab[i][1])*(T-tab[i][0])/(tab[i+1][0]-tab[i][0]);
 220   2      		}
 221   1      	else  cx=C_MAX;
 222   1      	if(cx<0) cx=0;
 223   1      	return cx;
 224   1      }
 225          /*数值滤波函数*/
 226          float shuzhilvbo(float in)
 227          {	static float out;
 228   1      	float x;
 229   1      	x=fover(in)?1:fabs(in-out)/in;
 230   1      	if(fover(x)||x>0.005) out=in;
 231   1      //	else if(x>0.001) out=0.95*out+0.05*in;	
 232   1      	return out;
 233   1      }
 234          /*脉冲周计算函数*/
 235          float puls_cycle(void)
 236          {
 237   1      	float t;
 238   1      	if(Count.l!=0)
 239   1      		{
 240   2      		t=65536e-6*8;
 241   2      		t=t/Count.l;
C51 COMPILER V6.12  MAIN                                                                   06/28/2007 13:08:17 PAGE 5   

 242   2      		}
 243   1      	else t=T_MAX;
 244   1      	have_cy=0;
 245   1      	return t;
 246   1      }
 247          void t0_int() interrupt 1 using 1
 248          {
 249   1      	if((++THH0&0x7)==0)
 250   1      		{
 251   2      		T_STOP;
 252   2      		if(!have_cy)
 253   2      			{
 254   3      			//保存计数值
 255   3      			Count.c[0]=0;
 256   3      			Count.c[1]=THH1;
 257   3      			Count.c[2]=TH1;
 258   3      			Count.c[3]=TL1;
 259   3      			have_cy=1;
 260   3      //			LED=!LED;
 261   3      			}
 262   2      		THH0=0;
 263   2      		TH0=0;
 264   2      		TL0=0;
 265   2      		THH1=0;
 266   2      		TH1=0;
 267   2      		TL1=0;
 268   2      		T_RUN;	
 269   2      		}
 270   1      }
 271          
 272          void ex1_int()   interrupt 2 using  1
 273          {
 274   1      	int i;
 275   1      	EX1=0;
 276   1      	for(i=0;i<2000;i++);
 277   1      	if(!key)
 278   1      		{
 279   2      		if(++function==3)function=0;
 280   2      		FUN_PORT=fun_addr[function];
 281   2      		have_cy=1;
 282   2      		}
 283   1      	IE1=0;
 284   1      	EX1=1;
 285   1      }
 286          
 287          void t1_int() interrupt 3 using 1
 288          {	
 289   1      	THH1++;
 290   1      /*	uchar code *p;
 291   1      	T_STOP;
 292   1      	if(!have_cy)
 293   1      		{
 294   1      		time.c[0]=0x00;
 295   1      		time.c[1]=THH0&0xc0;	//保存采样值
 296   1      		time.c[2]=TH0;
 297   1      		time.c[3]=TL0;
 298   1      		count.c[0]=TH1;
 299   1      		count.c[1]=TL1;
 300   1      		have_cy=1;
 301   1      		}
 302   1      		
 303   1      	//重装计数初值
C51 COMPILER V6.12  MAIN                                                                   06/28/2007 13:08:17 PAGE 6   

 304   1      	p=count_chuzhi+5*liangcheng;
 305   1      	THH0=*p++;
 306   1      	TH0=*p++;
 307   1      	TL0=*p++;
 308   1      	TH1=*p++;
 309   1      	TL1=*p;
 310   1      
 311   1      	T_RUN;	*/
 312   1      }
 313          
 314          void init()
 315          {
 316   1      #ifdef SOFT
              	TMOD=0X20;
              	SCON=0X52;
              	TH1=0XF3;
              	TR1=1;
              #else
 322   1         TMOD=0X51;		//T1计数T0计时
 323   1      	TR0=1;
 324   1      	TR1=1;
 325   1      	ET0=1;
 326   1      	ET1=1;
 327   1      	IT1=1;		//init1边延触发
 328   1      	EX1=1;
 329   1      	EA=1;	
 330   1      	FUN_PORT=fun_addr[0];
 331   1      	JIAOZHUN=!key;
 332   1      #endif
 333   1      }
 334          main()
 335          {
 336   1      	float x;
 337   1      	LCD_init();
 338   1      	init();
 339   1      	while(1)
 340   1      		{
 341   2      		if(have_cy)
 342   2      			{
 343   3      			Tin=puls_cycle();	//计算脉冲周期
 344   3      			Tout=shuzhilvbo(Tin);	//数值滤波	
 345   3      //			printf("%f",Tin);
 346   3      			switch(function)
 347   3      				{
 348   4      				case 0:
 349   4      					x=R_value(Tout);
 350   4      					R_disp(x);
 351   4      					break;
 352   4      				case 1:
 353   4      					x=L_value(Tout);
 354   4      					L_disp(x);
 355   4      					break;
 356   4      				case 2:
 357   4      					x=C_value(Tout);
 358   4      					C_disp(x);
 359   4      					break;
 360   4      				}
 361   3      			}
 362   2      		}
 363   1      
 364   1      }

C51 COMPILER V6.12  MAIN                                                                   06/28/2007 13:08:17 PAGE 7   


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =   2248    ----
   CONSTANT SIZE    =    507    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     27      55
   IDATA SIZE       =   ----    ----
   BIT SIZE         =      2    ----
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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