www.pudn.com > newrlb.rar > ads1242.c


/* 
* copyright (c) 兰州瑞德高科技有限公司电专项目组 
* all rights reserved. 
 
* 文件名称: ads1242.c 
* 摘    要: ads1242的温度采集 
 
* 当前版本: v1.0 
* 作    者: 杨晓卫 and 周军 
* 完成日期: 2004.7.29 
*/ 
#ifndef ADS1242_C 
#define ADS1242_C 
 
#include  
#include "predef.h" 
 
#define RESIST 1980 
 
#define DIBIT   BIT7  // 
#define DIOUT   P1OUT 
#define DIDIR   P1DIR 
 
#define DOBIT 	BIT6  //   
#define DOIN    P1IN 
#define DODIR   P1DIR 
 
 
#define PDBIT   BIT4  // 
#define PDOUT   P2OUT 
#define PDDIR   P2DIR 
 
#define DRBIT   BIT5  // 
#define DRIN    P1IN 
#define DRDIR   P1DIR 
 
#define CLBIT   BIT3  // 
#define CLOUT   P2OUT 
#define CLDIR   P2DIR 
 
#define VEFBIT   BIT4  // 
#define VEFOUT   P6OUT 
#define VEFDIR   P6DIR 
 
 
 
//define ADS1242 command 
#define RDATA		0X01	//0000 0001  read data 
#define RDATAC		0X03	//0000 0011  read data contiunousyl     
#define STOPC		0X0F	//0000 1111  stop read data contiunousyl  
#define RREG		0X10	//0001 xxxx  read form REG "rrrr" 
#define WREG	        0X50	//0101 xxxx  write to  REG "rrrr"  
#define SELFCAL		0X0F0	//1111 0000  self cal offset and gain 
#define SELFOCAL	0X0F1	//1111 0001  self cal offseet 
#define SELFGCAL	0X0F2	//1111 0010  self cal gain  
#define SYSOCAL	        0X0F3	//1111 0011  sys cal offset 
#define SYSGCAL		0X0F4	//1111 0100  sys cal gain  
#define DSYNC	        0X0FC	//1111 1100  sync DRDY 
#define SLEEP	        0X0FD	//1111 1101  put in sleep mode 
#define RESET	        0X0FE	//1111 1110  reset to power-up values 
 
#define R_SETUP         0X00 
#define R_MUX           0X01 
#define R_ACR           0X02 
#define R_ODAC          0X03 
#define R_DIO           0X04 
#define R_DIR           0X05 
#define R_IOCON         0X06 
#define R_OCR0          0X07 
#define R_OCR1          0X08 
#define R_OCR2          0X09 
#define R_FSR0          0X0A 
#define R_FSR1          0X0B 
#define R_FSR2          0X0C 
#define R_DOR2          0X0D 
#define R_DOR1          0X0E 
#define R_DOR0          0X0F 
 
 
const float A=1/RESIST; 
const float A1=0.14; 
 
const float hzb[101] = {0.0000,4.7841,8.9963,13.206,17.412,21.616,25.818,30.018,34.215,38.411, 
                        42.605,46.798,50.989,55.178,59.367,63.554,67.740,71.926,76.110,80.294, 
                        84.476,88.659,92.840,97.021,101.20,105.38,109.56,113.74,117.92,122.10, 
                        126.28,130.46,134.63,138.81,142.99,147.17,151.35,155.52,159.70,163.88, 
                        168.06,172.24,176.41,180.59,184.77,188.95,193.13,197.31,201.49,205.67, 
                        209.85,214.03,218.21,222.39,226.57,230.75,234.94,239.12,243.30,247.48, 
                        251.67,255.85,260.04,264.22,268.41,272.59,276.78,280.97,285.15,289.34, 
                        293.53,297.72,301.91,306.10,310.29,314.48,318.68,322.87,327.06,331.26, 
                        335.45,339.65,343.85,348.04,352.24,356.44,360.64,364.84,369.04,373.25, 
                        377.45,381.65,385.86,390.07,394.27,398.48,402.69,406.90,411.11,415.33, 
                        419.54}; 
                         
const float mdb[101] = {1000.2,1000.2,1000.2,1000.2,1000.2,1000.2,1000.2,1000.1,1000.1,1000.0, 
                        999.94,999.84,999.74,999.61,999.48,999.34,999.18,999.01,998.83,998.64, 
                        998.44,998.22,998.00,997.77,997.52,997.27,997.01,996.74,996.46,996.17, 
                        995.87,995.56,995.25,994.93,994.59,994.25,993.91,993.55,993.19,992.81, 
                        992.44,992.05,991.65,991.25,990.85,990.43,990.01,989.58,989.14,988.70, 
                        988.25,987.80,987.33,986.87,986.39,985.91,985.42,984.93,984.43,983.93, 
                        983.41,982.90,982.37,981.84,981.31,980.77,980.22,979.67,979.12,978.55, 
                        977.98,977.41,976.83,976.25,975.66,975.06,974.46,973.86,973.25,972.63, 
                        972.01,971.39,970.76,970.12,979.48,968.84,968.19,967.53,966.87,966.21, 
                        965.54,964.86,964.18,963.50,962.81,962.12,961.42,960.72,960.01,959.30, 
                        958.58}; 
 
uint tempdisplay1,tempdisplay2; //进水温度,回水温度显示值  
uchar measureFlag;             //是否测温标志 
 
 
void delay(unsigned long i); 
void measure1(void); 
void initads1242(void); 
unsigned long read_data(void); 
void write_setup(uchar data1,uchar data2,uchar data3); 
void write_mux(uchar data); 
void write_acr(uchar data); 
void write_odac(uchar data); 
void send_char(uchar Data); 
unsigned long get_char(void); 
 
//extern ulongint rls; 
ulongint rls; 
void measure1(void) 
{ 
  uint temp; 
  float temp1,temp2,temp3; 
  float hz1,hz2,md1,md2,hz,md;   //焓值,密度 
  float ti,ti1;///供水温度,回水温度测量值 
  uint iii; 
 
    _DINT(); 
   PDOUT |= PDBIT; 
   VEFOUT |=VEFBIT; 
    CLOUT &=~CLBIT; 
 
    send_char(RESET); 
    send_char(SELFCAL); 
//   delay(35000);                   //4M 
   delay(50000);                     //4.5M  
 
    write_setup(0x00,0x01,0x60);//?? 
//   delay(35000); 
   delay(50000); 
    
    temp1=read_data(); 
    write_mux(0x12); 
//   delay(35000); 
   delay(50000); 
    
    temp2=read_data(); 
    write_mux(0x23); 
//   delay(35000); 
   delay(50000); 
   
    temp3=read_data(); 
    VEFOUT &= ~VEFBIT; 
    PDOUT&=~PDBIT; 
    DIOUT&=~DIBIT; 
    CLOUT &=~CLBIT; 
     
     ti=((temp1/temp2/A-1000)/3.907768+(temp1/temp2/A-1000)/(1.0/(temp1/temp2/A-1000))/1.052402E+5); 
     ti1=((temp3/temp2/A-1000)/3.907768+(temp3/temp2/A-1000)/(1.0/(temp3/temp2/A-1000))/1.052402E+5)+A1; 
 
   
  tempdisplay1=0;tempdisplay2=0; 
   tempdisplay1=ti/0.01; 
   tempdisplay2=ti1/0.01; 
   if(tempdisplay2>tempdisplay1) 
    { 
    temp=tempdisplay2; 
    tempdisplay2=tempdisplay1; 
    tempdisplay1=temp; 
    } 
  
    iii = ti; 
    _NOP(); 
    if(iii<100) hz1 = hzb[iii]+((hzb[iii+1]-hzb[iii]))*(ti-iii); 
    else hz1 = hzb[100]; 
    _NOP(); 
    if(iii<100)md1 = mdb[iii]-((mdb[iii]-mdb[iii+1]))*(ti-iii); 
    else md1 = mdb[100]; 
    _NOP(); 
    iii = ti1; 
    _NOP(); 
    if(iii<100)hz2 = hzb[iii]+((hzb[iii+1]-hzb[iii]))*(ti1-iii); 
    else hz2 = hzb[100]; 
    _NOP(); 
    if(iii<100)md2 = mdb[iii]-((mdb[iii]-mdb[iii+1]))*(ti1-iii); 
 
    else md2 = mdb[100]; 
    _NOP(); 
      if(hz1>hz2) hz = hz1 - hz2; 
      else hz = hz2 - hz1; 
    md=md2; 
            rls=md/(1/hz)/1E+2;  //100==10升,1000==1升 
 
 
    measureFlag = 0; 
 
    _EINT(); 
} 
 
