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