ob体育竞彩 _欧宝体育在线链接 學習網站

單片機光電脈搏檢測儀源程序

時間:2017-03-04 20:16 來源:ob体育竞彩

因為最小係統都是那幾樣東西就沒上這個圖了,主要就是AT89S52+DS1302+24C02,還有就是用紅外對管做的傳感器模塊。
光電脈搏檢測的基本原理是:隨著心髒的搏動,人體組織半透明度隨之改變。當血液送到人體組織時,組織的半透明度減小;當血液流回心髒,組織的半透明度增大,這種現象在人體組織較薄的手指尖、耳垂等部位最為明顯。利用波長600-1000nm的紅光或紅外發光二極管產生的光線照射到人體的手指尖、耳垂等部位,用裝在該部位另一側或同側旁邊的光電接收管來檢測機體組織的透明程度,即可將搏動信息轉換成電信號。

#include
#include "LCD12864.h"
#include "math.h"
#include "DS1302.h"
#include "AT24C02.H"
//#include "Draw_Sin.h"
//#include "System_Init.h"
#define uchar unsigned char
#define uint unsigned int
unsigned char chuzhi;
unsigned char flang1=0;
unsigned char DATA1;
#define Key_Start P1_0
#define Key_Return P1_1
#define Key_Find P1_2 //查詢按鍵
#define Key_Sin P1_3 //查詢按鍵
#define Bee P3_3
#define Inter P3_5
#define LED P1_4
sfr WDTRST =0xA6;
unsigned int k; //定義定時器中間變量
unsigned char Face=0; //界麵變量
bit KeyStart_Switch; //定義開關允許位 為0時開關有效
bit Check_flag; //檢測標誌位 檢測到脈搏時為1,否則為0
unsigned char H,L;
unsigned int Temp_fan,DATA;
bit Save_falg;
unsigned char Write_add; //量測完成後,24C0X寫操作指向地址
unsigned char jayt; //進度條變量
unsigned char Num[4]; //顯示緩存
bit Sleep_mode; //睡眠模式開啟標誌位,為1時為開啟狀態
bit alarm; //上下限報警標誌位
unsigned char time[3]; //從24C0X取出的時間顯示緩存
void read_24c02();
void Display_LCD12864_Face3();
void cunchu_24c02();
void Display_Auto_Mode();
void Timer0NCounterT1_Init();
void Rst_Watchdog(void); //看門狗拿來複位
void Cotrl_Key(); //按鍵控製
void Display_LCD12864_Face0(); //界麵一
void Display_LCD12864_Face1(); //界麵二
void Display_LCD12864_Face2(); //界麵三
void Display_LCD12864_Face3(); //界麵四
void Display_LCD12864_Face4(); //界麵五
void Display_Auto_Mode(); //睡眠模式界麵
void Timer0NCounterT1_Init()
{
EA=1;
TMOD=0X51;
TH0=0xd8;
TL0=0xf0;
ET0=1;
TH1=0X00;TL1=0X00;
ET1=1;
TR0=0;
TR1=1;
}
void Bee_Speak(unsigned int t)
{
Bee=0;LED=0;
delay_ms(t);
Bee=1;LED=1;
delay_ms(t);
}
void Rst_Watchdog(void) //看門狗拿來複位
{
WDTRST = 0x1E; //先賦值1E 然後賦值E1
WDTRST = 0xE1;
}
void Cotrl_Key()
{
if(Key_Start==0)
{
delay_ms(10);
if(Key_Start==0)
{
if(KeyStart_Switch==0)
{
TR1=0;
TH1=0X00; //
TL1=0X00; //計數器清零
TR0=1; //
TR1=1; //
Face=1; //切換到界麵一
LcdWcom(0x01);
Bee_Speak(50);
KeyStart_Switch=1;
}
while(Key_Start==0);
}
}
if(Key_Return==0)
{
delay_ms(10);
if(Key_Return==0)
{
Rst_Watchdog(); // 複位
Bee_Speak(50);
}
}
if(Key_Find==0) //查詢按鍵
{
delay_ms(50);
if(Key_Find==0)
{
if(Face==0||Face==2||Face==3||Face==4) //待機狀態下
{
TL1=0;
TR1=0;
Face=3; //查詢界麵
Check_flag=1; //關閉自動模式
Display_LCD12864_Face3();
Bee_Speak(50);
}
while(Key_Find==0);
}
}
}
void Display_LCD12864_Face0()
{
if(Check_flag==0)
{
if(TL1==1){Display_HZ_Line(0,0,">>");}
if(TL1==2){Display_HZ_Line(0,0,">>> ");}
if(TL1==3){Display_HZ_Line(0,0,">>>>");}
if(TL1==4){Display_HZ_Line(0,0,">>>>> ");}
}
Display_HZ_Line(1,1,"嚐試檢測脈搏");
Display_HZ_Line(2,2,"請您放好");
time_display();
delay_ms(80);
Check_flag=0;
Display_Auto_Mode();
}
void Display_LCD12864_Face1()
{
unsigned char i;
unsigned char Num[3]; //顯示緩存
unsigned char Temp;
Display_HZ_Line(0,0,"測量中....");
delay_ms(80);
if(jayt==0){Display_HZ_Line(2,0,"10%>> ");}
if(jayt==1){Display_HZ_Line(2,0,"29%>>>");}
if(jayt==2){Display_HZ_Line(2,0,"42%>>>>>");}
if(jayt==3){Display_HZ_Line(2,0,"57%>>>>>>>");}
if(jayt==4){Display_HZ_Line(2,0,"77%>>>>>>>>>");}
if(jayt==5){Display_HZ_Line(2,0,"95%>>>>>>>>>>>");}
delay_ms(20);
H=TH1; //讀取計數值高位
L=TL1; //讀取計數值低位
Temp=H*256+L; //合成總數 16位
Num[0]= Temp/100;
Num[1]= Temp0/10;
Num[2]= Temp;
LcdWcom(0x90+0x05); //顯示計數值
for(i=0;i
{
LcdWdata(Num+'0');
}
delay_ms(20);
time_display();
delay_ms(20);
}
void Display_LCD12864_Face2()
{
unsigned char i;
jayt=0; //清除進度條殘影
if(flang1==1) //清除第二行留下的殘影
{
LcdWcom(0x01);
delay_ms(50);
flang1=0;
}
if(Save_falg==1) //寫入24C0X標誌位為1,數據寫入24C0X
{
for(i=5;i>1;i--)
{
write_AT24C02_ADD(20+i,read_AT24C02_ADD(20+i-1)); //存儲數據
delay_ms(50); //AT24C02_init();
write_AT24C02_ADD(70+i,read_AT24C02_ADD(70+i-1)); //存儲時間
delay_ms(50); //AT24C02_init();
write_AT24C02_ADD(80+i,read_AT24C02_ADD(80+i-1)); //
delay_ms(50);//AT24C02_init();
write_AT24C02_ADD(90+i,read_AT24C02_ADD(90+i-1)); //
delay_ms(50); // AT24C02_init();
write_AT24C02_ADD(50,i); //存入地址變量,防止亂寫
delay_ms(50); // AT24C02_init();
Save_falg=0; //寫入標誌位清0
}
write_AT24C02_ADD(20+1,DATA); //存儲數據
delay_ms(50);// AT24C02_init();
write_AT24C02_ADD(70+1,shi); //存儲時間
delay_ms(50); //AT24C02_init();
write_AT24C02_ADD(80+1,fen); //
delay_ms(50);//AT24C02_init();
write_AT24C02_ADD(90+1,miao); //
delay_ms(50); // AT24C02_init();
write_AT24C02_ADD(50,1); //存入地址變量,防止亂寫
delay_ms(50); // AT24C02_init();
Save_falg=0;
}
if(alarm==1){Display_HZ(1,2,"異");Display_HZ(1,3,"常");Display_HZ(1,4,"!");} //上下限報警
else {Display_HZ(1,2,"無");Display_HZ(1,3,"異");Display_HZ(1,4,"常");}
delay_ms(70);
Display_HZ_Line(0,0,"您的量測結果是: ");
delay_ms(70);
LcdWcom(0x88+0x02); //顯示最終結果
for(i=0;i
{
LcdWdata(Num+'0');
delay_ms(10);
}
Display_HZ_Line(2,4,"次/ 分鍾");
delay_ms(70);
time_display(); //顯示時間
}
void Display_LCD12864_Face3()
{
unsigned char Read_add; //查詢模式下,24C0X讀操作指向地址
LcdWcom(0x01); //清屏
delay_ms(20);
Read_add++;
if(Read_add==6)Read_add=1;
DATA1=read_AT24C02_ADD(20+Read_add); //取出數據
delay_ms(50);
time[0]=read_AT24C02_ADD(70+Read_add); //取出時間
delay_ms(50);
time[1]=read_AT24C02_ADD(80+Read_add);
delay_ms(50);
time[2]=read_AT24C02_ADD(90+Read_add);
delay_ms(50);
Display_HZ(0,1,"第");
delay_ms(5);
LcdWcom(0x80+0x02);
LcdWdata(Read_add+'0');
delay_ms(1);
Display_HZ(0,3,"次");
delay_ms(1);
Display_HZ(0,4,"量");
delay_ms(1);
Display_HZ(0,5,"測");
delay_ms(1);
Display_HZ(0,6,"結");
delay_ms(1);
Display_HZ(0,7,"果");
LcdWcom(0x89);
LcdWdata(DATA1/100+'0');
LcdWdata(DATA10/10+'0');
LcdWdata(DATA1+'0');
Display_HZ(2,3,"次");
LcdWcom(0x88+0x04);
LcdWdata('/');
Display_HZ(2,5,"分");
Display_HZ(2,6,"鍾");
delay_ms(1);
LcdWcom(0x98); //顯示讀取出來的時間
LcdWdata(time[0]/10+'0');
LcdWdata(time[0]+'0');
LcdWdata(':');
LcdWdata(time[1]/10+'0');
LcdWdata(time[1]+'0');
LcdWdata(':');
LcdWdata(time[2]/10+'0');
LcdWdata(time[2]+'0');
}
void Display_Auto_Mode()
{
if(Check_flag==0) //自動啟動模式
{
if(TL1>2) //判斷
{
if(TL1>4) //再次判斷
{
delay_ms(50);
if(TL1>5) //再再次判斷
{
TR1=0;
TH1=0X00; //
TL1=0X00; //計數器清零
TR0=1; //
TR1=1; //
Bee_Speak(200);
Check_flag=1;
Face=1;
LcdWcom(0x01);
}
}
}
}
}
void main()
{
unsigned char i;
Timer0NCounterT1_Init();
AT24C02_init();
reset_1302();
Display_Init();
sheshi();
Write_add=read_AT24C02_ADD(50);
// Display_Welcom1();
GUI_Fill_GDRAM(0x00);
Bee_Speak(70);
while(1)
{
Cotrl_Key();
if(Face==0){Display_LCD12864_Face0();}
if(Face==1){Display_LCD12864_Face1();}
if(Face==2)
{
Display_LCD12864_Face2();
i++;
if(i==10)
{
Sleep_mode=1;
TR1=1;
Face=4;
chuzhi=1;
}
}
if(Face==4){time_display();}
}
}
void Timer0(void) interrupt 1
{
uchar i,j,Temp;
uchar Temp_Data[3];
uchar H1,L1;
TH0=0xd8;
TL0=0xf0;
k++;
if(k==500||k==1000)jayt++; //進度條取樣
if(Sleep_mode==0) //正常測量模式
{
if(k==1000) //1000=10s定時
{
k=0;
j++;
H1=TH1; //讀取計數值高位
L1=TL1; //讀取計數值低位
Temp_Data=H1*256+L1; //采樣3次,取出數據
if(j==3) //j=3,為采集3次,每次采集10s,共30s
{
// TR1=0; //關閉計數
// TR0=0; //關閉定時
j=0;
DATA=(Temp_Data[0]+Temp_Data[1]+Temp_Data[2])/3; //求平均值
DATA=DATA*6; //*6推算得到60S時的值
if((DATA>120)||(DATA
else alarm=0;
Num[0]= DATA/100;
Num[1]= DATA0/10;
Num[2]= DATA;
Bee_Speak(50);
Face=2; //進入界麵二
Save_falg=1; //數據寫入24C0X允許標誌位,為1時允許寫入,寫完後清0
flang1=1; //某標誌位,用於清屏
}
}
}
else if(Sleep_mode==1) //正常測量模式
{
if(k==500)
{
k=0;
TR1=1;
TR0=1;
L1=TL1;
Temp=L1;
if((chuzhi==1)&&(Temp==0)) //判斷手指是否拿出
{
chuzhi=0;
LED=0;
}
if((chuzhi==0)&&(Temp>2)) //判斷手指是否放入
{
LED=0;
Rst_Watchdog();
}
TL1=0; TH1=0;
}
}
}

    看過《單片機光電脈搏檢測儀源程序》的人還看了以下文章
    初學單片機從51入門的好處 初學單片機從51入門的好處
    51單片機是一款已經出現很久的單片機,它的出現可以說是劃時代的。同時期出現的其它單片機都已經逐漸退出曆史的舞台,而它卻依舊出現在某些專業的教材上。從這點來看,它依舊有其學習的意義。下麵說說初學單片機從51入門的好處。 51單片機的學習資源非常多...
    如何使用C語言控製硬件 如何使用C語言控製硬件
    C語言的應用編程在單片機的領域占了很大一部分,使用的比較多的51單片機和STM32單片機都可以使用MDK軟件編寫固件。 單片機燒寫了固件後可以點亮LED燈,可以驅動ADC檢測電壓,也可以驅動蜂鳴器發聲,這就是簡單地控製硬件。稍微複雜一點的,可以驅動NRF2401進...
    c語言怎麼讀取一個變量的二進製文件內容 c語言怎麼讀取一個變量的二進製文件內容
    C語言是一種高級語言,很多設置都為了符合我們程序員的理解做了相應的調整。機器對於變量的理解是基於電路,也就是所謂的高低電平。也是因為這個出現了一個二進製。 而人類的計數更喜歡使用十進製,有專家說是因為是人類當初計數使用的手指,這樣十進製比較...
    單片機為啥叫單片機 單片機為啥叫單片機
    1、MCU 我一般在工作計劃和原理圖的說明上,就直接將STM32或者STC89的單片機,標注為MCU。 無論是理解為Micro CPU,還是Microcontroller Unit,我認為都行,也沒有仔細去區分去過。自從32位單片機出來後,一些單片機設計的係統確實是具備部分電腦的功能。 你...
    16位單片機低端打不過8位高端打不過32位怎麼看 16位單片機低端打不過8位高端打不過32位怎
    有時間去了解一下TI的MPS係列的單片機,它的低功耗和8位的51還有32位的STM32還是有一定的區別度的。 就比如MSP430係列,一些醫療的應用也少不了它,其各種低功耗的應用和例子一抓一大把。 也許從價格上來說,感覺,8位的便宜好買;從性能上來說,感覺,32位的...
    Baidu
    map