怎样设计一种基于单片机的可语音播报的脉搏检测仪?

控制/MCU

1878人已加入

描述

设计功能:

1.ST188光电传感器检测脉搏信号,并有脉搏信号指示灯;

2.具有温度检测功能,可检测人体温度,温度传感器为DS18B20;

3.脉搏和温度检测完成后,LCD1602会显示当前温度和脉搏数值;

4.增加语音播报功能,显示完成后可语音播报脉搏和温度数值;

5.按键可设置脉搏检测的安全范围;

6.超出所设安全范围时,蜂鸣器报警;

LCD1602

部分程序:

#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;

LCD1602

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分