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