設計功能:
2.具有溫度檢測功能,可檢測人體溫度,溫度傳感器為DS18B20;
3.脈搏和溫度檢測完成后,LCD1602會顯示當前溫度和脈搏數值;
4.增加語音播報功能,顯示完成后可語音播報脈搏和溫度數值;
5.按鍵可設置脈搏檢測的安全范圍;
6.超出所設安全范圍時,蜂鳴器報警;
部分程序:
#include //調用單片機頭文件
#define uchar unsigned char //無符號字符型 宏定義 變量范圍0~255
#define uint unsigned int //無符號整型 宏定義 變量范圍0~65535
#include
bit flag_300ms ;
bit q;
uchar menu_1=0; //菜單設計的變量
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:數據寄存器 L:指令寄存器
sbit rw=P1^1; //寄存器選擇信號 H:數據寄存器 L:指令寄存器
sbit e =P1^2; //片選信號 下降沿觸發
unsigned char i=0,timecount=0,displayOK=0,rate=0,aa=0;
unsigned int time[6]={0};
uchar rate_l=50,rate_h=120; //心跳報警值
sbit dq = P3^3; //18b20 IO口的定義
uint temperature ; //
/ 1ms延時函數 ******/
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++;
}
}
/ 控制光標函數 ***/
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); //顯示光標并且閃爍
}
else
write_com(0x0c); //關閉光標
}
/ lcd1602上顯示兩位十進制數 */
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初始化設置 */
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初始化函數 ******/
void init_18b20()
{
//bit q;
dq = 1; //把總線拿高
delay_uint(2); //15us
dq = 0; //給復位脈沖
delay_uint(80); //750us
dq = 1; //把總線拿高 等待
delay_uint(10); //110us
q = dq; //讀取18b20初始化信號
delay_uint(40); //200us
dq = 1; //把總線拿高 釋放總線
}
/ 寫18b20內的數據 **/
void write_18b20(uchar dat)
{
uchar i;
for(i=0;i<8;i++)
{ //寫數據是低位開始
dq = 0; //把總線拿低寫時間隙開始
dq = dat & 0x01; //向18b20總線寫數據了
delay_uint(5); // 60us
dq = 1; //釋放總線
dat >>= 1;
}
}
/ 讀取18b20內的數據 **/
uchar read_18b20()
{
uchar i,value=0;
for(i=0;i<8;i++)
{
dq = 0; //把總線拿低讀時間隙開始
value >>= 1; //讀數據是低位開始
delay_uint(1);
dq = 1; //釋放總線
if(dq == 1) //開始讀寫數據
value |= 0x80;
delay_uint(5); //60us 讀一個時間隙最少要保持60us的時間
}
return value; //返回數據
}
/ 讀取溫度的值 讀出來的是小數 **/
uint read_temp( )
{
float tt=0;
uint value;
評論