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

📄 ads1242.c

📁 在MSP430下操作IC卡以及FLASH以及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 + -