基于51单片机病床呼叫系统的设计.docx
《基于51单片机病床呼叫系统的设计.docx》由会员分享,可在线阅读,更多相关《基于51单片机病床呼叫系统的设计.docx(35页珍藏版)》请在冰豆网上搜索。
基于51单片机病床呼叫系统的设计
毕业设计(论文)
题目:
基于51单片机病床呼叫系统的设计
系部:
专业:
学号:
学生姓名:
指导教师姓名:
指导教师职称:
20xx年xx月xx日
摘要
我国进行单片机项目开发已经有二十多年的历史,在此期间所进行的单片机开发项目已经由简单到复杂,由小型系统到大型综合系统。
单片机应用也越来越广泛,从开始的工作控制,到现在的航空航天、消防安全、工作数据采集、石油地质勘探、铁路交通运输以及楼宇自动化等,甚至目前的许多家电中都有单片机的应用。
随着计算机技术的飞速发展,单片机已逐渐发展成为一门关键的技术学科。
而随着社会的进步和发展,医疗水平的不断提高,现代医院护理需要简易及时地获知并处理病人的突发病况。
基于单片微型计算机设计的医院病床呼叫控制系统能同时监控64号病床,避免了人工呼叫的不便与效果差等缺点,它是现代医院必不可少的设备。
有了病床呼叫控制系统,医院的护理工作变得更加方便全面,不用再为人手不足或未能及时发现突发病况而烦恼。
本文实现了对病床呼叫控制系统的设计,详细介绍了51系列单片机应用中的数据转换原理、键盘扫描电路与原理、数码显示管驱动电路等知识,从而学习、了解单片机相关指令在各方面的应用,进一步提高单片机相关电子电路的设计和开发能力。
该系统由AT89C51、LCD1602液晶显示屏、按键、锁存器、蜂鸣器等重要元器件构成,布线简单、功能先进,性能稳定,程序精简。
文章中有电路原理图、仿真图、系统程序清单、源程序等,以供读者参考。
【关键词】AT89C51LCD1602液晶按键蜂鸣器
前言
最近几年来,随着科技的飞速发展,单片机领域正在不断的走向社会各个角落,还带动传统控制检测日新月异更新。
在实时运作和自动控制的单片机应用到系统中,单片机如今是作为一个核心部件来使用,仅掌握单片机方面知识是不够的,还应根据其具体硬件结构,以及针对具体应用对象特点的软件结合,加以完善。
“单片机原理及应用课程设计”是电子类专业的学科基础科,它是继“汇编语言程序设计”,“接口技术”等课程之后开出的实践环节课程。
第一章工作原理
1.1设计目标
1.1.1基本功能
本设计以单片微型计算机的监测与控制为目标,设计一台(模拟)病床呼叫控制器。
能够对多个病床进行监控,对于病床的呼叫作出及时的声音告警并能准确的显示出所呼叫的病床床号,使医护人员能及时准确地赶到病床,给予病人及时的救护与医疗。
具体的设计目标和要求如下:
1、对24个病床的呼叫作出检测;
2、病床呼叫后,病床呼叫控制器能发出声音告警医护人员;
3、用LCD1602液晶显示出所呼叫的病床床号;
4、取消报警。
5、允许两个连续的呼叫间隔不大于5ms
第二章硬件设计与原理
单片微型计算机控制完成对24个病床的呼叫情况的巡回检测、呼叫开关电路输出病床呼叫的信息、LCD1602液晶显示出所呼叫的病床床号、床号显示复位按键给医护人员查看呼叫床号并实现清除已确定的呼叫床号、呼救告警电路用于当有病床呼叫时的声音告警等。
本设计系统能连续性地存储和读出显示呼叫的病床床号等等。
2.1总设计框图
2.2硬件设计分析
2.2.1电源的设计
系统电源使用外接直流5伏。
2.2.2单片机最小系统
51单片机是对目前所有兼容intel8031指令系统的单片机的统称。
该系列单片机的始祖是intel的8031单片机,后来随着技术的发展,成为目前广泛应用的8为单片机之一。
单片机是在一块芯片内集成了CPU、RAM、ROM、定时器/计数器和多功能I/O口等计算机所需要的基本功能部件的大规模集成电路,又称为MCU。
51系列单片机内包含以下几个部件:
一个8位CPU;一个片内振荡器及时钟电路;
4KB的ROM程序存储器;
一个128B的RAM数据存储器;
寻址64KB外部数据存储器和64KB外部程序存储空间的控制电路;
32条可编程的I/O口线;
两个16位定时/计数器;
一个可编程全双工串行口;
5个中断源、两个优先级嵌套中断结构。
如图2-2-1所示为AT89C51单片机基本构造,其基本性能介绍如下:
图2-2-1AT89C51单片机
AT89C51本身内含40个引脚,32个外部双向输入/输出(I/O)端口,同时内含2个外中端口,3个16位可编程定时计数器,2个全双工串行通信口,AT89C51可以按照常规方法进行编程,但不可以在线编程。
其将通用的微处理器和Flash存储器结合在一起,特别是可反复擦写的Flash存储器可有效地降低开发成本。
AT89C51的主要特性如下表所示:
兼容MCS—51指令系统
32个可编程I/O线
4k字节可编程闪烁存储器
可编程UARL通道
三个16位可编程定时/计数器中断
时钟频率0-24MHz
2个外部中断源,共8个中断源
256×8bit内部RAM
2个读写中断口线
可直接驱动LED
软件设置睡眠和唤醒功能
低功耗空闲和掉电模式
表2-2-1AT89C51主要功能描述
AT89C51为40脚双列直插封装的8位通用微处理器,采用工业标准的C51内核,在内部功能及管脚排布上与通用的8xc51相同,其主要用于会聚调整时的功能控制。
功能包括对会聚主IC内部寄存器、数据RAM及外部接口等功能部件的初始化,会聚调整控制,会聚测试图控制,红外遥控信号IR的接收解码及与主板CPU通信等。
主要管脚有:
XTAL1(19脚)和XTAL2(18脚)为振荡器输入输出端口,外接12MHz晶振。
RST/Vpd(9脚)为复位输入端口,外接电阻电容组成的复位电路。
VCC(40脚)和VSS(20脚)为供电端口,分别接+5V电源的正负端。
P0~P3为可编程通用I/O脚,其功能用途由软件定义,在本设计中,P0端口(32~39脚)被定义为N1功能控制端口,分别与N1的相应功能管脚相连接,13脚定义为IR输入端,10脚和11脚定义为I2C总线控制端口,分别连接N1的SDAS(18脚)和SCLS(19脚)端口,12脚、27脚及28脚定义为握手信号功能端口,连接主板CPU的相应功能端,用于当前制式的检测及会聚调整状态进入的控制功能。
P0口:
P0口是一组8位漏极开路型双向I/O口,也即地址/数据总线复用口。
作为输出口用时,每位能吸收电流的方式驱动8个TTL逻辑门电路,对端口P0写“1”时,可作为高阻抗输入端用。
在访问外部数据存储器或程序存储器时,这组口线分时转换地址(低8位)和数据总线复用,在访问期间激活内部上拉电阻。
在Flash编程时,P0口接收指令字节,而在程序校验时,输出指令字节,校验时,要求外接上拉电阻。
P1口:
P1是一个带内部上拉电阻的8位双向I/O口,P1的输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路。
对端口写“1”,通过内部的上拉电阻把端口拉到高电平,此时可作输入口。
作输入口使用时,因为内部存在上拉电阻,某个引脚被外部信号拉低时会输出一个电流(IIL)。
与AT89C51不同之处是,P1.0和P1.1还可分别作为定时/计数器2的外部计数输入(P1.0/T2)和输入(P1.1/T2EX)。
Flash编程和程序校验期间,P1接收低8位地址。
P2口:
P2是一个带有内部上拉电阻的8位双向I/O口,P2的输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路。
对端口P2写“1”,通过内部的上拉电阻把端口拉到高电平,此时可作输入口,作输入口使用时,因为内部存在上拉电阻,某个引脚被外部信号拉低时会输出一个电流(IIL)。
在访问外部程序存储器或16位地址的外部数据存储器(例如执行MOVX@DPTR指令)时,P2口送出高8位地址数据。
在访问8位地址的外部数据存储器(如执行MOVX@RI指令)时,P2口输出P2锁存器的内容。
Flash编程或校验时,P2亦接收高位地址和一些控制信号。
P3口:
P3口是一组带有内部上拉电阻的8位双向I/O口。
P3口输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路。
对P3口写入“1”时,它们被内部上拉电阻拉高并可作为输入端口。
此时,被外部拉低的P3口将用上拉电阻输出电流(IIL)。
P3口除了作为一般的I/O口线外,更重要的用途是它的第二功能P3口还接收一些用于Flash闪速存储器编程和程序校验的控制信号。
RST:
复位输入。
当振荡器工作时,RST引脚出现两个机器周期以上高电平将使单片机复位。
ALE/PROG:
当访问外部程序存储器或数据存储器时,ALE(地址锁存允许)输出脉冲用于锁存地址的低8位字节。
一般情况下,ALE仍以时钟振荡频率的1/6输出固定的脉冲信号,因此它可对外输出时钟或用于定时目的。
要注意的是:
每当访问外部数据存储器时将跳过一个AL脉冲。
对Flash存储器编程期间,该引脚还用于输入编程脉冲(PROG)。
如有必要,可通过对特殊功能寄存器(SFR)区中的8EH单元的D0位置位,可禁止ALE操作。
该位置位后,只有一条MOVX和MOVC指令才能将ALE激活。
此外,该引脚会被微弱拉高,单片机执行外部程序时,应设置ALE禁止位无效。
PSEN:
程序储存允许(PSEN)输出是外部程序存储器的读选通信号,当AT89C51由外部程序存储器取指令(或数据)时,每个机器周期两次PSEN有效,即输出两个脉冲。
在此期间,当访问外部数据存储器,将跳过两次PSEN信号。
EA/VPP:
外部访问允许。
欲使CPU仅访问外部程序存储器(地址为0000H—FFFFH),EA端必须保持低电平(接地)。
需注意的是:
如果加密位LB1被编程,复位时内部会锁存EA端状态。
如EA端为高电平(接Vcc端),CPU则执行内部程序存储器中的指令。
Flash存储器编程时,该引脚加上+12V的编程允许电源Vpp,当然这必须是该器件是使用12V编程电压Vpp。
XTAL1:
振荡器反相放大器的及内部时钟发生器的输入端。
XTAL2:
振荡器反相放大器的输出端。
单片机最小原理图如图2-2-2所示。
图2-2-2单片机最小系统
单片机最小系统说明:
时钟信号的产生:
在MCS-51芯片内部有一个高增益反相放大器,其输入端为芯片引脚XTAL1,其输出端为引脚XTAL2。
而在芯片的外部,XTAL1和XTAL2之间跨接晶体振荡器和微调电容,从而构成一个稳定的自激振荡器,这就是单片机的时钟振荡电路。
时钟电路产生的振荡脉冲经过触发器进行二分频之后,才成为单片机的时钟脉冲信号。
一般地,电容C2和C3取30pF左右,晶体的振荡频率范围是1.2-12MHz。
如果晶体振荡频率高,则系统的时钟频率也高,单片机的运行速度也就快。
单片机复位使CPU和系统中的其他功能部件都处在一个确定的初始状态下,并从这个状态开始工作。
单片机复位条件:
必须使9脚加上持续两个机器周期(即24个振荡周期)的高电平。
2.2.3液晶显示电路
LCD1602分为带背光和不带背光两种,基控制器大部分为HD44780,带背光的比不带背光的厚,是否带背光在应用中并无差别,两者尺寸差别如下图2-2-3所示:
LCD1602的主要技术参数:
1、显示容量:
16×2个字符
2、芯片工作电压:
4.5—5.5V
3、工作电流:
2.0mA(5.0V)
4、模块最佳工作电压:
5.0V
5、字符尺寸:
2.95×4.35(W×H)mm
引脚功能说明
LCD1602采用标准的14脚(无背光)或16脚(带背光)接口,各引脚接口说明如图2-2-4所示:
编号
符号
引脚说明
编号
符号
引脚说明
1
VSS
电源地
9
D2
数据
2
VDD
电源正极
10
D3
数据
3
VL
液晶显示偏压
11
D4
数据
4
RS
数据/命令选择
12
D5
数据
5
R/W
读/写选择
13
D6
数据
6
E
使能信号
14
D7
数据
7
D0
数据
15
BLA
背光源正极
8
D1
数据
16
BLK
背光源负极
图2-2-4引脚接口说明
图2-2-4:
引脚接口说明表
第1脚:
VSS为地电源。
第2脚:
VDD接5V正电源。
第3脚:
VL为液晶显示器对比度调整端,接正电源时对比度最弱,接地时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度。
第4脚:
RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。
第5脚:
R/W为读写信号线,高电平时进行读操作,低电平时进行写操作。
当RS和R/W共同为低电平时可以写入指令或者显示地址,当RS为低电平R/W为高电平时可以读忙信号,当RS为高电平R/W为低电平时可以写入数据。
第6脚:
E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。
第7~14脚:
D0~D7为8位双向数据线。
第15脚:
背光源正极。
第16脚:
背光源负极。
2.2.4LCD1602的指令说明及时序
1602液晶模块内部的控制器共有11条控制指令,如图2-2-5所示:
序号
指令
RS
R/W
D7
D6
D5
D4
D3
D2
D1
D0
1
清显示
0
0
0
0
0
0
0
0
0
1
2
光标返回
0
0
0
0
0
0
0
0
1
*
3
置输入模式
0
0
0
0
0
0
0
1
I/D
S
4
显示开/关控制
0
0
0
0
0
0
1
D
C
B
5
光标或字符移位
0
0
0
0
0
1
S/C
R/L
*
*
6
置功能
0
0
0
0
1
DL
N
F
*
*
7
置字符发生存贮器地址
0
0
0
1
字符发生存贮器地址
8
置数据存贮器地址
0
0
1
显示数据存贮器地址
9
读忙标志或地址
0
1
BF
计数器地址
10
写数到CGRAM或DDRAM)
1
0
要写的数据内容
11
从CGRAM或DDRAM读数
1
1
读出的数据内容
图2-2-5控制命令表
1602液晶模块的读写操作、屏幕和光标的操作都是通过指令编程来实现的。
(说明:
1为高电平、0为低电平)
指令1:
清显示,指令码01H,光标复位到地址00H位置。
指令2:
光标复位,光标返回到地址00H。
指令3:
光标和显示模式设置I/D:
光标移动方向,高电平右移,低电平左移S:
屏幕上所有文字是否左移或者右移。
高电平表示有效,低电平则无效。
指令4:
显示开关控制。
D:
控制整体显示的开与关,高电平表示开显示,低电平表示关显示C:
控制光标的开与关,高电平表示有光标,低电平表示无光标B:
控制光标是否闪烁,高电平闪烁,低电平不闪烁。
指令5:
光标或显示移位S/C:
高电平时移动显示的文字,低电平时移动光标。
指令6:
功能设置命令DL:
高电平时为4位总线,低电平时为8位总线N:
低电平时为单行显示,高电平时双行显示F:
低电平时显示5x7的点阵字符,高电平时显示5x10的点阵字符。
指令7:
字符发生器RAM地址设置。
指令8:
DDRAM地址设置。
指令9:
读忙信号和光标地址BF:
为忙标志位,高电平表示忙,此时模块不能接收命令或者数据,如果为低电平表示不忙。
指令10:
写数据。
指令11:
读数据。
2.2.5LCD1602的RAM地址映射及标准字库表
液晶显示模块是一个慢显示器件,所以在执行每条指令之前一定要确认模块的忙标志为低电平,表示不忙,否则此指令失效。
要显示字符时要先输入显示字符地址,也就是告诉模块在哪里显示字符,图2-2-6是1602的内部显示地址。
例如第二行第一个字符的地址是40H,那么是否直接写入40H就可以将光标定位在第二行第一个字符的位置呢?
这样不行,因为写入显示地址时要求最高位D7恒定为高电平1所以实际写入的数据应该是01000000B(40H)+10000000B(80H)=11000000B(C0H)。
在对液晶模块的初始化中要先设置其显示模式,在液晶模块显示字符时光标是自动右移的,无需人工干预。
每次输入指令前都要判断液晶模块是否处于忙的状态。
1602液晶模块内部的字符发生存储器(CGROM)已经存储了160个不同的点阵字符图形,这些字符有:
阿拉伯数字、英文字母的大小写、常用的符号、和日文假名等,每一个字符都有一个固定的代码,比如大写的英文字母“A”的代码是01000001B(41H),显示时模块把地址41H中的点阵字符图形显示出来,我们就能看到字母“A”。
图2-2-7液晶显示电路
2.2.6按键输入电路
按键是由一组按压式或触摸式开关构成的阵列,是一种常用的输入设备。
键盘可分为编码式键盘和非编码式键盘两种。
1.编码键盘通过硬件电路产生被按按键的键码,这种键盘所需程序简单,但硬件电路复杂、价格昂贵通常不被单片机系统采用。
2.非编码键盘常用一些按键排列成行列矩阵,其硬件逻辑与按键编码不存在严格的对应关系,而要由所用的程序来决定。
非编码键盘的硬件接口简单,但是要占用较多的CPU时间,通常采用可编程键盘管理芯片来克服这个缺点。
本设计使用两种按键,一种是按键式非编码键盘和轻触式非编码开关。
在接线时由于有四个引脚,连接时需要用万用表进行测量,然后接通两个引脚,原理图如下。
要进行数据的计算就必须先进行数据的输入,也就必须确定按键输入的数值是什么,这就需要对键盘进行扫描,从而确定究竟是哪个键按下。
图2-2-8按键电路
2.2.7报警电路
考虑到该系统是用于医院里的,告警声音必须够响亮却不刺耳,不那么令人心烦,本设计病床呼叫控制系统的声音告警电路采用蜂鸣器发声音;又考虑到直接接单片机I/0口可能驱动电流不够大的问题,采用三极管驱动蜂鸣器发声。
图2-2-9报警电路
第三章软件设计与分析
3.1软件设计的组成
在程序设计过程中,为了有效地完成任务,把所要完成的任务精心的分割成若干个相互独立但相互又仍可有联系的任务模块,这些任务模块使得任务变得相对单纯,对外的数据交换相对简单,容易编写,容易检测,容易阅读和维护。
这种程序设计思想称为模块化程序设计思想。
模块化结构程序的设计,可以使系统控制软件便于调试与优化,也使读者更好地理解和阅读系统的程序设计。
因此,本医院病床呼叫控制系统在软件的设计上,运用了模块化程序的结构对软件进行设计,使得程序变得更加直观易懂,方便读者阅读。
程序的主要模块有:
延时子函数、初始化子函数、数码管显示子函数、矩阵键盘扫描子函数、主函数和数据定义这几部分组成。
3.2各部分软件分析
3.2.1延时子函数
voiddelay(uintz)//延迟程序
{
uintx,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
3.2.2初始化子函数
voidinit()
{
TMOD=0x01;//定时器0工作在方式1
ET0=1;//开定时器0
TR0=1;
TH0=(65535-50000)/256;//定时器赋初值
TL0=(65535-50000)%256;
lcd_enable=1;//液晶屏初始化程序
wcmd(0x38);
delay
(1);
wcmd(0x0c);
delay
(1);
wcmd(0x06);
delay
(1);
wcmd(0x01);
delay
(1);
}
3.2.3液晶显示子函数
voidposition(uintpos)//LCD光标定位程序
{
wcmd(pos|0x80);
}
voidroom(ucharaa)//病房显示程序
{
position(0x08);
wdata(0x30+aa);
}
voidsite(ucharbb)//病床显示程序
{
position(0x47);
wdata(0x30+bb);
delay(200);
}
voidtime(ucharcc)//时间显示程序
{
shi=cc/10;
ge=cc%10;
position(0x4e);
wdata(0x30+shi);
wdata(0x30+ge);
}
3.2.4主函数
voidmain()
{
init();
while(dis1[i]!
='\0')
{
wdata(dis1[i]);//显示字符
delay
(2);
i++;
}
position(0x40);
i=0;
while(dis2[i]!
='\0')
{
wdata(dis2[i]);//显示字符
delay
(2);
i++;
}
position(0x49);
i=0;
while(dis3[i]!
='\0')
{
wdata(dis3[i]);//显示字符
delay
(2);
i++;
}
while
(1)
{
for(i=0;i<3;i++)//动态赋值
{
P0=table[i];
temp=P1&0xff;
if(temp!
=0xff)
{
EA=1;
speak=0;
delay(10);
speak=1;
delay(10);
room(i+1);//病房判定
temp=P1&0xff;
switch(temp)//病床号判定
{
case0xfe:
site
(1);
break;
case0xfd:
site
(2);
break;
case0xfb:
site(3);
break;
case0xf7:
site(4);
break;
case0xef:
site(5);
break;
case0xdf:
site(6);
break;
case0xbf:
site(7);
break;
case0x7f:
site(8);
break;
}
delay(600);
num=t/20;
time(num);
EA=0;
}
if(temp==0xff&cls==0)//清屏程序)
{
speak=1;
room(0);
site(0);
time(0);
}
}
}
}
3.3总源程序
#include
typedefunsignedcharuchar;
typedefunsignedintuint;
sbitrs=P3^7;
sbitwrite=P3^6;
sbitenable=P3^5;
sbitlcd_enable=P3^4;//锁存器使能端
sbitcls=P3^0;//清屏按键
sbitspeak=P3^1;/