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

📄 baro.c

📁 航空用高度计的单片机程序
💻 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 + -