51單片機做的心率計設計, 能即時測量脈搏, 並通過led燈閃爍代表脈搏跳動, 有報警功能
模擬及電路圖模擬
電路圖
#include
#include
#define uint unsigned int
#define uchar unsigned char
#define ulong unsigned long //巨集定義
#define LCD_DATA P0 //定義P0口為LCD_DATA
sbit LCD_RS =P2^5;
sbit LCD_RW =P2^6;
sbit LCD_E =P2^7; //定義LCD控制引腳
sbit Xintiao =P1^0 ; //脈搏檢測輸入端定義
sbit speaker =P2^4; //蜂鳴器引腳定義
void delay5ms(void); //誤差 0us
void LCD_WriteData(uchar LCD_1602_DATA); /********LCD1602資料寫入***********/
void LCD_WriteCom(uchar LCD_1602_COM); /********LCD1602命令寫入***********/
void lcd_1602_word(uchar Adress_Com,uchar Num_Adat,uchar *Adress_Data); /*1602字元顯示函數, 變數依次為字元顯示首位址, 顯示字元長度, 所顯示的字元*/
void InitLcd();//液晶初始化函數
void Tim_Init();
uchar Xintiao_Change=0; //
uint Xintiao_Jishu;
uchar stop;
uchar View_Data[3];
uchar View_L[3];
uchar View_H[3];
uchar Xintiao_H=100; //脈搏上限
uchar Xintiao_L=40; //脈搏下限
uchar Key_Change;
uchar Key_Value; //按鍵鍵值
uchar View_Con; //設置的位(0正常工作,
uchar View_Change;
void main() //主函數
{
InitLcd();
Tim_Init();
lcd_1602_word(0x80,16,"Heart Rate: "); //初始化顯示
TR0=1;
TR1=1; //打開計時器
while(1) //進入迴圈
{
if(Key_Change) //有按鍵按下並已經得出鍵值
{
Key_Change=0; //將按鍵使能變數清零, 等待下次按鍵按下
View_Change=1;
switch(Key_Value) //判斷鍵值
{
case 1: //設置鍵按下
{
View_Con++; //設置的位加
if(View_Con==3) //都設置好後將此變數清零
View_Con=0;
break; //跳出, 下同
}
case 2: //加鍵按下
{
if(View_Con==2) //判斷是設置上限
{
if(Xintiao_H<150) //上限數值小於150
Xintiao_H++; //上限+
}
if(View_Con==1) //如果是設置下限
{
if(Xintiao_L Xintiao_L++; //下限值加 } break; } case 3: //減鍵按下 { if(View_Con==2) //設置上限 { if(Xintiao_H>Xintiao_L+1)//上限資料大於下限+1(同樣上限值不能小於下限) Xintiao_H--; //上限數據減 } if(View_Con==1) //設置下限 { if(Xintiao_L>30) //下限資料大於30時 Xintiao_L--; //下限數據減 } break; } } } if(View_Change)//開始顯示變數 { View_Change=0;//變數清零 if(stop==0) //心率正常時 { if(View_Data[0]==0x30) //最高位元為0時不顯示 View_Data[0]=' '; } else //心率不正常(計數超過5000,
也就是兩次信號時間超過5s)不顯示資料 { View_Data[0]=' '; View_Data[1]=' '; View_Data[2]=' '; } switch(View_Con) { case 0: //正常顯示 { lcd_1602_word(0x80,16,"Heart Rate: ");//顯示一行資料 lcd_1602_word(0xc0,16," ");//顯示第二行資料 lcd_1602_word(0xcd,3,View_Data); //第二行顯示心率 break; } case 1: //設置下限時顯示 { lcd_1602_word(0x80,16,"Heart Rate: ");//第一行顯示心率 lcd_1602_word(0x8d,3,View_Data); View_L[0]=Xintiao_L/100+0x30; //將下限數據拆字 View_L[1]=Xintiao_L%100/10+0x30; View_L[2]=Xintiao_L%10+0x30; if(View_L[0]==0x30) //最高位為0時,
不顯示 View_L[0]=' '; lcd_1602_word(0xC0,16,"Warning L : ");//第二行顯示下限資料 lcd_1602_word(0xCd,3,View_L); break; } case 2: //設置上限時顯示(同上) { lcd_1602_word(0x80,16,"Heart Rate: "); lcd_1602_word(0x8d,3,View_Data); View_H[0]=Xintiao_H/100+0x30; View_H[1]=Xintiao_H%100/10+0x30; View_H[2]=Xintiao_H%10+0x30; if(View_H[0]==0x30) View_H[0]=' '; lcd_1602_word(0xC0,16,"Warning H : "); lcd_1602_word(0xCd,3,View_H); break; } } } } } .................................................................................................... 限於本文篇幅,
餘下代碼及高清圖請前往“51黑電子論壇“下載附件,
直達------------------------------------------------------------ //www.51hei.com/bbs/forum.php?mod=viewthread&tid=42461&extra=page%3D1%26filter%3Dlastpost%26orderby%3Dlastpost--------