📄 baro.c
字号:
/***************************************************
气压计程序
***************************************************/
#include <reg52.h>
#include <stdio.h>
#include <stdlib.h>
#include <absacc.h>
#include <ctype.h>
#include <string.h>
#include <stddef.h>
#include <intrins.h>
#include <absacc.h>
#include <stdarg.h>
#define TIMER0H 0xFF;
#define TIMER0L 0xE9;
sbit MCLK=P1^4 ;
sbit SCLK=P1^5 ;
sbit DI=P1^6 ;
sbit DOUT=P1^7 ;
#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 unsigned char 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;
////**** SPI口CLK延迟宽度子程序 ****????
void spi_dly(int num)
{ int i;
for(i=0;i<num;i++)
{ i=i;
}
}
////**** SPI口初始化 **
void spi_set(void)
{
SCLK=0;
DI=0;
}
void spi_reset(void)
{ int i;
spi_dly(10);
for(i=0;i<21;i++)
{
DI=SPI_RST[i];
spi_dly(CLKDELAY);
SCLK=1;
spi_dly(CLKDELAY);
SCLK=0;
}
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)
{
DI=SPI_D1[i];
}
else if(num==1)
{
DI=SPI_D2[i];
}
else
{ retval=0;
return 0;
}
spi_dly(CLKDELAY);
SCLK=1;;
spi_dly(CLKDELAY);
SCLK=0;
}
spi_dly(CLKDELAY);
// wait adc conversion
rdbit=DOUT;
while(rdbit==1)
{
rdbit=DOUT;
}
retval=0;
for(i=0;i<16;i++)
{ SCLK=1;
spi_dly(CLKDELAY);
rdbit=DOUT;
SCLK=0;
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)
{
DI=SPI_W1[i];
}
else if(num==1)
{
DI=SPI_W2[i];
}
else if(num==2)
{
DI=SPI_W3[i];;
}
else if(num==3)
{ DI=SPI_W4[i];
}
else
{ retval=0;
return 0;
}
spi_dly(CLKDELAY);
SCLK=1;
spi_dly(CLKDELAY);
SCLK=0;;
}
spi_dly(CLKDELAY);
SCLK=1;
spi_dly(CLKDELAY);
SCLK=0;
for(i=0;i<10;i++)
{ rdbit=DOUT;
}
retval=0;
for(i=0;i<16;i++)
{ SCLK=1;
spi_dly(CLKDELAY);
rdbit=DOUT;
SCLK=0;
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;
}
////**** 计算子程序 ××××/////
void spi_proc(void)
{ unsigned int c1,c2,c3,c4,c5,c6;
long utmp;
float dt,temp,off,sens,x,p,h;
float temp2,p2;
//printf("D1=%x D2=%x W1=%x W2=%x W3=%x W4=%x\r\n",d1,d2,w1,w2,w3,w4);
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);
//printf("C1=%x C2=%x C3=%x C4=%x C5=%x C6=%x\r\n",c1,c2,c3,c4,c5,c6);
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);
}
////**** 定时器0中断程序 ××××////
void time0(void) interrupt 1
{
if(MCLK==0)
{ MCLK=1;
}
else
{ MCLK=0;
}
TL0 = TIMER0L;
TH0 = TIMER0H;
}
/* 初始化子程序 */
void init(void)
{
//timer0 init
TL0 = TIMER0L;
TH0 = TIMER0H;
TR0=1;
ET0=1;//test
TMOD=0x21;
// irq init
EX0=0;
IT0=0;
EX1=0;
IT1=0;
EA=1;
}
/* 主程序入口 */
int main(void)
{ init();
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);
spi_proc();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -