病床呼叫系统.docx
《病床呼叫系统.docx》由会员分享,可在线阅读,更多相关《病床呼叫系统.docx(23页珍藏版)》请在冰豆网上搜索。
病床呼叫系统
生物医学工程学院
智
能
病
床
呼
叫
系
统
指导老师:
叶华山赵元
科研组长:
蔡孙军
科研成员:
邹梦琴周秀朋胡一梅刘晓玲
背景
151系列单片机的简介
1.1单片机的发展介绍
1.2单片机的结构特点
1.3单片机的实际应用
1.4控制器AT89C513
2接口技术
2.1键盘接口
2.2显示器接口
3程序设计语言
高级语言
4基于单片机的病床呼叫系统的设计实现
4.1系统总体设计
4.2系统硬件设计
4.3系统软件设计
4.4系统结果
基于单片机的病床呼叫系统
简介
系统是基于51系列的单片机设计的病床呼叫系统。
该系统以AT89C51单片机为核心辅以矩阵键盘、LED点阵显示电路和部分简单模拟和数字电路组成的能够实现病人和医护人员之间信息的传递。
在该设计中每个病房都有一个按键,当患者有需要时,按下按键,此时值班室的显示屏可显示此患者的床位号,多人使用时可实现循环显示,医护人员按下“响应”键取消当前呼叫。
此系统能够为医院提供一个成本低、效率高、操作方便和易于安装维护的快捷系统。
背景
病床呼叫系统是一种应用于医院病房、养老院等地方,用来联系沟通医护人员和病员的专用呼叫系统,是提高医院水平的必备设备之一。
病床呼叫系统的优劣直接影响到病员的安危,历来受到各大医院的普遍重视。
它要求及时、准确可靠、简便可行、利于推广[1]。
目前市场上存在着许多种型号不一功能各异的医院病房呼叫系统,主要为两大类:
有线式和无线式[2]。
无线式病房呼叫系统不存在铺设线路的问题,但是可靠性差,而且无线电波会干扰其他医疗仪器设备[3]。
本文设计的是有线式的,适合较小的医院病房使用,具有成本低,易于操作、安装和维护,而且具有可靠稳定,对其他医疗设备不会产生干扰的特点;但受到布线较多,影响美观,故不适宜较大的医院。
病床呼叫管理系统便于病员快捷的呼叫护士,缩短人工呼叫的时间。
当今病房呼叫系统正在逐步地向智能化发展,它可以和录像机一起使用,当病人按下开关时,在护士值班室的大屏幕能够观察病人的需要。
并且可以配备对讲机等设备,能够使病员及时快捷地与医护人员进行沟通。
151系列单片机的简介
单片机也被称作“单片微型计算机”、“微控制器”和“嵌入式微控制器”,单片机一词最初源于“SingleChipMicrocomputer”,简称SCM。
随着单片机在技术和体系结构上的进步,其控制功能不断扩展,国际上逐渐采用“MCU”(MicroControllerUnit,微控制器)来代替SCM。
1.2单片机的结构特点
单片机是微型机的一个重要分支,它在结构上的最大特点是把CPU、存储器、定时器和多种输入/输出接口电路集成在一块超大规模的集成电路芯片上。
单片机内是一种在线式实时控制计算机,在线式就是现场控制,需要有较强的抗干扰能力,较低的成本。
单片机由于这种结构,所以具有很多显著的特点。
主要有控制能力强,抗干扰能力强、可靠性高,性能价格比高,低功耗、低电压,扩展了多种串行口和系统扩展容易等特点。
1.3单片机的实际应用
单片机广泛应用于仪表仪器、家用电器、医用设备、航空航天、专用设备的智能化管理及过程控制等领域,在计算机网络和通信领域也有相关的应用,现在的单片机普遍具有通信接口,可以很方便的与计算机实现数据通信,为计算机网络和通信设备间的应用提供了极好的物质条件,通信设备基本上都实现了单片机智能控制,从手机,电话机、小型程控交换机、楼宇自动通信呼叫系统、列车无线通信、再到日常工作中随处可见的移动电话,集群移动通信,无线对讲机等。
1.4控制器AT89C51
AT89C51是美国ATMEL公司生产的低电压,高性能CMOS8位单片机,片内含4kbytes的可反复擦写的只读程序存储器(PEROM)和128bytes的随机存取数
据存储器(RAM),器件采用ATMEL公司的高密度,非易失性存储技术生产,兼容标准MCS-51指令系统,片内置通用8位中央处理器(CPU)和Flash存储单元,功能强大AT89C51单片机可为您提供许多高性价比的应用场合,可灵活应用于各种控制领域[2]。
主要特性:
与MCS-51产品指令系统完全兼容
4K字节可重擦写Flash闪速存储器
1000次擦写周期
全静态操作:
0Hz-24MHz
三级加密程序存储器
128×8字节内部RAM
32个可编程I/O口线
2个16位定时/计数器
5个中断源
可编程串行UART通道
AT89C51单片机采用40Pin封装的双列直插DIP结构,图1.1是它的引脚配置图。
40个引脚中,正电源和地线两根;4组8位I/O口,共32个引脚;时钟电路引脚XTAL1和XTAL2;控制信号引脚包含:
复位输入端RET,地址锁存允许输出/编程脉冲输入端ALE/PROG,片外程序存储器选通控制信号端PSEN,内外程序存储器选择/编程电源输入端EA/VPP。
图1.1AT89C51单片机引脚图
2接口技术
2.1键盘接口
在单片机的应用系统中,通常都有人—机对话功能。
它包含人对系统的状态干预、数据的输入以及应用系统向人报告运行状态与运行结果等。
键盘成为人—机联系的必要手段,此时需要配置适当的键盘输入设备[5]。
2.1.1键盘工作原理
键盘中的每个按键都是一个常开的开关电路,当所设置的功能键或数字键按下时,则处于闭合状态。
对于一组键或一个键盘,需要通过接口电路与单片机相连,以便将键的开关状态通知单片机。
单片机可以采用查询或中断方式检查有无键的输入以及是哪个键被按下,并通过转移指令转入执行该键的功能程序,执行完再返回到原始状态。
2.1.2独立式按键
独立式按键是指直接用I/O口线构成的单个按键电路。
每个独立式按键单独占有一根I/O口线,每根I/O口线的工作状态都不会影响其他I/O口线的工作状态。
2.1.3行列式键盘
独立式按键电路每一个按键开关占用一根I/O口线。
当按键数较多时,要占用较多的I/O口线。
因此,在按键数大于8时,通常采用行列式(也称“矩阵式”)键盘电路。
最简单的键盘,每个键对应I/O端口的一位,没有什么键闭和时,各位均处于高电位。
当有一个键按下时,就是对应位接地而成为低电位,而其它位仍为高电位。
这样,CPU只要检测到某一位为“0”,便可判别出对应键已经按下。
但是,当键盘上的键较多时,引线太多,占用的I/O端口也太多。
比如,一个有64个键的键盘,采用这种方法来设计时,就需要64条连线和8个8位并行端口。
所以,这种简单结构只用在仅由几个键的小键盘中。
通常使用的键盘结构是矩阵式的,如图2.1所示。
设有m*n个键盘,那么,采用矩阵式结构以后,便只要条引线就行了。
比如,有m+n个键,那么,只要用两个并行端口和16条引线便可以完成键盘的连接[6]。
图2.1矩阵键盘
2.2显示器接口
为了方便人们观察和监视单片机运行情况,通常需要利用显示器作为单片机的输出设备,以显示单片机的键输入值、中间信息以及运算结果等。
在单片机应用系统中,常用的显示器主要有LCD(液晶显示器)、LED(发光二极管显示器)和数码管,具有耗电省,配置灵活,线路简单,安装方便,耐振动,寿命长等优点。
3程序设计语言
单片机能执行的程序可以用很多种语言编写。
从语言结构及其与单片机的关系两方面可分为三大类:
分别是机器语言、汇编语言和高级语言。
高级语言是一种面向过程且独立于计算机硬件结构的通用计算机语言。
目前在单片机应用最广泛的是C语言。
3.1单片机C语言的特点
①对单片机的指令系统不要求了解,仅要求对单片机的存储结构有初步的了解。
②寄存器的分配、不同存储器的寻址及数据类型等细节可由编译器管理。
③程序有规范的结构,可分为不同的函数,可使程序结构化。
④关键字及运算函数可用近似人的思维过程方式使用。
⑤编程及程序调试时间显著缩短,从而提高效率。
⑥提供的库包含许多标准子程序,具有较强的数据处理能力等。
3.2单片机C语言使用的编程软件
KeilC51是美国KeilSoftware公司出品的51系列兼容单片机C语言软件开发系统,与汇编相比,C语言在功能上、结构性、可读性、可维护性上有明显的优势,因而易学易用。
Keil提供了包括C编译器、宏汇编、连接器、库管理和一个功能强大的仿真调试器等在内的完整开发方案,通过一个集成开发环境(uVision)将这些部分组合在一起。
运行Keil软件需要WIN98、NT、WIN2000、WINXP等操作系统。
如果你使用C语言编程,那么Keil几乎就是你的不二之选,即使不使用C语言而仅用汇编语言编程,其方便易用的集成环境、强大的软件仿真调试工具也会令你事半功倍。
4基于单片机的病床呼叫系统的设计实现
4.1系统总体设计
4.1.1功能要求
本课题主攻方向是使系统实现以下目的:
①任一病房(共16张)呼叫,医护值班室马上能响应并显示病房号;
②显示病房床号;
③若有多个病床呼叫就循环显示;
④处理完毕后清除记录;
⑤显示器不重复显示按一次以上的病床号
4.1.2设计方案
用8051自身接口实现数码管静态显示和键盘扫描,使用8051单片微机外加作地址锁存用的四块三态锁存器74LS373芯片和一块74LS138芯片可构成一个完整的最小微机电路。
以此为基础,在智能装置中若要配置多位数码管显示器,以及m行n列矩阵键盘的话,可以不扩展I/O芯片而由8051自身I/O口,实现上述功能,即用P0口的八个端口作为LED的段选,用P2口的高三位连接一个三八译码器74LS138作为四个LED的片选.用P1口和P2口的低五位做键盘电路的接口。
4.1.3总体结构框图
本设计是基于AT89C51单片机设计的病房呼叫系统设计,该系统就是以Atmel公司的AT89C51单片机作为主控器,包括键盘输入电路,显示电路,以及晶振复位电路等来实现病房呼叫系统。
图4.1病房呼叫系统结构框图
4.2系统硬件设计
4.2.1硬件构成示意图
图4.2硬件构成示意图
4.2.2外围电路设计
4.2.2.1控制器AT89C51
复位电路:
RST引脚是复位信号输入端,高电平有效。
采用上电加按钮复位,因为本系统设计考虑到该系统比较重要,所以除了采用上电复位的方式外,应该还有按钮复位备用复位方式以防止系统死机时能。
如下图4.3所示:
图4.3上电复位和按键复位
时钟电路:
时钟是时序的基础,AT89C51核片内由一个反相放大器构成振荡器,可以由它产生时钟,时钟可以由两种方式产生内部方式和外部方式。
本系统采用内部方式,在XTAL1和XTAL2端外接石英晶体作为定时元件,内部反相放大器自激振荡,产生时钟。
时钟发生器对振荡脉冲二分频。
电容采用30pF电容。
如下图4.4所示:
图4.4内部时钟电路
4.2.2.2键盘电路设计
1、键的识别
为了识别键盘上的闭合键,通常采用两种方法,一种称为行扫描法,另一种称为行反转法。
行扫描法的原理:
行扫描法识别闭合键的原理如下:
先使第0行接地,其余行为高电平,然后看第0行是否有键闭合,这是通过检查列线电位来实现的,即在第0行接地时,看是否有条列线变成低电平。
如果有某条列线变为低电平,则表示第0行和此列线相交位置上的键被按下;如果没有任何一条列线为低电平,则说明第0行上没有键被按下。
此后,再将第1行接地,,然后检测列线中是否有变为低电平的线。
如此往下逐行扫描,直到最后一行。
在扫描过程中,当发现某一行有键闭合时,也就是列线输入中有一位为0时,便在扫描中途退出,而将输入值进行移位,从而确定闭合键所在的列线位置。
根据行线位置和列线位置便能再扫描法来确定具体位置。
将行线和一个并行接口相接,CPU每次使并行输出接口的某一位为0,便相当于将某一行线接地,而其他位为1,则相当于使其他行线处于高电平。
为了检查列线上的电位,将列线和一个并行输入输出口相接,CPU只要读取输入输出口中的数据,就可以设法判别出第几号键被按下[11]。
从上面的原理中知道,程控扫描法是由程序控制键扫描的方法。
程控扫描的任务是:
①首先判断是否有键按下。
其方法是使所有的行输出均为低电平,然后从端口A读入列值。
如果没有键按下,则读入的列值为FFH;如果有键按下,则读入的列值不为FFH。
②去除键抖动。
若有键按下,则延时5~10ms,再一次判断有无键按下,如果此时仍有键按下,则认为键盘上有一个键处于稳定闭合期。
③若有键闭合,则求出闭合键的键值.求键值的方法是对键盘逐行扫描。
如图4.5是行扫描法:
图4.5行扫描法的流程图
(2)行反转法的原理[12]。
行反转法也是识别闭合键的常用方法,它的原理如下所述。
这了叙述方便,以4×4=16键的键盘为例。
图4.6是行反转法的工作示意图:
图4.6行反转法连接图
从图中可以看到,用行反转法识别闭合键时,要将行线接一个并行口,先让它工作为输出方式,将列线接到一个并行口,先让它工作在输出方式。
程序使CPU通过输出端口往各行线上全部送低电平,然后读入列线的值。
如果此时有某一个键被按下,则必定会使某一列线值为0,然后,程序再对两个并行端口进行方式设置,使接行线的并行端口工作在输出方式,而使接列线的并行端口工作在输出方式,并且将刚才读得的列线值从所接的并行端口输出,再读取行线的输入值,那么,在闭合键所在的行线上的值必定为0。
这样,当一个键被按下时,必定可以读得一对惟一的行值和列值。
在键盘设计时,除了以键码的识别以外,还有抖动问题需要解决[13]。
有软件方法可以很容易解决抖动问题,这就是通过延迟来等待抖动消失,这之后,再读入键码。
4.2.2.4控制电路设计
三个控制按键分别接p3.2,p3.3,p3.4口(如图4.8所示),当有呼叫发出时,值班室人员收到相应信息后,可按下“响应按钮”,单片机执行中断程序。
4.2.2.5示警电路
报警电路由一个蜂鸣器与p3.1口相接,当有键按下时,有信号输入,蜂鸣器响示警,提醒值班人员有病人出现紧急情况。
4.3系统软件设计
4.3.1设计的软件环境简介
4.3.1.1Keilc
对于AT89C51的控制设计,以Keilc软件编程环境,以proteus软件为电路仿真设计环境。
二者的结合为该系统的设计提供有利条件。
Keilc软件界面,如图4.9所示:
图4.9Keil_c软件界面
该软件是一款集编程和仿真于一体的软件,它支持汇编、C语言及二者的混合编程[14]。
4.3.2系统程序设计
4.3.2.1系统主程序设计的流程如图4.11所示:
图4.11系统主程序设计的流程
主程序程序描述:
首先对各存储单元初始化,设定定时初值,接着判断清零键,看是否按下,若按下,则清零,然后继续扫描键盘,如扫描到键盘有键按下,则调用计数显示子程序,循环显示病床号时,要判断标志位是否为1,若为1,则表示已经按下,则不响应,如为0,则调用循环显示病床号子程序,循环显示病床号,接着定时一秒。
最后,清除定时一秒,准备下一次的定时。
4.3.2.2显示电路流程图
图4.12按键总数显示程序流程图图4.13按键循环显示子程序
显示程序描述
(1)按下键总数显示子程序描述(图4.12按键总数显示程序流程图)
把按键数存储单总元(COUNTER)的值经过BCD调整后十位和个位分别送(7AH)(7BH),调用显示子程序显示按键总数。
(2)循环显示病床号子程序描述(图4.13按键循环显示子程序)
首先判断标志位是否为0,若为0,则表对示应的存储单元里没有值存入,则再检测下一个存储单元标志位是否为0,直到检测到为1.如为1,则把值存入(BED_BOUNTER)中,接着进行BCD调整为十进制,把十位和个位分别送入(BEDCODE_1)和(BEDCODE_2)中,然后调用显示子程序,循环显示病床号。
4.4系统结果分析
启动电源,显示屏显示0000,在按下8号键时,界下部分显示病床(即8号病床呼叫);界面上部分代表共有一个病床按下,在起始位置显示(循环显示);如果现在不按清零键,再按下3号键时,按键号循环显示,可以看出该系统具有记忆功能,以至于不会忽略之前按下的按键;图5.4反映了控制电路的可行性,按up键向后选一房间(呼叫病房),down向前选一房间(呼叫病房),ok则去房间.。
综上所述,本系统实现了主要功能:
显示病床号,蜂鸣器报警提醒值班人员,若有多个病床同时呼叫,则循环显示病床号,确保性息不丢失,待值班人员处理呼叫信息
附录:
程序
#include
#include"LCD12864.h"
#include"delay.h"
#include"drawpoint.h"
#defineKEYP0
sbitkey_change=P3^4;
ucharcodeStr[]={"病床呼叫号:
"};
ucharBedNum[8]={0};
uchartemp_val[8]={0};
ucharnum_change=0;
ucharadd(ucharnum)
{
uchari;
for(i=0;i<8;i++)
{
if(BedNum[i]==num)
{
//Lcd_WriteStr(2,2,"exist");
return0;
}
}
for(i=0;i<8;i++)
{
if(BedNum[i]==0)
{
BedNum[i]=num;
break;
}
}
return0;
}
voiddel_menu()
{
clrscreen();
delay_1ms(5);
clrgdram();
Lcd_WriteStr(0,0,"请输入处理的号码");
}
ucharmatrix_key()
{
uchara,c,b=0;
KEY=0xf0;
if(KEY!
=0xf0)
{
delay_1ms(20);
if(KEY!
=0xf0)
{
a=KEY;
}
KEY=0x0f;
c=KEY;
a=a|c;
clrscreen();
clrgdram();
switch(a)
{
case0xee:
b=11;break;//对比得到的键值给b一个应用数据1
case0xed:
b=4;break;
case0xeb:
b=7;break;
case0xe7:
b=14;break;//*
case0xde:
b=2;break;
case0xdd:
b=5;break;
case0xdb:
b=8;break;
case0xd7:
b=10;break;//00
case0xbe:
b=3;break;
case0xbd:
b=6;break;
case0xbb:
b=9;break;
case0xb7:
b=15;break;//#
case0x7e:
b=12;break;//A删除菜单
case0x7d:
b=13;break;//B确定删除
case0x7b:
b=14;break;//C
case0x77:
b=15;break;//D
default:
b=16;break;//键值错误处理
}
}
returnb;
}
ucharkey_scan()
{
uchartemp;
staticucharkey_val;
if(P1!
=0XFF)
{
delay_1ms(20);
if(P1!
=0XFF)
{
temp=P1;
switch(temp)
{
case0x7f:
key_val=5;break;//5
case0xbf:
key_val=6;break;//6
case0xdf:
key_val=7;break;//7
case0xef:
key_val=8;break;//8
case0xf7:
key_val=4;break;//4
case0xfb:
key_val=3;break;//3
case0xfd:
key_val=2;break;//2
case0xfe:
key_val=1;break;//1
}
}
}
returnkey_val;
}
voidzerotolast(uchara[],ucharb[])
{
uchari,j=0,x=0;
for(i=0;i<8;i++)//判断a数据数据全部是否为0
{
if(a[i]==0)
continue;
else
break;
}
if(i==8)
{
for(i=0;i<8;i++)
b[i]=a[i];
return;
}
for(i=0;i<8;i++)
{
if(a[i]!
=0)
x++;
}
for(i=0;i<8;i++)
{
if(a[i]!
=0)
{
b[j]=a[i];
j++;
}
}
for(i=7;i>x-1;i--)
b[i]=0;
}
voidmain()
{
ucharalone_key_val=0;
ucharmatrix_key_val=0;
ucharchoose_del_num[2];
ucharchoose_del_val,temp=0;
uchari,j,n=0,m=0,x,y;
clrscreen();
delay_1ms(5);
clrgdram();
Lcd_WriteStr(2,0,"欢迎使用");
Lcd_WriteStr(0,1,"护士站监测系统");
Lcd_WriteStr(2,2,"设计者");
Lcd_WriteStr(0,3,"生物医学工程学院");
delay_1ms(5000);
clrscreen();
delay_1ms(5);
clrgdram();
while
(1)
{
temp=alone_key_val;