unsigned long read_data(void) 
{ 
   
  unsigned long d=0; 
  send_char(RDATA); 
  d = get_char(); 
  return (d); 
} 
  
void write_odac(uchar data) 
{ 
  send_char(WREG+R_ODAC); 
  send_char(0); 
  send_char(data); 
 
} 
 
void write_acr(uchar data) 
{ 
  send_char(WREG+R_ACR); 
  send_char(0); 
  send_char(data); 
 
} 
 
void write_setup(uchar data1,uchar data2,uchar data3) 
{ 
  send_char(WREG+R_SETUP); 
  send_char(0x02); 
  send_char(data1); 
  send_char(data2); 
  send_char(data3); 
 
} 
void write_mux(uchar data) 
{ 
  send_char(WREG+R_MUX); 
  send_char(0); 
  send_char(data); 
} 
void initads1242(void) 
{  
PDDIR |= PDBIT; 
PDOUT &=~ PDBIT; 
 
DIDIR |= DIBIT; 
DIOUT &=~DIBIT; 
 
DODIR &=~DOBIT; 
 
DRDIR &=~DRBIT; 
 
CLDIR |= CLBIT; 
CLOUT &=~CLBIT; 
 
VEFDIR |= VEFBIT; 
VEFOUT &=~VEFBIT; 
 
} 
 
 
void send_char(uchar Data) 
{ 
         uchar k; 
	_DINT(); 
	for(k=8;k>0;k--) 
	  { 
		CLOUT |= CLBIT; 
		_NOP(); 
		if((Data&0x80)==0x80) 
	  		DIOUT |= DIBIT; 
		else 
			DIOUT &= ~DIBIT; 
		_NOP(); 
		_NOP(); 
		_NOP(); 
		 
		CLOUT &= ~CLBIT; 
		_NOP(); 
		_NOP(); 
		_NOP(); 
		 
		Data=Data<<1; 
	  } 
      CLOUT &=~CLBIT;   
      _EINT(); 
	 
} 
 
unsigned long get_char(void) 
{ 
        uchar k; 
        unsigned long j=0; 
 
	j=0; 
	_DINT(); 
	for(k=24;k>0;k--) 
	  { 
		j=j<<1; 
		 
		CLOUT |= CLBIT; 
		_NOP(); 
		_NOP(); 
		_NOP(); 
		_NOP(); 
		if((DOIN&DOBIT)==DOBIT) j++; 
			 
		_NOP(); 
		CLOUT &= ~CLBIT; 
		 
		 
		_NOP(); 
		_NOP(); 
		_NOP(); 
		_NOP(); 
		 
		 
		 
	  } 
	  
	 j=(j&0x00ffffff);  
	_NOP(); 
	CLOUT &=~CLBIT; 
	_EINT(); 
	return (j); 
	 
} 
 
 
void delay(unsigned long i) 
{ 
for(;i>0;i--); 
} 
 
#endif