📄 main.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 + -