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

📄 main.c

📁 压力传感器的驱动
💻 C
字号:
/***************************************************
气压计程序
***************************************************/
#include <msp430x24x.h>
#include <stdio.h>


#define TIMER0H 0xFF;
#define TIMER0L 0xE9;

#define SCLK0 P5OUT &=~BIT2
#define SCLK1 P5OUT |=BIT2
#define DOUT0 P5OUT &=~BIT1      //DIN=0
#define DOUT1 P5OUT |=BIT1       //DIN=1
#define CLKDELAY 5
#define RDINTERVAL 100
#define FILTERPARA 0.125

////****          SPI接口DI线读不同内容时的输出数据×                       ****////
const unsigned char SPI_RST[21]={1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,0,0,0,0,0};
const unsigned char SPI_D1[12]={1,1,1,1,0,1,0,0,0,0,0,0};
const unsigned char SPI_D2[12]={1,1,1,1,0,0,1,0,0,0,0,0};
const unsigned char SPI_W1[12]={1,1,1,0,1,0,1,0,1,0,0,0};
const unsigned char SPI_W2[12]={1,1,1,0,1,0,1,1,0,0,0,0};
const unsigned char SPI_W3[12]={1,1,1,0,1,1,0,0,1,0,0,0};
const unsigned char SPI_W4[12]={1,1,1,0,1,1,0,1,0,0,0,0};
////****          气压高度转换表                   ****////
const  int SPI_HT[23][4]={ 	1000, 1130, 12256, 16212 ,
				1130, 1300, 10758, 15434 ,
				1300, 1500, 9329, 14541 ,
				1500, 1730, 8085, 13630 ,
				1730, 2000, 7001, 12722 ,
				2000, 2300, 6069, 11799 ,
				2300, 2650, 5360, 10910 ,
				2650, 3000, 4816, 9994 ,
				3000, 3350, 4371, 9171 ,
				3350, 3700, 4020, 8424 ,
				3700, 4100, 3702, 7737 ,
				4100, 4500, 3420, 7014 ,
				4500, 5000, 3158, 6346 ,
				5000, 5500, 2908, 5575 ,
				5500, 6000, 2699, 4865 ,
				6000, 6500, 2523, 4206 ,
				6500, 7100, 2359, 3590 ,
				7100, 7800, 2188, 2899 ,
				7800, 8500, 2033, 2151 ,
				8500, 9200, 1905, 1456 ,
				9200, 9700, 1802, 805 ,
				9700, 10300, 1720, 365 ,
				10300, 11000, 1638, -139
};
unsigned int d1,d2,w1,w2,w3,w4;
float height;

void spi_dly(int num)
{  int i;

	for(i=0;i<num;i++)
	{ 	i=i;
   }
}

