本设计由STC89C52单片机电路+心率检测电路+ISD1820语音模块电路+蓝牙模块电路+电源电路组成。
1、通过心率传感器实时检测心率。
2、通过蓝牙模块将心率信息和心率的上限和下限值实时上传到手机APP,通过手机APP可以设置心率的上限和下限。
3、当心率在上下限之间时,2路语音模块不启动。心率低于下限,语音模块1启动,语音模块2不启动。心率高于上限,语音模块1不启动,语音模块2启动。
4、语音模块播放的信息可以自行录制。
蓝牙设置命令:
*060-120# //设置范围为60到120
完整版 电路图和程序代码 下载地址
https://pan.baidu.com/s/1azMIh7HxNPD37o9zCS4HUA?pwd=8888
部分代码展示
void Init_Timer0(void); //函数声明
void init_int0(void);
void uartSendStr(unsigned char *s,unsigned char length);
void UART_Init(void);
void uartSendByte(unsigned char dat);
void TIM2Inital(void);
/****************主函数***************/
void main()
{
EX0=1; //允许外部中断0中断
EA=1; //开总中断
IT0 = 1; //外部中断0负跳变中断
Init_Timer0(); //初始化定时器
TIM2Inital();
UART_Init();
DelayMs(50);
uartSendStr("ready ok !",10);
while(1)
{
if(displayOK==0)//如果显示关 检测心率是否真实
{
rate = 0;
}
}
}
/*************定时器0初始化程序***************/
void Init_Timer0(void)
{
TMOD |= 0x01; //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响
// TH0=(65536-20000)/256; //重新赋值 20ms
// TL0=(65536-20000)%256;
EA=1; //总中断打开
ET0=1; //定时器中断打开
TR0=1; //定时器开关打开
}
void int0() interrupt 0
{
EX0=0;//暂时关外部中断
if(timecount<8) //当连续两次检测时间间隔小于8*50ms=400ms不处理
{
TR0=1;//开定时器
}
else
{
time[i_i]=timecount*50+TH0*0.256+TL0/1000;//算出间隔时间
TH0 = 0x3c;
TL0 = 0xb0; // 50ms 12M
timecount=0;//50ms计数清零
i_i++;
if(i_i==6)//记录到超过等于6次时间
{
i_i=1;//计数从1开始
displayOK=1; //测得5次开始显示?
}
}
EX0=1;
}
/*************定时器0中断服务程序***************/
void time0_int() interrupt 1
{
TH0 = 0x3c;
TL0 = 0xb0; // 50ms 12M
timecount++;//每50ms一次计数
if(timecount>65) //当超过25*50ms=1.5s没有检测到信号停止显示
{
i_i=0;//数据个数清零
timecount=0;//50ms计数清零
displayOK=0;//显示关
TR0=0;//定时器关
TH0 = 0x3c;
TL0 = 0xb0; // 50ms 12M
}
}
void TIM2Inital(void)
{
RCAP2H = (65536-60000)/256;//晶振12M 60ms 16bit 自动重载
RCAP2L = (65536-60000)%256;
ET2=1; //打开定时器中断
EA=1; //打开总中断
TR2=1; //打开定时器开关
}
void TIM2(void) interrupt 5 using 1//定时器2中断
{
TF2=0;
time_50ms++;
if(time_50ms%20==0) //定时100ms到
{
update_flag=1; //更新标志置位
}
if(uartbusy>0) //串口数据采集处理
{uartbusy--;}
else
{
firstin =0;
Count=0;
}
}
完整版 电路图和程序代码 下载地址