目录
一、方案流程及技术规格书设计
二、系统硬件电路设计
三、软件编写及调试
四、系统调试测试与分析
前言
人体脉搏信号中包含丰富的生理信息,脉诊在我国已具有2600多年临床实践,是我国传统中医的精髓,但祖国传统医学采用“望、闻、问、切”的手段进行病情诊断,受人为的影响因素较大,测量精度不高。随着科技发展的不断提高,生命科学和信息科学的结合越来越紧密,出现了各种新颖的脉搏测量仪器,使脉搏测量变得非常方便和精确。
随着我国社会老龄化的到来,城市中大量独居老人的健康监护问题越来越突出。心血管疾病作为老年人疾病中比例较高的病症,许多病情较轻的病人由于未及时进行检查,错过了宝贵的诊治机会,导致病情加重,严重者可能引起中风甚至危及生命。通过分析官方报道出的数据,心血管疾病每年导致全世界1500万人死亡,成为导致死亡的主要原因。即使当前国内医疗设备已较为先进完善的前提下,心血管发病率仍然逐年提高,并且事实上,该病的发病人群也呈现年轻化的趋势。
脉搏远程监测报警系统的实现,可以避免患者的时间和金钱上的浪费,提高治疗效率;另一方面可以让患者在日常中更熟悉自身身体状况,即促进医务人员与患者之间的交流合作,提高病院服务水准的同时也降低了医患矛盾产生的概率。
软件工具准备
软件:
电路设计:protel99 se(up主使用版本) 或者其他版本,或者其他电路设计软件;
单片机开发:Keil5;
调试测试:串口调试助手,逻辑分析仪等;
工具:
电路焊接:电烙铁,SMT(有条件的);
调试:
万用表、示波器(基础入门即可,可以白嫖学校或者公司)USB转串口工具、仿真器;
一、方案流程及技术规格书设计
1.1 方案流程设计
1.2 技术规格书设计
1. 脉搏信号由光电脉搏传感器模块进行采集;采集后的信号经过放大(滤除50HZ信号的干扰),进行整形后,得到幅值在0~5v的脉冲信号。
2.脉冲信号输入单片机,单片机处理相关数据并在LCD液晶显示。
3.有报警信息,报警信息通过GSM模块发送给指定手机。
4、按键可以设置报警值。
二、原理图和PCBA版图设计及解析
2.1微处理控制电路
单片机是系统的核心,单片机电路一般有复位电路、晶振时钟电路等,本设计采用宏晶公司IAP15F2K61S2单片机芯片,其内部有上电复位电路和内部时钟电路,所以设计省去外部复位电路和外部晶振。设计采用LQFP32封装,电路图如图3.1所示:
图3.1 微控制器电路
2.2脉搏传感器电路
脉搏传感器以一体化模块方式,其模块自身有信号采集、放大和处理电路,所以和单片机接口比较简单。设计采用一个3脚插座形式连接传感器。1脚是脉搏模拟信号输出脚,连接单片机AD转换口,2脚是传感器供电脚,连接VCC5V电压,3脚接地。手指未接触传感器时,输出固定电压2.5V,当手指接触传感器时,由于脉搏跳动,手指血液浓度不同,光电传感器输出高低感应信号,经放大处理后,在传感器模块1脚输出类似三角波的波形。模块输出模拟信号,电路如图3-2:
图3.2 脉搏传感器电路
2.3 LCD显示电路
液晶显示是LCD1602A模块,LCD1602A模块自身有LCD驱动集成电路(HD44780液晶芯片)电源电路等,与LCD模块接口是16脚插座,电路如图3.3:
图3.3 LCD1602A显示电路图
R2电位器10K起分压作用,电位器采用3296多圈电位器,调节精度高,接口2脚是提供液晶显示偏压,电压大小调节显示对比度。C15是液晶供电滤波电容,接VCC和GND之间。15、16脚是背光源供电,15脚接正,R21是背光限流电阻,其大小可以调节背光亮度。其他是和单片机连接的数据和控制脚,RS脚是选择命令还是数据。RW是读写选择。E是片选信号。D0-D7是数据线。
2.4按键电路
非自锁机械按键按下时2个脚导通,松开按键,2个脚断开。本设计4个按键,没有按下按键时,由于上拉电阻作用,对应IO口是高电平,按键按下,按键导通,对应IO口接地,是低电平。单片机检测各个按键IO口电平,判断按键状态。按键功能是设置脉搏报警高限和低限。电路如图3.4:
图3.4按键电路图
2.5 LED指示报警电路
LED指示报警电路连接单片机P32,正常工作时,P32输出高电平,点亮LED。当报警时,P32输出1HZ方波,使单片机闪烁显示。电路如图3.5。
图3.5 LED灯电路图
2.6蜂鸣器驱动电路
蜂鸣器连接单片机P33口,单片机IO口驱动能力有限,所以加三极管驱动电路,R3是限流电阻。采用无源蜂鸣器,蜂鸣器不响时,P33口输出低电平,Q1不导通,没有电流流过蜂鸣器,P33口输出4KHz方波时,Q1在P33高电平时导通,低电平时不导通。蜂鸣器流过电流也是4KHz,所以蜂鸣器响。R10可以调节流过蜂鸣器电流大小,即调节蜂鸣器声音大小。电路如图3.6。
图3.6 蜂鸣器驱动电路图
2.7 GSM电路
设计采用GA6-B通信模块,模块已经集成了射频天线、SIM卡,GSM模块和单片机接口只是串口。由于GSM模块的IO口是3.3V,不能直接和单片机5V的IO口连接,需要电平转换电路。TXD2、RXD2连接单片机串口,U_RXD、U_TXD连接模块串口。接口电路如图3.7:
图3.7 GSM通讯模块和电平转换电路
2.8电源电路
系统采用外部9V电源适配器供电,单片机和液晶等需要5V稳定的电压供电,9V降压到5V采用常见的7805三端稳压集成电路。7805三端稳压电路的优点有:1、纹波抑制比高。2、内部有过热、短路保护。安全可靠。3、价格便宜。4、所需的外围元件极少,外部元件只需输入滤波电容和输出滤波电容。
三端稳压集成电路7805只有3个脚,1脚输入、2脚接地、3脚输出。直流经过7805稳压输出5V,C3输入滤波电容、C6输出滤波电容。电路如图3.8。
图3.8 7805稳压电路
GSM模块接口电平是3.3V,所以需要3.3V电源。设计采用AMS1117稳压电路,电路如图3.9。
图3.9 AMS1117稳压电路
三、软件编写及调试
3.1 主程序设计
脉搏测试和报警系统完成的功能有:1、脉搏传感器输入模拟信号进行AD转换,得到数字化的脉搏数据,对转换得到的数据进行分析和计算,得到脉搏值。2、脉搏值和设置的上下限比较,超过正常值就声光报警。3、液晶显示脉搏值和报警信息。4、报警时,GSM模块发送短信到指定的手机。5、按键设置报警上下限。
软件设计就是编写计算机程序,常用的单片机编程语言有汇编语言和C语言,汇编语言是底层机器语言,适合于编写简单功能程序。目前已经很少使用汇编语言设计应用程序。本设计使用C语言,C语言是高级语言一种,它不但有高级语言的设计容易,易读懂,可移植性还有它能对底层寄存器操作,兼顾了汇编语言的功能,所以非常适合单片机编程。
系统上电后,首先关闭总中断,然后对芯片内部AD初始化,定时器初始化,LCD显示初始化,通信模块初始化,完成初始化后,打开总中断。后面循环执行LCD显示程序,AD转换程序,计算程序,按键扫描和处理程序,蜂鸣器报警程序,LED报警程序,GSM模块发送程序。图4-1主程序流程图。
图4.1 主程序
3.2 脉搏AD转换程序和计算程序设计
脉搏数就是一分钟心跳次数,脉搏一般是在60-120之间。也就是每分钟跳动60次到120次,脉搏传感器输出就是跳动周期的脉冲波,二个波峰之间的时间就是脉搏跳动时间,按1分钟60次计算,1秒钟一次,也就是每1秒会出现峰值,按20毫秒采样一次AD值,采样50个值进行比较,就可以得到脉搏峰值,计算2次峰值时间差,然后60000除以时间差,就计算出脉搏值。
STC15F2K61S2内部集成了AD转换器,所以直接使用内部AD转换器。图4-2是AD转换内部框图。
图4.2 AD转换内部框图
AD转换共有8个输入通道,模拟开关切换通道,配置ADC_CONTR寄存器的CHS2-CHS0选择通道,本设计采用通道3。STC15F2K61S2的ADC是逐次比较型ADC,逐次比较型ADC由比较器和DAC构成。置位ADC_START位启动AD转换,转换结束硬件置位ADC_FLAG,程序读取ADC_RES和ADC_RESL转换结果寄存器值。完成一次AD转换。ADC必须经过初始化才能使用。图4.3是ADC初始化流程图。
图4.3 AD转换初始化流程图
图4.4是AD转换和脉搏计算流程图。
图4.4 AD转换脉搏计算流程图
程序代码:
/***************************
*AD初始化
****************************/
void ADC_init(void)
{
ADC_CONTR = 0x00;
P1ASF |= (1<<3);
ADC_CONTR |= 0x80; //开启ADC电源
ADC_CONTR |= 0x40; //配置转换时间180时钟周期
ADC_CONTR |= 0x03; //选择ADC通道3
CLK_DIV = 0; //配置ADC结果寄存器ADC_RES + ADC_RESL(2BIT)
}
/***************************
*AD转换和脉搏计算
****************************/
void Task_Pulse(void)
{
u8 adcFlag;
u16 adcVal;
EA = 0;
adcVal = 0;
AdcCount = 0;
while(AdcCount < 5)
{
ADC_CONTR = 0xcb; //启动
adcFlag = ADC_CONTR;
adcFlag &= (1<<4);
while(adcFlag == 0)
{
adcFlag = ADC_CONTR;
adcFlag &= (1<<4);
}
ADC_CONTR = 0xc3; //关闭AD
adcVal = ADC_RES;
adcVal <<= 2;
adcVal += (ADC_RES&0x03);
//AdcRes[AdcCount++] = adcVal;
}
EA = 1;
SortSmallToBig(AdcRes, 5);
AdcResOk = CalAvg(AdcRes, 5);
Plus(adcVal);
}
3.3 液晶显示驱动及显示程序设计
LCD1602A液晶模块使用HD44780液晶芯片。HD44780内置了DDRAM、CGROM 和CGRAM。DDRAM就是显示数据RAM,用来寄存待显示的字符代码。共80个字节,其地址和屏幕的对应关系如下表:
显示位置 | 1 | 2 | 3 | 4 | 5 | 6 | … | 40 | |
DDRAM 地址 | 第一行 | 00H | 01H | 02H | 03H | 04H | 05H | … | 27H |
第二行 | 40H | 41H | 42H | 43H | 44H | 45H | … | 67H |
1602A液晶第一行16个字符,地址使用了00H-0FH,第二行16个字符,地址是40H-4FH。如果要在第二行第三列显示1,就在42H写入ASKII字符‘1’就可以。
那么,怎么去控制在第二行第三列显示1?,HD44780是提供了11条指令集。
下面举一条清屏指令为例:
指令功能 | RS | RW | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
清屏 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
RS控制线是区分命令和数据,RS低电平时,是控制命令,RS高电平时,是显示数据。清屏是控制命令,所以RS低。
RW是读写控制,RW低电平,是写入液晶模块,RW高电平时,是读液晶模块数据。清屏是写入液晶模块,所以RW低。
D7-D0是数据线数据,清屏是0x01。
常用的指令有控制显示模式指令0x06,显示开关0x04,功能设置0x38等。
与LCD控制器通信,首先要实现写命令和写数据功能,图4-5是写LCD命令和数据流程图。
图4.5 写命令(RS=0)和写数据(RS=1)流程图
程序代码:
/***写命令***/
void cmd_w(uchar cmd)
{
RW=0;
RS=0;
E=1;
P2=cmd;
delay(1);
E=0;
}
/***写数据***/
void dat_w(uchar dat)
{
RW=0;
RS=1;
E=1;
P2=dat;
delay(1);
E=0;
}
1602A液晶模块显示前需要初始化,初始化主要是设置LCD的工作状态。图4-6是LCD初始化流程。
图4.6 LCD1602初始化流程图
LCD1602A初始化和其他程序代码:
/***初始化**/
void Lcd1602_init(void)
{
cmd_w(0x38);
cmd_w(0x0c);
cmd_w(0x06);
cmd_w(0x01);
cmd_w(0x80);
}
/***光标定位****/
void gotoxy(uchar x,uchar y) //x是行数,y是列数
{
if(x==1)
{cmd_w(0x80+y);}
else
{cmd_w(0xc0+y);}
}
void dsp_ch(uchar _ch) //显示字符
{
dat_w(_ch);
}
3.4 串口通信和GSM发送程序设计
单片机用串口AT指令控制GSM模块,所以GSM发送程序主要是串口通信程序设计。STC15F2K61S2有2个串口,UART1和UART2。串口1用于程序下载和仿真,所以本设计用串口2和GSM模块通信。
串口2和GSM模块通信首先需要初始化串口,串口初始化主要是配置工作模式、设置波特率等。图4-7是串口初始化流程图。
图4.7 串口初始化流程图
串口初始化和通信代码:
#define BAUD 9600 //波特率
#define SYSTEMCLOCK 11059200L //系统时钟频率
static u8 *phone_num = "AT+CMGS=\"15815522222\""; //拨打电话,修改这里可以修改拨打的电话。
/************* 本地变量声明 **************/
u8 Rx_Buf[32];
u8 RxCount = 0;
u16 count_Delay;
void Uart2Init(void) //9600bps@11.05926MHz
{
S2CON = 0x10;
T2L = (65536 - (SYSTEMCLOCK/4/BAUD)); //
T2H = (65536 - (SYSTEMCLOCK/4/BAUD))>>8;
AUXR &= (1<<3);//timer
AUXR |= (1<<2);//fosc
AUXR |= (1<<4);//TR2
IE2 |= 1; //ES2 = 1
}
/********************* UART2中断函数************************/
void UART2_ISR (void) interrupt 8
{
if (S2CON&0x01)
{
RI = 0; //清除RI位
Rx_Buf[RxCount] = SBUF; //将接收到的字符串存到缓存中
RxCount++; //缓存指针向后移动
if(RxCount >= 32) //如果缓存满,将缓存指针指向缓存的首地址
{
RxCount = 0;
}
}
if (S2CON&0x02)
{
TI = 0; //清除TI位
}
}
/*----------------------------
UART1 发送串口数据
-----------------------------*/
void UART1_SendData(u8 dat)
{
ES=0; //关串口中断
SBUF=dat;
while(TI!=1); //等待发送成功
TI=0; //清除发送中断标志
ES=1; //开串口中断
}
/*----------------------------
UART1 发送字符串
-----------------------------*/
void UART1_SendString(char *s)
{
while(*s)//检测字符串结束符
{
UART1_SendData(*s++);//发送当前字符
}
}
/*********************************************************************
* 函数名 : Second_AT_Command
* 描述 : 发送AT指令函数
* 输入 : 发送数据的指针、希望收到的应答、发送等待时间(单位:interval_time*20 ms)
*********************************************************************/
u8 UART1_Send_AT_Command(u8 *b,u8 *a,u8 wait_time,u16 interval_time)
{
u8 i;
CLR_Buf();
i = 0;
while(i < wait_time)
{
UART1_Send_Command(b);
delay_ms(interval_time);
if(Find(a)) //查找需要应答的字符
{
return 1;
}
i++;
}
return 0;
}
3.5 蜂鸣器驱动及报警程序设计
报警时,蜂鸣器鸣响,单片机P33脚输出4kHz方波。不报警时,P33脚输出低电平。有2种方式可以输出4KHz方波,1、采用单片机PWM输出功能。2、采用定时器定时翻转IO口电平。其效果是一样的。本设计采用定时器定时翻转方式。图4-8是蜂鸣器报警功能流程图。
图4.8 蜂鸣器报警流程图
四、系统调试测试与分析
4.1电路仿真
电路仿真使用Proteus软件,Proteus是一款电路设计和仿真软件。因为Proteus库里面没有脉搏传感器和GSM通讯模块,所以用脉冲发生器代替,GSM通讯模块用串口代替。
脉搏在正常范围内的仿真如图5-1,显示脉搏:60,报警:无。
图5-1 脉搏正常时,仿真图
脉搏在低时的仿真如图5-3,显示脉搏:24,报警:Low。
图5-3 脉搏低时,仿真图
脉搏在高时的仿真如图5-5,显示脉搏:133,报警:High。
图5-5 脉搏高时,仿真图
脉搏高时的串口接收仿真如图5-6,接收脉搏:133,报警:High。
图5-6 脉搏高时,串口接收仿真图
4.2硬件电路焊接
先将单片机STC15F2K61S2、贴片电容、贴片电阻、贴片按键、贴片MOS管等元件焊接到线路板,在将直插电容、稳压集成电路、LED灯、插座、插针等直插元件焊接到线路板。实物如图所示。
4.3系统调试
连接电脑,用USB串口线连接程序下载口,将编译好的HEX文件下载到单片机。上电运行程序。显示如图。
手指贴住传感器,用固定带固定,注意不要太紧,进入脉搏测试。显示如图。