void spi_set(void)
{  			
   SCLK0;     //SCLK=0
   DOUT0;     //DOUT=0

}
void spi_reset(void)
{  int i;

	spi_dly(10);
	for(i=0;i<21;i++)
   {   
   	if(SPI_RST[i]==0)
          DOUT0;
         else
          DOUT1;
        
       spi_dly(CLKDELAY);
       SCLK1;
       spi_dly(CLKDELAY);
       SCLK0;
   }
   spi_dly(CLKDELAY);
   spi_dly(CLKDELAY*10);
}
// 读D字节子程序   
unsigned int spi_rdd(unsigned char num)
{  unsigned int retval;
   int i;
   unsigned char rdbit;

	spi_dly(CLKDELAY);
	for(i=0;i<12;i++)
   {   if(num==0)
   	{ 	
      	if(SPI_D1[i]==0)
           DOUT0;
          else
           DOUT1;
   	}
   	else if(num==1)
   	{  
      	if(SPI_D2[i]==0)
            DOUT0;
            else
             DOUT1;
   	}
   	else
   	{	retval=0;
   		return 0;
   	}
       spi_dly(CLKDELAY);
       SCLK1;
       spi_dly(CLKDELAY);
       SCLK0;
   }
   spi_dly(CLKDELAY);
 
  rdbit=P5IN&0x01;          //等待AD转换完成
  while(rdbit==1)
  {   
        rdbit=P5IN&0x01;
  }
  retval=0;
  for(i=0;i<16;i++)
  {   SCLK1;
  	spi_dly(CLKDELAY);
      rdbit=P5IN&0x01;
      SCLK0;
  	spi_dly(CLKDELAY);
      if(rdbit==0)
      {   retval=retval+0;
      }
      else
      {   retval=retval+1;
      }
      if(i<15)
       {
       	retval=retval<<1;
       }
  }
   return retval;
}
// 读W字节子程序 
unsigned int spi_rdw(unsigned char num)
{  unsigned int retval;
   int i;
   unsigned char rdbit;

	spi_dly(CLKDELAY);
	for(i=0;i<12;i++)
   {   if(num==0)
   	{ 	
      	if(SPI_W1[i]==0)
           DOUT0;
           else
           DOUT1;
   	}
   	else if(num==1)
   	{  
      	if(SPI_W2[i]==0)
            DOUT0;
           else
             DOUT1;
   	}
      else if(num==2)
   	{  
      	if(SPI_W3[i]==0)
              DOUT0;
             else
              DOUT1;
		}
      else if(num==3)
   	{  if(SPI_W4[i]==0)
               DOUT0;
             else
               DOUT1;
   	}
   	else
   	{	retval=0;
   		return 0;
   	}
       spi_dly(CLKDELAY);
       SCLK1;
       spi_dly(CLKDELAY);
       SCLK0;;
   }
   spi_dly(CLKDELAY);
   SCLK1;
   spi_dly(CLKDELAY);
   SCLK0;
   retval=0;
  for(i=0;i<16;i++)
  {   SCLK1;
  	spi_dly(CLKDELAY);
      rdbit=P5IN&0x01;
      SCLK0;
  	spi_dly(CLKDELAY);
      if(rdbit==0)
      {   retval=retval+0;
      }
      else
      {   retval=retval+1;
      }
      if(i<15)
       {
       	retval=retval<<1;
       }
  }
   return retval;
}
// 根据气压计算高度子程序 
float spi_h(float p)
{  int i,pos,flag;
   float h;

	flag=0;
   for(i=0;i<23;i++)
   {  if((p>=SPI_HT[i][0])&&(p<=SPI_HT[i][1]))
   	{    pos=i;
           flag=1;
           break;
      }
   }
   if(flag!=1)
   {  if(p<SPI_HT[0][0])
   	{  pos=0;
      }
      else if(p>SPI_HT[22][1])
      {  pos=22;
      }
      else
      { pos=0;
      }
   }
   h=SPI_HT[pos][3]-(p-SPI_HT[pos][0])*SPI_HT[pos][2]/2048;
   return h;
}
//计算子程序 
float spi_proc(void)
{  unsigned int c1,c2,c3,c4,c5,c6;
	long utmp;
   float dt,temp,off,sens,x,p,h;
   float temp2,p2;
   c1=(w1&0xfffe)>>1;
   c2=((w3&0x003f)<<6)+((w4&0x003f)>>0);
   c3=((w4&0xffc0)>>6);
   c4=((w3&0xffc0)>>6);
   c5=((w1&0x0001)<<10)+((w2&0xffc0)>>6);
   c6=(w2&0x003f);
   
   utmp=8*c5+20224;
   dt=(float)(d2-utmp);
   temp=200+dt*(c6+50)/1024;
   off=c2*4+((c4-512)*dt)/4096;
   sens=c1+(c3*dt)/1024+24567;
   x=(sens*(d1-7168))/16384-off;
   p=x*10/32+250*10;

   if(temp>450)
   {	temp2=3*(c6+24)*(450 - temp)*(450-temp)/1048576;
 		p2=temp2*(p-10000)/8192;
   }
   else if(temp<200)
   {  temp2=11*(c6+24)*(200-temp)*(200-temp)/1048576;
 		p2=3*temp2*(p-3500)/16384;
   }
   else
   {  temp2=0;
   	p2=0;
   }
   temp=temp-temp2;
   p=p-p2;
   h=spi_h(p);
   return h;
}
void initp5(void)        //初始化P5口
{
        P5SEL |=BIT6;      //P5.6= ACLK 输出
        P5DIR |=BIT2;    //P5.2=SCLK
        P5DIR |=BIT1;     //P5.1=DIN
        P5DIR &=~BIT0;   //P5.0=DOUT
}

/* 主程序入口  */
int main(void)
{	WDTCTL = WDTPW + WDTHOLD;
        initp5();
        spi_set();
	
	while(1)
	{
	 spi_reset();
	  spi_dly(RDINTERVAL);
	 w1=spi_rdw(0);
	  spi_dly(RDINTERVAL);
	 w2=spi_rdw(1);
	  spi_dly(RDINTERVAL);
	 w3=spi_rdw(2);
	  spi_dly(RDINTERVAL);
	 w4=spi_rdw(3);
	  spi_dly(RDINTERVAL);
	 d1=spi_rdd(0);
	  spi_dly(RDINTERVAL);
	 d2=spi_rdd(1);
	  spi_dly(RDINTERVAL);
	 height=spi_proc();
	}
}

⌨️ 快捷键说明

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