朱明亮 刘帅 陈飞 医院病人呼叫系统D题最终版.docx
《朱明亮 刘帅 陈飞 医院病人呼叫系统D题最终版.docx》由会员分享,可在线阅读,更多相关《朱明亮 刘帅 陈飞 医院病人呼叫系统D题最终版.docx(36页珍藏版)》请在冰点文库上搜索。
朱明亮刘帅陈飞医院病人呼叫系统D题最终版
合肥学院第五届大学生电子设计竞赛决赛
设计总结报告
题目:
医院病人呼叫系统
组员:
朱明亮0605076043
陈飞0605076042
刘帅0605071001
2009年4月27日
医院病人呼叫系统(D题)
摘要:
本系统利用单片机(AT89S52)为控制核心,由输入模块、显示模块(包括病床号显示、病人呼叫持续时间显示和设定时间倒计时显示)、病人端处理提示模块、声光提示模块、定时模块以及电源模块等功能模块构成。
其中,按键模块采用了8×13的矩阵键盘模式,显示模块利用动态LED显示。
系统主要通过软件控制实现了所有硬件功能,不仅实现了题目的基本要求,发挥部分要求也全部实现,成功完成了医院病人呼叫系统的设计。
关键词:
AT89S52动态LED优先级
1引言
医院病人呼叫系统是基于AT89S52单片机实现对病人呼叫请求控制的装置。
本设计能实现103个病人的呼叫请求,并能按其病情严重设置相应的优先级。
比较方便地完成医护人员同病人之间的联系。
本设计要求制作的系统当病人紧急呼叫时,病人端按键变为红色并保持,同时医护人员端会产生声、光提示,并显示病人编号(共103个床位,采用动态LED显示)。
能根据病人病情设置优先级,当有多人呼叫时,病情严重者优先。
当医护人员开始处理,则病人处按键恢复,系统按优先级分别显示其它呼叫病人的床号,不遗漏任何病人的呼叫。
本设计根据扩展功能的要求给系统增加了任意时间设定功能和病人呼叫持续时间的显示功能,方便医护人员的使用。
2系统设计与论证
2.1系统总体设计思路
充分理解题意后,将系统分为以下几个部分进行设计:
中央控制器、输入模块、定时部分、病人端处理提示模块、声光提示模块、动态LED显示部分和电源模块。
根据分析系统设计框图如图2-1所示:
图2-1系统设计框图
输入模块包括病人呼叫使用按键、医护人员处理后的复位按键和调节定时时间的按键,病人呼叫通过按键输入信号经过中央处理器处理后从动态LED输出显示,同时有声光提示。
动态LED能够显示病人病床号、呼叫持续时间和定时时间。
病人端处理提示模块用发光二极管实现,声光提示包括定时结束声光提示和病人呼叫时的声光提示。
2.2方案论证
2.2.1输入模块
1.按键部分键盘及接口电路的设计有以下两种方案:
方案一:
直接使用I/O口的键盘连接电路。
由于AT89S52的I/O口具有输出锁存和输入缓冲的功能,因而他们组成键盘电路时,可省去输出锁存器和输入缓冲器,键位的列线,行线直接分别与单片机中接口相连。
方案二:
利用I/O口和译码器的接口连接按键电路。
将键盘的七根列线与译码器相连后由译码器74HC138三根口输入单片机,节省了I/O口。
由于本设计所需要的按键总数很大,按键电路我们采用8×13矩阵式键盘电路,同时为了扩展I/O端口我们采用方案二。
2.键盘扫描方式的方案选择:
方案一:
采用定时扫描方式。
此扫描方式每隔一段时间对键盘扫描一次,通常利用单片机内部定时器,产生10ms的定时中断,CPU响应定时器溢出中断请求,对键盘进行扫描,以响应键盘输入请求。
方案二:
采用中断扫描方式。
此扫描方式是在键盘上有键盘阖上时才产生中断请求,CPU响应中断,执行中断服务程序,判断键盘上闭合键的键号,并作出相应的处理。
经综合考虑,本设计选择方案二即中断扫描方式。
可以节省系统资源,避免没有键按下时,系统仍然进行扫描。
2.2.2定时部分
定时部分是本设计的发挥部分,它的实现有以下两种方案:
方案一:
本方案采用555定时器实现定时功能,但此方案调节定时时间和显示时间时非常困难且精度不高。
方案二:
本方案完全用软件实现定时功能。
原理为:
在单片机内部存储器设二个字节分别存放时间的分、秒信息,利用定时器与软件结合实现倒计时定时和显示功能。
由于用硬件实现定时困难且用软件实现定时和倒计时显示简单方便又节省硬件资源,因此本设计采用方案二完成倒计时部分的功能。
2.2.3显示模块
本设计题目中要求病床号必须使用动态LED显示(病人端按键加发光二极管指示),对于动态LED显示的数据输入有如下方案:
方案一:
直接将单片机端口与动态数码管的数据输入及控制端口相接。
此种方法电路简单、连线方便,但占用单片机端口资源较多。
方案二:
将单片机输出端口通过移位寄存器74LS164将数据串行移入动态数码管。
此方案需要增加元器件,但其占用单片机端口资源较少,节省了端口资源。
经综合考虑,由于本设计所用单片机端口较多,因此方案应首先考虑到怎样节约端口资源,所以我们采用方案二。
2.2.4病人端处理提示模块
此模块是为实现当医护人员按下键后准备前来处理时给病人一个提示(用发光二极管指示)而设置的。
本设计给每个病人按键设置一个相应的发光二极管构成此提示模块。
其实现方式是利用移位寄存器将程序中所赋予的高电平逐级移送给目标指示灯。
这样做可节省大量端口资源。
2.2.5声光提示模块
声光提示模块包括病人呼叫时的声光提示和定时器定时到达时的声光提示。
该模块采用直接将蜂鸣器、发光二极管串联接入单片机的信号输出端构成。
从软件中写入方波信号以驱动蜂鸣器发声和发光二极管闪烁。
3.2软件设计
通过单片机软件设计,实现软件结构如下图。
系统首先初始化,通过按键扫描,确定返回的按键值,确定是输入信号还是复位信号,当是输入按键信号时判断其优先级再执行相应的床号和时间显示功能;若返回的是复位信号的键值则将当前的键值置零并显示低一优先级的床号和持续时间。
图3-2系统软件流程图
4系统测试
4.1基本功能测试
1.键盘编号测试结果:
LED
发光二极管
蜂鸣器
无键按下
000
熄灭
不响
001-103顺序按下
001-103对应显示
闪烁
响
测试结果表明显示键盘编号正确,该功能实现。
2.键盘优先级测试结果:
按下按键号
LED
发光二极管
蜂鸣器
008
008
闪烁
响
018
018
闪烁
响
026
026
闪烁
响
087
087
闪烁
响
065
087
闪烁
响
030
087
闪烁
响
测试结果表明当按下的键号大于前一键号时,显示当前按下的键号;当按下的键号小于前一键号时,显示保持原先的键号不变。
这与事先设定的优先级相同,按键优先级功能实现。
3.复位按键测试结果:
在上一测试基础上依次按下医护人员处理(复位)按键测试结果如下:
医务人员按键
LED
发光二极管
蜂鸣器
未处理
87
亮
响
处理
65
亮
响
30
亮
响
26
亮
响
18
亮
响
08
亮
响
00
不亮
不响
结果表明复位按键功能正确。
当按键按下时,动态LED会接着显示下一最高优先级别的病床号及其呼叫持续时间,并进行声光报警。
复位按键功能实现。
4.2发挥部分功能测试
1.定时器功能测试结果:
按下定时器按键调节设定时间,再按下启动开关,则看到时间从设定值开始递减,当时间变为零时,蜂鸣器发声,发光二极管闪烁,结果正确,定时器功能实现。
2.病人呼叫持续时间显示测试结果:
基于以上测试过程,发现当有按键按下时,数码管显示该键所对应的床号,同时计时部分开始从零计时。
依次按下复位键后,计时部分显示了每个键按下持续的时间。
结果正确,功能实现。
5设计总结
经过四天三夜的分析、设计和制作,我们终于成功完成了医院病人呼叫系统。
本设计完成了题目基本要求部分和发挥部分的全部功能指标,系统经测试运行效果良好,实现了预期的所有功能。
这次比赛的经历使我们受益匪浅,终生难忘。
通过比赛,我们不仅成功完成了一件作品,更提高了我们的动手能力,团队协作精神和竞争意识;培养了我们分析问题、解决问题的能力。
相信这些收获将会是使我们终身受益的宝贵财富。
比赛中,我们充分发挥团队合作精神。
大家既分工分工明确又相互配合相互帮助,大大提高了我们的工作效率。
三天四夜的比赛极大地锻炼了我们的毅力和耐心,为了调试一段程序或是焊接一块电路板,我们都会熬夜工作,用最大的细致和激情投入工作。
真诚地感谢本次电子设计竞赛组委会和协办单位给我们这样一次珍贵的锻炼机会,让我们将理论运用于实践,在电子设计的世界中奋斗、徜徉,享受它给予我们的无限快乐和激情。
参考文献
1.徐新民.单片机原理与应用.杭州:
浙江大学出版社,2006。
2.余锡存曹国华著单片机原理与接口技术.西安:
西安电子科技大学出版社,2003年。
3.高吉祥.全国大学生电子设计竞赛培训教程.北京:
电子工业出版社,2007。
4.赵亮侯国锐著单片机C语言编程与实例.北京:
人民邮电出版社,2004年。
5.黄智伟王彦著全国大学生电子设计竞赛训练教程.北京:
电子工业出版社,2005年。
6.催瑞雪,张增良.电子技术动手实践.北京:
北京航空航天大学出版社,2007。
附录
附录一:
主要元器件清单
键盘按键
104个
单片机最小系统板
1个
LED数码管
2个
74LS164芯片
15个
红色发光二极管
若干
74LS138芯片
1个
导线、电容、电阻
若干
附录二:
系统硬件整体电路图
附录三:
程序清单:
//=====================================================
//医院病人呼叫系统
//作者:
刘帅,感谢陈飞、朱明亮的支持。
//=====================================================
#include
//-------------------------------------------------------------------
unsignedcharcodetable[]={0xfc,0x60,0xda,0xf2,0x66,//0~4
0xb6,0xbe,0xe0,0xfe,0xf6};//5~9共阴极
unsignedcharkey,i=1,j=0,prio=0,led=0,a,b,t=0;
unsignedchartemp;
unsignedcharidatabutton[56];//存储病位号idata
unsignedcharidatatime[56];
//-------------------------------------------------------------------
charKeyScan();
//charkeycode[56];
voiddelay10ms(unsignedchartime);
unsignedcharpriority(void);
voidcall1(void);
voidcall2(unsignedcharkey1);
voiddeal(void);
//=====================================================
//主程序
//--------------------------------------
voidmain()
{TMOD=0x02;
TH0=0x06;
TL0=0x06;
TR0=1;
ET0=1;
EA=0;
P1_7=0;
while
(1)
{KeyScan();
if(key>=1&&key<=55)
{button[key]=1;//存储病位号
key=(key>led)?
key:
led;
call1();//紧急呼叫
}
else
switch(key)
{case56:
deal();key=0;break;//医护人员确定处理
}
}
}
//中断计时函数
voidt0(void)interrupt1using0
{t++;
if(t==4000)
{t=0;
for(i=1;i<=55;i++)
{if(button[i]==1)
time[i]++;
}
}
}
//=====================================================
//优先级函数
//-----------------------------------------------------
unsignedcharpriority(void)
{unsignedcharmaxprio=0;
for(i=55;i>=1;i--)
if(button[i])
{maxprio=i;break;
}
returnmaxprio;
}
//=====================================================
//医护人员处理前紧急呼叫函数
//-----------------------------------------------------
voidcall1(void)
{b=table[time[key]%10];
for(i=0;i<8;i++)
{
a=0x01;
P2_0=1;P2_0=0;
P2_1=b&a;
b=b>>1;
}
b=table[time[key]/10];
for(i=0;i<8;i++)
{
a=0x01;
P2_0=1;P2_0=0;
P2_1=b&a;
b=b>>1;
}
b=table[key%10];
for(i=0;i<8;i++)
{
a=0x01;
P2_0=1;P2_0=0;
P2_1=b&a;
b=b>>1;
}
b=table[key/10];
for(i=0;i<9;i++)
{
a=0x01;
P2_0=1;P2_0=0;
P2_1=b&a;
b=b>>1;
//for(j=0;j<10;j++);
//P3=table[key1/10];
//P2=table[key1%10];
}
//P3=table[key/10];
//P2=table[key%10];
P1_7=1;
button[led]=1;
button[key]=0;
led=key;//led存储当前显示的病位号
key=0;
}
//=====================================================
//医护人员处理后紧急呼叫函数
//-----------------------------------------------------
voidcall2(unsignedcharkey1)
{
delay10ms(100);
b=table[time[key1]%10];
for(i=0;i<8;i++)
{
a=0x01;
P2_0=1;P2_0=0;
P2_1=b&a;
b=b>>1;
//for(j=0;j<10;j++);
//P3=table[key1/10];
//P2=table[key1%10];
}
b=table[time[key1]/10];
for(i=0;i<8;i++)
{
a=0x01;
P2_0=1;P2_0=0;
P2_1=b&a;
b=b>>1;
//for(j=0;j<10;j++);
//P3=table[key1/10];
//P2=table[key1%10];
}
b=table[key1%10];
for(i=0;i<8;i++)
{
a=0x01;
P2_0=1;P2_0=0;
P2_1=b&a;
b=b>>1;
}
b=table[key1/10];
for(i=0;i<9;i++)
{
a=0x01;
P2_0=1;P2_0=0;
P2_1=b&a;
b=b>>1;
//for(j=0;j<10;j++);
//P3=table[key1/10];
//P2=table[key1%10];
}
if(key1)P1_7=1;
else
P1_7=0;
led=key1;
button[led]=0;
time[led]=0;
key=0;
//EA=1;
}
//=====================================================
//医护人员确认处理紧急函数
//-----------------------------------------------------
voiddeal(void)
{
prio=priority();
call2(prio);
}
//=====================================================
//功能函数
//-----------------------------------------------------
//=====================================================
//功能函数
//-----------------------------------------------------
//=====================================================
//功能函数
//-----------------------------------------------------
//=====================================================
//延时函数
//-----------------------------------------------------
voiddelay10ms(unsignedchartime)
{
unsignedchari;
while(time--)for(i=0;i<120;i++);
}
//=====================================================
//扫描键盘函数
//-----------------------------------------------------
charKeyScan()
{
//EA=0;
//unsignedchartemp;
//P0_0口检测
P1_0=1;
P1_1=1;
P1_2=1;
P1_3=1;
P1_4=1;
P1_5=1;
P1_6=1;
P0=0xFF;
P0_0=0;
temp=P1;
temp&=0xFF;
if(temp!
=0xFF&&temp!
=0x7F)
{
delay10ms
(1);
temp=P1;
temp&=0xFF;
if(temp!
=0xFF)
{
temp=P1;
temp&=0xFF;
switch(temp)
{
case0xFE:
key=1;break;
case0xFD:
key=2;break;
case0xFB:
key=3;break;
case0xF7:
key=4;break;
case0xEF:
key=5;break;
case0xDF:
key=6;break;
case0xBF:
key=7;break;
//由于P1.7口用于蜂鸣器和发光二极管,会产生低电平的变化
case0x7E:
key=1;break;
case0x7D:
key=2;break;
case0x7B:
key=3;break;
case0x77:
key=4;break;
case0x6F:
key=5;break;
case0x5F:
key=6;break;
case0x3F:
key=7;break;
}
while(temp!
=0xFF&&temp!
=0x7F)
{
temp=P1;
temp&=0xFF;
}
}
}
//P0_0口检测完成
//----------------------------------------------------------------------
//P0_1口检测
P1_0=1;
P1_1=1;
P1_2=1;
P1_3=1;
P1_4=1;
P1_5=1;
P1_6=1;
P0=0xFF;
P0_1=0;
temp=P1;
temp&=0xFF;
if(temp!
=0xFF&&temp!
=0x7F)
{
delay10ms
(1);
temp=P1;
temp&=0xFF;
if(temp!
=0xFF)
{
temp=P1;
temp&=0xFF;
switch(temp)
{
case0xFE:
key=8;break;
case0xFD:
key=9;break;
case0xFB:
key=10;break;
case0xF7:
key=11;break;
case0xEF:
key=12;break;
case0xDF:
key=13;break;
case0xBF:
key=14;break;
//由于P1.7口用于蜂鸣器和发光二极管,会产生低电平的变化
case0x7E:
key=8;break;
case0x7D:
key=9;break;
case0x7B:
key=10;break;
case0x77:
key=11;break;
case0x6F:
key=12;break;
case0x5F:
key=13;break;
case0x3F:
key=14;break;
}
while(temp!
=0xFF&&temp!
=0x7F)
{
temp=P1;
temp&=0xFF;
}
}
}
//P0_1口检测完成
//----------------------------------------------------------------------
//P0_2口检测
P1_0=1;
P1_1=1;
P1_2=1;
P1_3=1;
P1_4=1;
P1_5=1;
P1_6=1;
P0=0xFF;
P0_2=0;
temp=P1;
temp&=0xFF;
if(