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

📄 spo2.c

📁 脉搏血氧仪源程序
💻 C
字号:
#include<absacc.h>
#include<reg51.h>
#define uchar unsigned char
#define IN0 XBYTE[0x7ff8]

sbit CSL=P2^0;//地位显示控制
sbit CSH=P2^1;//高位显示控制
sbit A0=P2^2;//自动增益控选择
sbit A1=P2^3;
sbit Start=P2^6;
sbit Cp=P2^5;
sbit R_Flg=P2^4;//红光标志
bit Flg1=0;//红光采集完成标志
bit Flg2=0;//红外光采集完成标志
uchar data g_Dsy_H;  //显存高位
uchar data g_Dsy_L;  //显存低位
uchar data g_RData[7];//红光数据缓存
uchar data g_IRData[7];//红外光数据存缓存
uchar data counter1=0;//转换次数计数
uchar data counter2=0;
uchar data max1=0;
uchar data max2=0;
uchar data min1=0xff;
uchar data min2=0xff;
uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//定义字形0-9编码表



void adc0809()									//AD启动函数
{
	uchar xdata *ad_adr1;
	ad_adr1=&IN0;
	*ad_adr1=0;//启动转换
}

void pulse(void) interrupt 1 using 1			//定时器0中断服务程序
{
	Cp=~Cp;//P2.5翻转
	TH0=-1000/256;//重装初始值
	TL0=-1000%256;
}

void ad_Interyupt(void) interrupt 0 using 0		//外部中断0中断服务程序
{
	uchar xdata *ad_adr;
	ad_adr=&IN0;
	P2=0xff;
	if(1==R_Flg)
	{
		g_RData[counter1]=*ad_adr;
		counter1++;
	}
	else
	{
		g_IRData[counter2]=*ad_adr;
		counter2++;
	}
	
	if(6==counter1)
	{
		counter1=0;
		Flg1=1;
	}
	if(6==counter2)
	{
		counter2=0;
		Flg2=1;
	}
}

void AdvanceSample()				//预采函数
{
	uchar data i;
	int data j=0;
	while(j<=2900)
	{
		uchar temp1=0;
		uchar temp2=g_RData[1];
		uchar temp3=0;
		uchar temp4=g_IRData[1];
		if(1==Flg1)
		{
			Flg1=0;
			j++;
			for(i=0;i<7;i++)
			{
				if(g_RData[i]>temp1)
				{
					temp1=g_RData[i];
				}	
				if(g_RData[i]<temp2)
				{
					temp2=g_RData[i];
				}				
			}
		}
		if(temp1>max1)
		{
			max1=temp1;
		}
		if(temp2<min1)
		{
			min1=temp2;
		}


		if(1==Flg2)
		{
			Flg2=0;
			//j++;
			for(i=0;i<7;i++)
			{
				if(g_IRData[i]>temp1)
				{
					temp3=g_IRData[i];
				}	
				if(g_IRData[i]<temp4)
				{
					temp4=g_RData[i];
				}				
			}
		}
		if(temp3>max2)
		{
			max2=temp3;
		}
		if(temp4<min2)
		{
			min2=temp4;
		}
	}
}

void SetAv(uchar *p)				//自动增益调整函数
{
	if(*p<0x7f)
	{
		A0=0;
		A1=0;
		AdvanceSample();
	}
	else if(*p>0xff)
	{
		A0=0;
		A1=1;
		AdvanceSample();
	}
	if(*p>0xff)
	{
		A0=1;
		A1=1;
		AdvanceSample();
	}
}

void Display()				//显示子函数
{
	CSL=1;
	CSH=0;
	P1=table[g_Dsy_L];
	CSL=0;
	CSH=1;
	P1=table[g_Dsy_H];
}

void DataProcess(uchar a[7])//该函数未完待续
{
	uchar maxvalue;
	uchar minvalue;
	uchar x1,x2,x3,y1,y2,y3;
	x1=a[0]-a[1];
	x2=a[1]-a[2];
	x3=a[2]-a[3];
	y1=a[3]-a[4];
	y2=a[4]-a[5];
	y3=a[5]-a[6];
	if(x1<0&&x2<0&&x3<0&&y1>0&&y2>0&&y3>0)
	{
		maxvalue=a[3];
	}
	if(x1>0&&x2>0&&x3>0&&y1<0&&y2<0&&y3<0)
	{
		minvalue=a[3];
	}
}

//延时模块
void Delay(unsigned int value)
{
	while(value!=0)
	{
		value--;
	}
}


void main()
{
	uchar ar0,ar1,air0,air1;
	A0=1;
	A1=0;
	while(1)//等待开始键按下
	{
		if(0==Start)
		{
			Delay(1000);
			P2=0xff;
			if(0==Start)
				break;
		}
		else
			P2=0xff;
		
	}
	
	TMOD=0x01;//设置定时器初值,开中断,启动定时器
	EA=1;
	ET0=1;
	TH0=-1000/256;
	TL0=-1000%256;
	TR0=1;
	Cp=0;
	IT0=1;
	EX0=1;

	AdvanceSample();
	SetAv(&max1);
	ar0=A0;
	ar1=A1;
	SetAv(&max2);
	air0=A0;
	air1=A1;
	while(1)
	{
		if(1==R_Flg)
		{
			A0=ar0;
			A1=ar1;
		}
		else
		{
			A0=air0;
			A1=air1;
		}
		adc0809();
		if(1==Flg1)
		{
			DataProcess(g_RData);
		}
		else if(1==Flg2)
		{
			DataProcess(g_IRData);
		}
		Display();
	 }
}

⌨️ 快捷键说明

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