病床呼叫系统.docx
《病床呼叫系统.docx》由会员分享,可在线阅读,更多相关《病床呼叫系统.docx(39页珍藏版)》请在冰豆网上搜索。
病床呼叫系统
电子课程设计报告
姓名:
郭鹏程叶青胡乾
学号:
1204080319
班级:
电子信息1201
学院:
电气与电子工程学院
专业:
电子信息工程
教师:
肖忠
基于单片机的病床呼叫系统
摘要
病房呼叫系统是病人请求值班医生或护士进行诊断、护理的紧急呼叫工具,它主要用于协助医院病员在病床上方便地呼叫医务人员,可将病人的请求快速传送给值班医生或护士,是提高医院和病房护理水平的必备设备之一。
医院的竞争越来越激烈,商业医院的生存是第一位的,提升档次和服务质量迫在眉睫,陪护问题一直是医患矛盾的主体,也是长期困扰卫生系统服务质量的大问题,使用病房呼叫系统,方便病人更快找到医生,以节约病人的宝贵时间。
系统是基于51系列的单片机设计的病床呼叫系统。
该系统以AT89C52单片机为核心辅以独立键盘、LED显示电路和部分简单模拟和数字电路组成的能够实现病人和医护人员之间信息的传递。
每个病人要呼叫可以按键,同时会有蜂鸣器响,不同的数码管显示房间号。
这里主要是独立键盘输入信号,这是编程的关键。
在该设计中每个病房都有一个按键,当患者有需要时,按下按键,此时值
班室的显示屏可显示此患者的房间号,多人使用时可实现循环显示,根据按键按下时间长短判断情况缓急,医护人员按下“响应”键取消当前呼叫,按下清零键清除所有呼叫。
此系统能够为医院提供一个成本低、效率高、操作方便和易于安装维护的快捷系统。
关键词:
AT89C52,独立键盘,LED,病床呼叫
前言
伴随着医疗体制改革的不断深化和医疗事业的飞速发展,越来越多的人们需要迅捷、方便地得到医院的各种各样的医疗服务,这必将使医院之间的竞争日趋激烈。
这使得衡量一个医院的综合水平高低,不再仅仅局限于软、硬件的建设上,更要比服务。
原有的服务体系已不足以适应现代社会需求,谋求适合现代社会需求的客户服务系统,是所有企事业单位计划做或正在做的工作。
这些工作有利于改善服务量,提高效率并增加企业效益,从而赢得良好的社会声誉。
如何利用先进的信息技术为医院服务,更大程度的提高医院的服务质量及利润,是医院信息化建设中的一个重要着眼点。
医院的竞争越来越激烈,商业医院的生存是第一位的,提升档次和服务质量迫在眉睫,陪护问题一直是医患矛盾的主体,也是长期困扰卫生系统服务质量的大问题,使用病房呼叫系统,方便病人更快找到医生,以节约病人的宝贵时间。
病床呼叫系统是一种应用于医院病房、养老院等地方,用来联系沟通医护人员和病员的专用呼叫系统,是提高医院水平的必备设备之一。
病床呼叫系统的优劣直接影响到病员的安危,历来受到各大医院的普遍重视。
它要求及时、准确可靠、简便可行、利于推广。
目前市场上存在着许多种型号不一功能各异的医院病房呼叫系统,主要为两大类:
有线式和无线式。
无线式病房呼叫系统不存在铺设线路的问题,但是可靠性差,而且无线电波会干扰其他医疗仪器设备。
本文设计的是有线式的,适合较小的医院病房使用,具有成本低,易于操作、安装和维护,而且具有可靠稳定,对其他医疗设备不会产生干扰的特点;但受到布线较多,影响美观,故不适宜较大的医院。
病床呼叫管理系统便于病员快捷的呼叫护士,缩短人工呼叫的时间。
当今病房呼叫系统正在逐步地向智能化发展,它可以和录像机一起使用,当病人按下开关时,在护士值班室的大屏幕能够观察病人的需要。
并且可以配备对讲机等设备,能够使病员及时快捷地与医护人员进行沟通。
第一章系统整体设计
1.功能要求 :
1)呼叫功能:
能实现8个病房对护士站的呼叫,病人有情况时,按一下自己床边的呼叫按键就能呼叫护士;
2)显示功能:
有病房呼叫时,护士站的数码管显示器上会显示相应的床位号;无呼叫时显示器上无显示;
3)报警功能:
有病房呼叫时,护士站的喇叭会发出持续的报警声,同时,数码管显示器上显示床位号会;
4)紧急呼叫功能:
当呼叫按键被长按时,护士站的数码管和蜂鸣器会比短按时闪烁和报警的频率更高,以提示有紧急情况。
5)按错撤销功能:
当不小心按长按后可以短按取消紧急呼叫;同样,如果之前短按,再长按可以撤销短按而显示紧急呼叫。
6)呼叫智能排序功能:
紧急呼叫的优先级高于普通呼叫优先级,同等级的呼叫则按照时间顺序排序。
7)呼叫提示功能:
若有呼叫时,则亮红色指示灯。
当多余两人呼叫时,会闪烁黄色指示灯。
8)呼叫保持功能:
有呼叫键按下后,即使按键松开了,呼叫显示和报警声也能保持,直到护士响应呼叫;
9)清除功能:
护士响应呼叫后,按下清除键即可清除排在最先得病房号,按复位键可以清除所有呼叫报警声及显示。
2.系统模块方案的选择与论证
1)系统单片机的选择与论证
方案一:
采用单片机AT89S52,AT89S52是一种低功耗、高性能CMOS8位微控制器,具有8K 在系统可编程Flash 存储器。
使用Atmel 公司高密度非易失性存储器技术制造,与工业80C51 产品指令和引脚完全兼容。
片上Flash允许程序存储器在系统可编程,亦适于常规编程器。
方案二:
采用单片机PIC16F877(A),PIC16F877(A)也是八位的单片机同时具有低工作电压、低功耗、驱动能力强等特点。
PIC系列单片机的I/O 口是双向的,其输出电路为CMOS互补推挽输出电路,它的专用寄存器(SFR)是分散在四个地址区间内而51系列是集中在一个固定的区间地址即80H-FFH之间。
以上两种方案,方案一优点:
ATS52的储存空间大,而且ROM可以扩展并且其引脚数比方案二多。
最重要是方案要求编程简单,它的寄存器只有一个地址区间因此编程要比方案二简单的多。
方案二缺点:
因为寄存器的地址区间分散,所以给编程带来很多瓶颈。
还有PIC单片机的性能没有51系列稳定。
因此综上所述,选择方案一。
2)键盘方案的选择与论证
方案一 :
采用矩阵式键盘,此类键盘采用矩阵式行列扫描方式,优点是可减少占用单片机的I/O口数目,使CPU有足够的资源去处理其他的工作(多机通讯)。
方案二 :
采用独立式按键电路,每个按键单独占有一根I/O接口线,每个I/O口的工作状态互不影响,此类键盘采用端口直接扫描方式。
缺点为当按键较多时占用单片机的I/O口数目较多。
方案三:
采用由8255驱动的PC机键盘。
优点:
占用单片机的I/O口少。
缺点:
键盘太大且驱动程序复杂,影响美观。
综合考虑以上的方案及题目要求,由于独立键盘操作方便,所以采用了方案二。
3) 显示方案的选择与论证
方案一:
采用传统的两个8位数码管(LED)动态扫描显示传输的数据信息。
方案二:
采用16位字符型液晶(LCD)显示各种相关数据和信息,充分用4行液晶显示的大容量特性。
以上两种方案中,方案一优点:
软件驱动简单,硬件电路调试方便,显示信息量足够用,而且结构简单;而方案二缺点:
采用的16位字符型液晶(LCD)显示属于低功耗器件,但是构造复杂,而且成本比较高。
经过比较选用方案一。
3.框架模块功能描述
1.
图表1整体设计框图
1)输入部分包括按键输入,按键输入相当于一个外界的干扰信号,用于向单片机传输命令或数据。
2)调节电路部分包括晶振和复位,需要时对控制器发出中断信号,以对系统进行调节。
3)微处理器采用常见的AT89C51单片机为控制核心,通过软件编程,对实时采集的信息进行处理,同时也调节电路进行驱动和控制。
4)输出部分包括LED显示电路,将从键盘上输入的信号显示出来,给人以直观的印象。
5)系统过程的综述:
键盘(按钮)输入信号,AT89C51单片机收到信号后进行处理,通过输出系统将信号显示在LED屏上,此时还可以通过按键进行中断调节,显示会发生相应变化,实际情况出发,人们易于操作。
第二章系统硬件设计
1.供电电路
KBP310的作用将交流电变为直流。
C1的作用为滤波,由于普通铝电解电容的寄生电感和电阻较大,频率特性差,仅适用于50~-200Hz频率的电路;若将其用在频率较高的电路中,等效阻抗明显增大,旁路作用大为减弱,且损耗也很大。
因为大容量电解电容C1有一定的绕制电感分布电感,易引起自激振荡,形成高频干扰,稳压电路的自激振荡频率大都较高,因此只用大容量普通电容难以对自激信号起到良好旁路作用,需另用频率特性好的电容与之并联才行。
所以C2用以抑制过电压,抵消因输入线过长产生的电感效应并消除自激振荡;C3用以改善负载的瞬态响应,即瞬时增减负载电流时不致引起输出电压有较大的波动和消除高频噪声。
C4的作用是减小输出纹波电压。
对于滤波电容的选择,要考虑:
1.整流管的压降;2.7805、7905最小允许压降Ud;3.电网波动10%。
从而允许波纹的峰峰值
Δτt=18×
(1-10%)-0.7-Ud-15=4.9v
接近似电流放电计算,假设θ=0(通角),则
C=
=
=1430μf
选取滤波电容C=2200μf/30V
1.主控电路
AT89C51单片机简介
单片机就是在一片半导体硅片上集成了微处理器(CPU),存储器(RAM,ROM,EPROM)和各种输入、输出接口(定时器/计数器,并行I/O接口,串行口,A/D转换器以及脉宽调制器PWM等),这样一块电路集成芯片具有一台计算机的属性,因而被称为单片微型计算机,简称单片机。
2.报警电路
蜂鸣器一般用于一些要求不高的声音报警及按键操作提示音等场合。
蜂鸣器和普通扬声器相比,它有自己的固有频率,最重要一个特点是只要按照极性要求加上合适的直流电压,就可以发出固有频率的声音,因此使用起来比扬声器简单。
由于单片机输出的电压、电流有限,不能直接驱动蜂鸣器响起,因此实际连接电路中加入了三极管放大器,使用三极管的开关功能一起控制蜂鸣器的鸣响。
3.显示电路
LED显示器为8段或7段,每一个段对应一个发光二极管。
这种显示器有共阴极和共阳极两种。
共阳极显示器的发光二极管的阳极接到一起,通常此公共阳极接正电压,当某一字段发光二极管的阴极为低电平时,相应字段就点亮。
共阴极显示器的发光二极管的阴极接到一起,通常此公共阴极接地,当某一字段发光二极管的阳极为高电平时,相应字段就点亮。
此次设计中使用了一个共阴极的单数码管,显示病房号,数码管单独工作,分别接了单片机的P0、P2口。
以查表的方式使数码管来显示。
驱动采用排阻然后拉低IO口的方式驱动。
4.时钟电路
本设计采用内部时钟产生方式。
内部振荡方式所得的时钟信号比较稳定。
晶振选用的是12MHZ的内部振荡方式,电路如图:
电容器C1,C2起稳定振荡频率,快速起振的作用,电容值取30P。
5.复位电路
本设计有两个复位电路;其中系统总的复位电路如下左图,采用上电+按键复位电路如下,上电后,由于电容充电,使RST持续一段高电平时间。
C7选择30uF,R2选择10K。
这不仅能使单片机复位,而且还能使单片机的外围芯片也同时复位。
下面右图中是程序中的复位电路,可用来实现程序跳出循环,从头开始执行。
6.输入电路
图中1-8号按键,分别代表8个病房的呼叫源,按下按键时便开始呼叫。
且有不同的优先级,9号按键为护士按键,按下解除一位呼叫;10号按键全部清零按键。
第三章系统软件设计
病房呼叫系统软件设计均采用模块化设计,整个程序主要包括主程序、键盘扫描程序、显示程序。
所有程序均采用C语言编写。
病房呼叫系统的软件设计思路说明如下:
通过按键扫描,按下一个开关时数码管会对应显示按键号码,用定时器中断控制数码管和LED的亮灭,蜂鸣器的响停,主要难点在键盘长按与短按的优先级判断和重复按键的处理办法。
1.系统主程序
首先对各存储单元初始化,设定定时初值,检测LED,数码管,蜂鸣器是否有损坏,扫描键盘。
2.显示程序
分别定义了display和display0两个子函数,然后通过定时器中断的方法让其闪烁显示,当长按时数码管和LED闪烁的时间为300ms,短按时闪烁时间为1s.
3.按键判断
首先扫描整个队列,如果此队列中没有所按下的键盘数,直接将此数放入队列中,再判断如果此次按键为长按时须与队列中的其他数相比较,将其移到长按的末尾,如果此队列中有所按下的键盘数且与上次状态不同,则需将此数移到队列的末尾,再次判断。
第四章系统调试与结果
1.Protues仿真
当按键7按下时的情况:
2.系统调试过程与问题分析
1)增加了对系统错误检查
测试时,有时会因为电路焊接问题出现蜂鸣器不响,数码管某段不亮等问题。
而病房呼叫系统对的稳定性要求较高,因此加入了开机检测,即在开机时让数码管,指示灯,蜂鸣器工作,以方便人为检查系统是否出现故障。
2)优化了呼叫排序机制
测试时,设计的是按顺序显示呼叫病房号,为了发挥紧急呼叫的作用,因此加入了每次按键按下后进行排序,以实现按优先级显示。
3)消除按键无响应问题
测试时,之前由于显示程序采用的是延时方法,因此在延时过程中无法检测按键而使按键按下不起作用,未解决此问题,在程序上做了改进,即用中断取代延时。
4)按键重复按下问题
最开始没有想到按键重复按下的问题,那么当一个房间连续按下几次,数码管会一直显示这个房间,给护士带来不便,后增添了解决重复按键的问题,用一个判断语句,判断这个按键之前是否出现过。
5)数码管,LED闪烁问题
开始时,未让数码管,LED闪烁,后觉得闪烁能让人更有紧迫感,并设计了闪烁,且长按与短按闪烁状态也不同。
3.结果分析
系统可以很好地满足病房呼叫系统的基本需求,同时又拓展的紧急呼叫,呼叫等待,优先呼叫选择等功能。
在最大程度上拓展了系统功能。
可完善的地方:
可增加通话功能,让病人和护士能直接对话,提高了护士的工作效率
第五章设计总结、心得
1.设计程序之前,务必要对所用单片机的内部结构有一个系统的了解,知道该单片机片内有哪些资源。
2.设计程序采用什么编程语言并不是非常重要,关键要有一个清晰的思路和一个完整的软件流程图。
3.在设计程序时,不能妄想一次就将整个程序设计好,"反复修改,不断改进"是程序设计的必经之路。
4.要养成注释程序的好习惯,一个程序的完美与否不仅仅是实现功能,而应该让人一看就能明白你的思路,这样也为资料的保存和交流提供了方便。
5.在设计程序过程中遇到问题是很正常的,但我们应该将每次遇到的问题记录下来,并分析清楚,以免下次再碰到同样的问题。
参考文献
[1] 谭浩强.C程序设计:
清华大学出版社
[2] 康华光.电子技术基础.(数字部分):
高等教育出版社
[3] 康华光.电子技术基础(模拟部分). :
高等教育出版社,
附录
附1
元件名称
价格
变压器220v转9v
5元
51单片机
4元
蜂鸣器
1元
数码管
1元
按键11个
1元
L7805
1元
KBP310
1元
发光二极管3个
0.5元
电解电容
1元
附2源程序
#include
#defineuintunsignedint
#defineucharunsignedchar
sbitkey1=P1^0;sbitkey2=P1^1;
sbitkey3=P1^2;sbitkey4=P1^3;
sbitkey5=P1^4;sbitkey6=P1^5;
sbitkey7=P1^6;sbitkey8=P1^7;//前8个按键对应8个病房
sbitkey9=P2^0;sbitkey10=P3^7;//后两个按键分别为单个取消和全部取消
sbitspy_com=P2^7;//数码管的公共端
sbitbeep=P2^3;
sbitLED1=P2^4;sbitLED2=P2^5;//状态指示灯,LED1为有人呼叫时就点亮,LED2为多余两人时点亮
ucharcodetable[]={0x00,0x14,0xad,0x9d,0x1e,0x9b,0xbb,0x15,0xbf};//数码管段码第一个为0
charnum=0,numpre[8],temp,flag=0,len=0,a[8];
uintn,m,f[8];//n为数码管刷新频率与蜂鸣器响停频率,值越大刷新越慢m为中断执行次数
uinti;
ucharj;
voiddelayms(uintxms)//延时xms
{
uinta,b;
for(a=xms;a>0;a--)
for(b=110;b>0;b--);
}
voiddisplay(ucharnumdis)//都亮响
{
m=0;//数码管每刷新一次,使中断计数器m清零
if(numpre[1]!
=0)//当队列大于1时即有至少两人呼叫时,LED2点亮
LED2=0;
beep=0;//闪烁LED1与蜂鸣器
LED1=0;
n=f[numdis-1];//将待显示队列中的病房号的数码管刷新频率(蜂鸣器响停频率即呼叫的状态是普通还是紧急)赋给n,n的检测交给中断函数处理,numdis为当前病房号,但是f[]是从0开始故numdis-1
P0=table[numdis];//给数码管幅值,numdis为当前病房号
delayms
(1);
flag=1;//显示标志位
}
voiddisplay0()//都灭
{
LED2=1;
m=0;
beep=1;
LED1=1;
P0=table[0];
delayms(10);
flag=0;
}
voidkeyscan()
{
if(key1==0)
{
delayms(10);//消抖
if(key1==0)
{
i=0;
num=1;//键值num
while(!
key1)
{
if(i>15000)
{
f[0]=500;//长按
}
else
{
i++;
f[0]=2000;//短按
}
}
//检测队列
for(i=0;i<8;i++)
{
if(numpre[i]==num)
{
if(a[0]==f[0]-2000||a[0]==f[0]-499||i==7)break;
else{
for(j=i;j<7&&numpre[j+1]!
=0;j++)
{
numpre[j]=numpre[j+1];
}
}
numpre[j]=0;//将87356600变为87356000
}
if(numpre[i]==0)
{
numpre[i]=num;
len=i;//记录队列长度
break;
}
}
if(f[0]==500)
a[0]=1;
else
a[0]=0;
//当队列中至少有一个按键时且此次按键状态为长按时
if(len!
=0&&f[0]==500)
{
for(j=len;j>0;j--)//倒序循环,将之前最后的一位的按键(即当前键值),移至长按队列的尾部,如83265410,其中832为长按队列,1也为长按(上面的for将其移至尾部),则处理完为83216540
{
if(f[numpre[j-1]-1]!
=500)//当上一位为短按时,交换当前键值与上位键值
{
temp=numpre[j-1];
numpre[j-1]=numpre[j];
numpre[j]=temp;
}
else
{
break;
}
}
}
if(i==0)
display(numpre[0]);
}
}
if(key2==0)
{
delayms(10);
if(key2==0)
{
i=0;num=2;
while(!
key2)
{
if(i>15000)
{
f[1]=500;
}
else
{i++;
f[1]=2000;
}
}
for(i=0;i<8;i++)
{
if(numpre[i]==num)
{
if(a[1]==f[1]-2000||a[1]==f[1]-499||i==7)
break;
else
{
for(j=i;j<7&&numpre[j+1]!
=0;j++)
{
numpre[j]=numpre[j+1];
}
}
numpre[j]=0;
}
if(numpre[i]==0)
{
numpre[i]=num;
len=i;
break;
}
}
if(f[1]==500)
a[1]=1;
else
a[1]=0;
if(len!
=0&&f[1]==500)
{
for(j=len;j>0;j--)
{
if(f[numpre[j-1]-1]!
=500)
{temp=numpre[j-1];
numpre[j-1]=numpre[j];
numpre[j]=temp;}
else
{
break;
}
}
}
if(i==0)
display(numpre[0]);
}
}
if(key3==0)
{
delayms(10);
if(key3==0)
{
i=0;num=3;
while(!
key3)
{
if(i>15000)
{
f[2]=500;
}
else
{i++;
f[2]=2000;
}
}
for(i=0;i<8;i++)
{
if(numpre[i]==num)
{
if(a[2]==f[2]-2000||a[2]==f[2]-499||i==7)
break;
else
{
for(j=i;j<7&&numpre[j+1]!
=0;j++)
{
numpre[j]=numpre[j+1];
}
}
numpre[j]=0;