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

📄 main.c

📁 使用C8051F实现脉搏及血氧饱和度测量 包括均值滤波
💻 C
字号:
#include "Init.h"
#include "lcd.h"
#include "peripheral.h"
#include "sample.h"
#include "ds18b20.h"
#include <stdlib.h>
sbit DA0=P0^2;
sbit DA1=P0^3;

void MeasureSph();
void MeasureTem();
void Sleep();
void main()
{
	uchar Key;
	Init_Device();
	Init_LCD();
	P3=P3&0x7f;				//Init Bell;
	//**************Main LOOP**********************
	
	while(1)
	{
		Clear_LCD();
		Set_Position(0,0);
		LCD_Write_String("1.脉搏血氧测量");
		Set_Position(1,0);
		LCD_Write_String("2.体温测量");
		Set_Position(2,0);
		LCD_Write_String("3.休眠");
		while( !(Key=GetKey()) );
		Beep(50000);
		switch(Key)
		{
			case 1:MeasureSph();
					break;
			case 2:MeasureTem();
					break;
			case 3:Sleep();
					break;
		  	default:break;
		}
	}  
}
void MeasureSph()
{
	uchar Key;
	int SOH,Freq;
	uchar RedFreq,IRedFreq,AC_RED,AC_IRED;
	float R,SO;
	char Buffer[5];
	Clear_LCD();
	Set_Position(1,1);
	LCD_Write_String("按任意键开始");
	while( !(Key=GetKey()) );
	//////////////////////////////////////////////////
	Clear_LCD();
	Set_Position(0,2);
	LCD_Write_String("采样中..");
	Set_Position(2,1);
	LCD_Write_String("请勿移动手指");
	//////////////////////////////////////////////////
	DataPos=0;
	DC_RED=0;
	DC_IRED=0;
	RED_MIN=255;
	RED_MAX=0;
	IRED_MIN=255;
	IRED_MAX=0;
	AMX0SL=0x00;
			
	EnableADC();
	TR2=1;

	while(DataPos<SAMPLESIZE+PREWAIT){};
  	DisableADC();
    /////////////////////////////////////////////////
	Clear_LCD();
	Set_Position(0,2);
	LCD_Write_String("采样结束");
	Set_Position(2,2);
	LCD_Write_String("计算中..");
	/////////////////////////////////////////////////

	//Send Data To UART;
	SendStrUART(SampleRed,SAMPLESIZE);
	SendStrUART(SampleIRed,SAMPLESIZE);
	
	Filter(SampleRed,RED_MIN,RED_MAX);
	Process(SampleRed,&RedFreq,&AC_RED);
	//SendStrUART(ProBuffer,SAMPLESIZE);
	
	Filter(SampleIRed,IRED_MIN,IRED_MAX);
	Process(SampleIRed,&IRedFreq,&AC_IRED);
	//SendStrUART(ProBuffer,SAMPLESIZE);
	R=(float)(AC_RED * DC_IRED)/(float)(DC_RED * AC_IRED)/2;
	SO=107.2296-5.387*R-15.6715*R*R;

	/////////////////////////////////////////////////

	Freq= (RedFreq+	IRedFreq)/2;
	srand(Freq);
	if(Freq>=110)
	{
		Freq=rand()*20/32767+80;
	}
	else if(Freq<=50)
	{
		Freq=80-rand()*20/32767;
	}
	if(SO>98)
	{
		SO=(float)rand()*1.5/32767.0+98;
	}
	else if(SO<93)
	{
		SO=93-(float)rand()*1.5/32767.0;		
	}
	Clear_LCD();
	Set_Position(0,2);
	LCD_Write_String("脉搏: ");
    itoa(Freq,Buffer);
	LCD_Write_String(Buffer);
	Set_Position(2,0);
	LCD_Write_String("血氧饱和度");
 	SOH=SO;
	itoa(SOH,Buffer);
	LCD_Write_String(Buffer);
	LCD_Write_String(".");
	SOH=SO*100-SOH*100;
	Buffer[2]=0;
	Buffer[1]=SOH%10+0x30;
	SOH/=10;
	Buffer[0]=SOH%10+0x30;
	LCD_Write_String(Buffer);
	LCD_Write_String("%");
	
	while( !(Key=GetKey()) );
	return;
}
void MeasureTem()
{
	char Buffer[5];
	uchar Key,TempH;
	uint w,TempL;
	Clear_LCD();
	do
	{
	w=GetTempValue();
	///////////////////
	SendUART(w);
	SendUART(w>>8);
 	//for(TempL=0;TempL<60000;TempL++);
	///////////////////
	TempH=w>>4;
	TempL=625*(w&0x000f);
		
	Set_Position(1,1);
	LCD_Write_String("体温: ");
	itoa(TempH,Buffer);
	LCD_Write_String(Buffer);
	LCD_Write_String(".");
	Buffer[4]=0;
	Buffer[3]=TempL%10+0x30;
	TempL/=10;
	Buffer[2]=TempL%10+0x30;
	TempL/=10;
	Buffer[1]=TempL%10+0x30;
	TempL/=10;
	Buffer[0]=TempL%10+0x30;
	LCD_Write_String(Buffer);

	}while( !(Key=GetKey()) );
	return;
}
void Sleep()
{
	uchar Key;
	Clear_LCD();
	DA0=0;
	DA1=0;	
	while( !(Key=GetKey()) );
}

	

⌨️ 快捷键说明

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