📄 ads1242.c
字号:
/*
* copyright (c) 兰州瑞德高科技有限公司电专项目组
* all rights reserved.
* 文件名称: ads1242.c
* 摘 要: ads1242的温度采集
* 当前版本: v1.0
* 作 者: 杨晓卫 and 周军
* 完成日期: 2004.7.29
*/
#ifndef ADS1242_C
#define ADS1242_C
#include <msp430x41x.h>
#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
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -