設(shè)計(jì)功能:
1.ST188光電傳感器檢測脈搏信號(hào),并有脈搏信號(hào)指示燈;
2.具有溫度檢測功能,可檢測人體溫度,溫度傳感器為DS18B20;
3.脈搏和溫度檢測完成后,LCD1602會(huì)顯示當(dāng)前溫度和脈搏數(shù)值;
4.增加語音播報(bào)功能,顯示完成后可語音播報(bào)脈搏和溫度數(shù)值;
5.按鍵可設(shè)置脈搏檢測的安全范圍;
6.超出所設(shè)安全范圍時(shí),蜂鳴器報(bào)警;
部分程序:
#include //調(diào)用單片機(jī)頭文件
#define uchar unsigned char //無符號(hào)字符型 宏定義 變量范圍0~255
#define uint unsigned int //無符號(hào)整型 宏定義 變量范圍0~65535
#include
bit flag_300ms ;
bit q;
uchar menu_1=0; //菜單設(shè)計(jì)的變量
sbit beep = P3^7; //蜂鳴器IO口定義
uchar flag_200ms ;
/***********************語音模塊控制IO口的定義************************/
sbit VRST = P2^4;
sbit VBUSY= P2^0;
sbit VSDA = P2^1;
sbit VCS = P2^2;
sbit VSCL = P2^3;
uchar yujing[3];
uchar code table_num[]="0123456789abcdefg";
sbit rs=P1^0; //寄存器選擇信號(hào) H:數(shù)據(jù)寄存器 L:指令寄存器
sbit rw=P1^1; //寄存器選擇信號(hào) H:數(shù)據(jù)寄存器 L:指令寄存器
sbit e =P1^2; //片選信號(hào) 下降沿觸發(fā)
unsigned char i=0,timecount=0,displayOK=0,rate=0,aa=0;
unsigned int time[6]={0};
uchar rate_l=50,rate_h=120; //心跳報(bào)警值
sbit dq = P3^3; //18b20 IO口的定義
uint temperature ; //
/***********************1ms延時(shí)函數(shù)*****************************/
void delay_1ms(uint q)
{
uint i,j;
for(i=0;i
for(j=0;j<110;j++);
}
void delay_uint(uint q)
{
while(q--);
}
void write_com(uchar com)
{
delay_uint(25);
e=0;
rs=0;
rw=0;
delay_uint(25);
e=1;
P0=com;
delay_uint(100);
e=0;
}
void write_data(uchar dat)
{
delay_uint(25);
e=0;
rs=1;
rw=0;
delay_uint(25);
e=1;
P0=dat;
delay_uint(100);
e=0;
rs=0;
}
void write_string(uchar hang,uchar add,uchar *p)
{
if(hang==1)
write_com(0x80+add);
else
write_com(0x80+0x40+add);
while(1)
{
if(*p == '?') break;
write_data(*p);
p++;
}
}
/*****************控制光標(biāo)函數(shù)********************/
void write_guangbiao(uchar hang,uchar add,uchar date)
{
if(hang == 1)
write_com(0x80+add);
else
write_com(0x80+0x40+add);
if(date == 1)
{
write_com(0x0f); //顯示光標(biāo)并且閃爍
}
else
write_com(0x0c); //關(guān)閉光標(biāo)
}
/***********************lcd1602上顯示兩位十進(jìn)制數(shù)************************/
void write_sfm3(uchar hang,uchar add,uint date)
{
if(hang==1)
write_com(0x80+add);
else
write_com(0x80+0x40+add);
write_data(0x30+date/100%10);
write_data(0x30+date/10%10);
write_data(0x30+date%10);
}
void write_sfm4(uchar hang,uchar add,uint date)
{
if(hang==1)
write_com(0x80+add);
else
write_com(0x80+0x40+add);
write_data(0x30+date/100);
write_data(0x30+date%100/10);
write_data('.');
//write_data(0x30+(date%100)/10);
write_data(0x30+(date%100)%10);
}
/***********************lcd1602初始化設(shè)置************************/
void init_1602()
{
write_com(0x38);
write_com(0x0c);
write_com(0x06);
delay_uint(1000);
write_string(1,0," 000/min 00. ");
write_string(2,0," H:000 L:000 ");
write_sfm3(2,4,rate_h);
write_sfm3(2,11,rate_l);
}
/***********************18b20初始化函數(shù)*****************************/
void init_18b20()
{
//bit q;
dq = 1; //把總線拿高
delay_uint(2); //15us
dq = 0; //給復(fù)位脈沖
delay_uint(80); //750us
dq = 1; //把總線拿高 等待
delay_uint(10); //110us
q = dq; //讀取18b20初始化信號(hào)
delay_uint(40); //200us
dq = 1; //把總線拿高 釋放總線
}
/*************寫18b20內(nèi)的數(shù)據(jù)***************/
void write_18b20(uchar dat)
{
uchar i;
for(i=0;i<8;i++)
{ //寫數(shù)據(jù)是低位開始
dq = 0; //把總線拿低寫時(shí)間隙開始
dq = dat & 0x01; //向18b20總線寫數(shù)據(jù)了
delay_uint(5); // 60us
dq = 1; //釋放總線
dat >>= 1;
}
}
/*************讀取18b20內(nèi)的數(shù)據(jù)***************/
uchar read_18b20()
{
uchar i,value=0;
for(i=0;i<8;i++)
{
dq = 0; //把總線拿低讀時(shí)間隙開始
value >>= 1; //讀數(shù)據(jù)是低位開始
delay_uint(1);
dq = 1; //釋放總線
if(dq == 1) //開始讀寫數(shù)據(jù)
value |= 0x80;
delay_uint(5); //60us 讀一個(gè)時(shí)間隙最少要保持60us的時(shí)間
}
return value; //返回?cái)?shù)據(jù)
}
/*************讀取溫度的值 讀出來的是小數(shù)***************/
uint read_temp( )
{
float tt=0;
uint value;
-
傳感器
+關(guān)注
關(guān)注
2550文章
51035瀏覽量
753081 -
51單片機(jī)
+關(guān)注
關(guān)注
274文章
5702瀏覽量
123493 -
檢測儀
+關(guān)注
關(guān)注
5文章
4094瀏覽量
42253
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論