《单片机课程设计报告基于单片机的病房呼叫系统设计.doc》由会员分享,可在线阅读,更多相关《单片机课程设计报告基于单片机的病房呼叫系统设计.doc(22页珍藏版)》请在三一办公上搜索。
1、单片机课程设计报告病房呼叫系统摘 要本设计是一个采用89C51单片机配以外围适当电路完成一个可供64张床位使用的病房呼叫系统。该系统需运用单片机典型外围接口技术中的矩阵式键盘电路完成对病房床号的输入,由于床位较多,考虑到89C51单片机自身接口有限,需用可编程并行接口芯片8255外扩I/O实现对矩阵式键盘的扫描与键值的读入。MCS-51单片机受管脚的限制,P0口不仅要作数据总线口而且还提供低8位A0A7,所以只能分时工作,故P0口输出的低8位地址数据必须用锁存器锁存。本设计采用74LS373,其锁存控制信号由引脚ALE提供。在ALE的下降沿将P0口输出的地址数据锁存。由于该设计中单片机要实现三
2、种功能:1)床位按钮的扫描与读入。2)按钮按下时振铃三秒并显示床号。3)护士响应管灭铃停。经过再三考虑采用静态LED显示比动态LED显示更容易实现上述三种功能,其好处在于单片机将字符段码送出后不需像动态显示那样对LED进行反复扫描就可以锁存显示值,直到下一次再送值时才可改变原值,这样在此期间单片机可抽出空去执行其它任务。因此这需采用单片机串行通信,本设计将串口设置为方式0,外接74LS164移位寄存器构成显示器接口电路,LED采用共阳极。振铃通过使P1.0输出一定频率的方波利用驱动电路驱动扬声器发声,本设计方波频率为1/20ms=50HZ。为实现响铃三秒,采用定时器产生中断控制三秒到时,将关定
3、时器并使P1.0输出低电平使扬声器停止发声。驱动电路利用三极管将方波信号放大即可。当护士响应请求时本设计采用外部中断0实现,护士按下按钮时产生中断,在中断服务程序中将关定时器并使P1.0输出低电平使扬声器停止发声同时将LED熄灭。此设计报告包括:概述、系统总体方案及硬件设计、软件设计、Proteus软件仿真、心得体会及参考文献六部分组成。设计任务中含有原程序代码,Proteus环境下的系统电路图,流程图等部分,软件及硬件电路设计正确性在Proteus界面下仿真来检验正误。目录1.概述41.1 病房呼叫系统应用价值:41.2 病房呼叫系统的主要功能及本人所作工作:52.系统总体方案及硬件设计52
4、.1 设计基本要求:52.2 系统总体方案:62.3 硬件电路73.软件设计113.1 软件流程图113.2程序说明114. Proteus软件仿真154.1仿真步骤及运行效果图:155课程设计体会18参考文献:19附1:源程序代码20附2:系统原理图231.概述1.1 病房呼叫系统应用价值:病房呼叫系统主要是指当呼叫源有呼叫信号时,在系统上有相应的声、光呼叫信号指示,并能显示出呼叫号码。此系统主要由89C51单片机,64个按键,2个数码管,1个喇叭组成。每个病人要呼叫可以按键,同时会有喇叭响,数码管显示不同床位号,相应的指示灯亮病房呼叫系统是病人请求值班医生或护士进行诊断或护理的紧急呼叫工具
5、,它主要用于协助医院病员在病床上方便地呼叫医务人员,可将病人的请求快速传送给值班医生或护士,是提高医院和病房护理水平的必备设备之一。医院的竞争越来越激烈,商业医院的生存是第一位的,提升档次和服务质量迫在眉睫,陪护问题一直是医患矛盾的主体,也是长期困扰卫生系统服务质量的大问题,使用病房呼叫系统,方便病人更快找到医生,以节约病人的宝贵时间。因此该系统具有很大的应用前景和广阔的市场发展空间。1.2 病房呼叫系统的主要功能及本人所作工作:1) 可容纳64张床位的病房呼叫系统。此功能通过设置64个按钮组成一键盘电路对病人的呼叫信息读入。2) 每个床位都有一个按钮,当患者需要呼叫护士时,按下按钮。此时护士
6、值班室内的呼叫系统板上显示该患者的床位号,并振铃3秒。此功能通过单片机反复对键盘电路扫描,检测到有键按下时立即将床号读入送LED显示,并启动定时器利用中断振铃3秒。3) 当护士按下“响应”键时,取消当前呼叫。此功能通过外部中断使管灭铃停。2.系统总体方案及硬件设计2.1 设计基本要求:1)设计一个可容64张床位的病房呼叫系统。2)要求每个床位都有一个按钮,当患者需要呼叫护士时,按下按钮。此时护士值班室内的呼叫系统板上显示该患者的床位号,并振铃3秒。3) 当护士按下“响应”键时,取消当前呼叫。 2.2 系统总体方案: 对于该设计我有两套实现方案,这两套方案主要根据键值显示方式的不同而划分的: 方
7、案一、采用静态LED显示。单片机上电运行进入键盘扫描主程序即通过循环判断键盘是否有键按下,一旦有键按下,立即调用键值读入子程序主要是通过以列为单位逐行扫描按钮,后经简单加法运算得出键值。该键值被单片机读入后立即通过串行口采用静态LED显示,接着单片机启动定时器后返回主程序即进入判断是否有键按下的循环。此时定时器正在计时,预先设计10ms中断一次,在中断服务程序中将P1.0取反使扬声器发声并判断3s是否到,若到则关定时器同时将P1.0清零使扬声器停止发声返回主程序,若不到3s再返回主程序。护士响应请求将键按下时,则产生外部中断,在中断服务程序中灭管停铃再返回主程序。方案二、 采用动态LED显示。
8、单片机上电运行进入动态显示主程序,此时显示缓冲区的显示码是灭灯显示码,该主程序通过循环反复显示缓冲区中的显示码,当有病人按下键呼叫护士时,则通过外部中断使单片机进入键值读入中断服务子程序,同时在此中断服务子程序中将键值送入显示缓冲区后,立即启动定时器并返回动态显示主程序。那么由于显示缓冲区内容的更新则即可将病人病床号显示出来。此时定时器正在计时,预先设计10ms中断一次,在中断服务程序中将P1.0取反使扬声器发声并判断3s是否到,若到则关定时器同时将P1.0清零使扬声器停止发声返回主程序,若不到3s再返回主程序。护士响应请求将键按下时,则产生外部中断,在中断服务程序中灭管停铃,再返回主程序。经
9、过再三考虑和反复对比,最后我认为方案一即静态LED显示方案更容易实现该系统。这主要是因为编写方案一的判断是否有键按下的主程序比编写方案二动态显示的主程序更容易些,但是方案一的显示硬件电路比方案二复杂一点即本设计要用到两个74LS164移位寄存器。可见软件的较易实现是以增加硬件电路为代价的。综上我采用方案一即静态LED显示方案来完成本设计任务。 2.3 硬件电路图2-1 硬件电路硬件电路描述如下:利用可编程并行接口芯片8255外扩I/O实现对矩阵式键盘的扫描与键值的读入,外部电源通过上拉电阻RESPACK接8255 PC口,PC口作为输入口构成键盘的行,8255的PA口作为输出口构成键盘的列,行
10、列之间通过按钮连接。利用74LS373锁存器将89C51的数据线和地址线(低8位)分离出来从而使89C51具有与一般CPU相类似的三总线。74LS164移位寄存器与共阳极LED构成静态显示电路。74LS164移位寄存器的时钟信号由89C51的TXD提供,显示数据由89C51的RXD串行输出到74LS164由其显示,由于串行发送数据时先发送数据的低位所以显示床号个位的74LS164移位寄存器的输入由显示床号十位的74LS164移位寄存器的最低位数据线提供。INT0接到按钮供护士响应病人请求灭管停铃之用。50HZ的方波从P1.0S输出,经简单的放大电路后驱动扬声器发声。硬件键盘电路工作原理:单片机
11、上电运行即进入判断键盘是否有键按下主程序,8255 PA口输出全0值,后读8255 PC口若其值全1则证明键盘无键按下,若其值不全为1则证明64个键中有一键按下。单片机随机键盘扫描子程序,本设计首先将第0列送0其它列送1,然后读8255 PC口通过对ACC各位的判断来识别键值。若第0列无键按下则转判下一列,最后返回。键值通过: 行首键号+列值=键值 计算得出。例如当单片机第5列即8255 PA.5口输出0时,读其PC口若ACC.3为0,则键值为24+5=29。其按键序号对应如下:0001020304050607080910111213141516171819202122232425262728
12、2930313233343536373839404142434445464748495051525354555657585960616263 图2-2 按键序号图 图2-3 键盘硬件电路图2-4 89C51的扩展三总线电路图2-5 静态LED显示电路图2-6 振铃电路3.软件设计 3.1 软件流程图单片机等待状态有键按下扫描键盘简单计算 :行首键号+列值=键值 键值处理送缓冲区利用串口静态显示初始化并启动定时器3.2程序说明1)判断是否有键按下源程序:KS1: MOV DPTR,#0FFFCH ;取A口地址 MOV A,#00H MOVX DPTR,A ;A口送全0 INC DPL INC D
13、PL ;取C口地址 MOVX A,DPTR ;读C口 CPL A ;C口值取反 程序返回通过JNZ LK2指令若有键按下则跳到LK2执行键盘扫描程序,检测哪一个键按下。 2)键盘扫描源程序:LK2: MOV R2,#0FEH ;从第0列扫描 MOV R4,#00H ;列值计数器清零 LK4:MOV DPTR,#0FFFCH ;取A口地址 MOV A,R2 MOVX DPTR,A ;开始扫描第0列 INC DPL INC DPL ;取C口地址 MOVX A,DPTR ;读C口 JB ACC.0 ,L1 ;第0行无键按下转第1行 MOV A,#00H ;第0行有键按下取行首键值 LJMP LKP
14、;转识别键值 L1:JB ACC.1, L2 ;第1行无键按下转第2行 MOV A,#08H ;第1行有键按下取行首键值 LJMP LKP ;转识别键值 L2:JB ACC.2, L3 ;第2行无键按下转第3行 MOV A,#16 ;第2行有键按下取行首键值 LJMP LKP ;转识别键值 L3:JB ACC.3,L4 ;第3行无键按下转第4行 MOV A,#24 ;第3行有键按下取行首键值 LJMP LKP ;转识别键值 L4:JB ACC.4 ,L5 ;第4行无键按下转第5行 MOV A,#32 ;第4行有键按下取行首键值 LJMP LKP ;转识别键值 L5:JB ACC.5 ,L6 ;
15、第5行无键按下转第6行 MOV A,#40 ;第5行有键按下取行首键值 LJMP LKP ;转识别键值 L6:JB ACC.6 ,L7 ;第6行无键按下转第7行 MOV A,#48 ;第6行有键按下取行首键值 LJMP LKP ;转识别键值 L7:JB ACC.7, NEXT; ;第7行无键按下转下一列 MOV A,#56 ;第7行有键按下取行首键值LKP:ADD A,R4 ;行首键号+列值=键值 PUSH ACC ;键值进栈保存3)键值显示源程序:L8: MOV 40H,A ;键值保存 MOV B,#0AH ;10送B DIV AB ;键值拆分 MOV 50H,A ;键值十位送内存显示缓冲区
16、50H MOV 51H,B ;键值个位送内存显示缓冲区51H SETB RS0 ;保存第0组工作寄存器 MOV R2,#02 ;显示位数计数 MOV R0,#51H ;取个位显示缓冲区地址DL0:MOV A,R0 ;键值个位送A MOV DPTR,#TAB ;取显示数码表首地址 MOVC A,A+DPTR ;得显示码 MOV SBUF,A ;送显个位DL1:JNB TI,DL1 ;等待发送完一帧 CLR TI ;清发送中断标志 DEC R0 ;指向下一显示单元 DJNZ R2,DL0 ;2位未显示完重复CLR RS0 ;显示完后恢复第0组寄存器4) 定时器1中断源程序:INT1:MOV TH1
17、,#0D8H ;定时器1送初值10MS中断一次 MOV TL1,#0F0H DJNZ 52H,TT1 ;1S到否? MOV 52H,#100 ;1S到重新赋秒计数值 DJNZ 53H,TT1 ;3秒到否? LJMP TT2 ;3S到转TT2TT1:CPL P1.0 ;输出取反 RETI ;中断返回TT2: CLR TR1 ;关定时器 CLR P1.0 ;输出低电平RETI ;中断返回5) 外部中断0源程序INT0: CLR TR1 ;关定时器 CLR P1.0 ;输出低电平MOV SCON, #00H ;串口工作方式0 MOV SBUF, #0FFH ;灭LEDDL2:JNB TI,DL2 C
18、LR TI MOV SBUF, #0FFHDL3:JNB TI,DL3 CLR TI ;清发送中断标志RETI ;中断返回6)延时源程序DELAY: MOV R7, #3DL4: MOV R6,#20DL5: MOV R5,#250DL6: DJNZ R5,DL6 DJNZ R6,DL5 DJNZ R7,DL4 RET4. Proteus软件仿真4.1仿真步骤及运行效果图:1)建立程序文件,保存程序文件,后缀名为ASM2)用WAVE软件进行编译。具体步骤是先建立好程序文件项目,设定好仿真器。在仿真器语言栏选择伟福汇编器,在目标文件栏选择生成BIN文件和生成HEX文件。在仿真器栏选择仿真器G6W
19、,仿真头选择POD-51,CPU选择80C31。选择好以后单击工具栏上的编译工具,这时回生成目标文件HEX和BIN。3)利用PROTEUS进行仿真。将上一步生成的HEX文件下载到80C51单片机上。点击开始按钮进行预定功能的仿真。运行效果见下图: 图4-1 病床62号呼叫 图4-2 护士响应呼叫图4-3 病床58号呼叫5课程设计体会 通过此次设计,我进一步加深了对单片机的理解,使我的编程思想更趋于成熟,编程思路更加开阔,比如当选定病房呼叫系统课题时我发现是64张床位,由于这么多的床位得占用大量的I/O线,这给我的第一直觉就是得采用静态显示因为它只需用到RXD和TXD两个端口即可完成显示任务。若
20、采用动态显示光显示就得占用16个口线,可见比静态显示多用14个口线。但又一想到若用8255扩展I/O口,则口线已不成为问题于是我又思索怎样用动态显示实现该任务,最终我想出了完成该设计的两套设计方案,该两套方案已在2.2 系统总体方案中给以论述。编完程序编译时系统提示有一指令跳转出范围如 JNZ LK3此时我想到将以LK3为标号的程序在不影响原程序的情况下向 JNZ LK3移近些,或在这两者之间再设置一跳转分两次跳到以LK3为标号的程序。画完硬件电路图后我将编译好的程序载入单片机后我屏住呼吸怀着激动的心情按下了运行键,然而我并没看到我期望看到的结果,心情很是失落。于是我开始认真排查错误,我发现:
21、1)后面几行以行为单位的键值显示有重复。2)两个LED只有十位能显示而个位刚上电时亮待有键按下时熄灭。3)有键按下时扬声器并不发声。4)护士按钮不能使外部中断起作用。5)键盘有键按下时键盘扫描动作迟缓。对第5个问题我首先想到可能是我的延时程序延时时间太长,于是我将延时时间变短些,果真不出所料单片机对键盘的扫描迅速了。但是其它四个问题还是老样子。对第4个问题当我反复按护士按钮时发现单片机的INT0引脚始终是高电平不变。此时我顿然想到可能时上拉电阻阻值过大使开关失去了作用,于是我将电阻值改小点,成功的给INT0引脚送入低电平,令我兴奋的是外部中断居然起作用了,它可以将亮的那个LED熄灭。对第1个问
22、题我对照 图2-1 按键序号图发现显示重复原来是正常现象因为键值的十位都有十个数是一样的。对第2个问题,显示床号个位的74LS164移位寄存器的输入由显示床号十位的74LS164移位寄存器的最低位数据线提供,我将该最低位数据线不通向LED时,居然发现显示床号个位的LED也能正常工作,但是显示床号十位的LED显示就出现了残缺。此问题我最终通过给显示床号十位的74LS164移位寄存器的最低位数据线接上电阻后再输入到显示床号个位的74LS164移位寄存器得以解决。对第3个问题是扬声器驱动电路没有起作用,我用一个三极管加一个电阻将此问题解决。当听到我做的系统发出定时3S的声音时,我激动不已,心想我成功
23、的将该课题完成了。然而好事多磨,又一个拦路虎出现了,我发现我做的键盘第1、3、5、列按键待第二次有键按下时自动锁死不起作用了,我知道我的主程序有问题,最后经过认真排查我发现我将MOV A,#00H写成了MOV A,00H ,MOV A,00H可能将00H单元的不确定数送给A显然会引起错误。将MOV A,00H改为MOV A,#00H后至此我的课程设计已完满完成。在我解决以上问题的过程中,我提高了理论分析水平,更提高了我的心理承受能力,这是我受益非浅,更坚定了我学好后续课程的信心。 参考文献:1余发山主编单片机原理及其应用技术徐州:中国矿业大学出版社, 20032杨凌霄主编微型计算机原理及应用徐
24、州:中国矿业大学出版社,2004附1:源程序代码ORG 0000HLJMP MAINORG 0003HLJMP INT0ORG 001BHLJMP INT1ORG 0100HMAIN: SETB EA SETB EX0 SETB ET1 MOV SCON, #00H MOV DPTR,#0FFFFFH MOV A,#89H MOVX DPTR,AKEY: ACALL KS1 JNZ LK1NI: ACALL DELAY AJMP KEYLK1: ACALL DELAY ACALL DELAY ACALL KS1 JNZ LK2 AJMP NI LK2: MOV R2,#0FEH MOV R4,
25、#00H LK4:MOV DPTR,#0FFFCH MOV A,R2 MOVX DPTR,A INC DPL INC DPL MOVX A,DPTR JB ACC.0 ,L1 MOV A,#00H LJMP LKP L1:JB ACC.1, L2 MOV A,#08H LJMP LKP L2:JB ACC.2, L3 MOV A,#16 LJMP LKP L3:JB ACC.3 ,L4 MOV A,#24 LJMP LKP L4:JB ACC.4 ,L5 MOV A,#32 LJMP LKP L5:JB ACC.5 ,L6 MOV A,#40 LJMP LKP L6:JB ACC.6 ,L7
26、MOV A,#48 LJMP LKP L7:JB ACC.7, NEXT MOV A,#56 LKP:ADD A,R4 PUSH ACC LK3:ACALL DELAY ACALL KS1 JNZ LK3 POP ACC LJMP L8NEXT:INC R4 MOV A,R2 JNB ACC.7,KND RL A MOV R2,A AJMP LK4KND:AJMP KEYKS1: MOV DPTR,#0FFFCH MOV A,#00H MOVX DPTR,A INC DPL INC DPL MOVX A,DPTR CPL A RETL8: MOV 40H,A MOV B,#0AH DIV AB
27、 MOV 50H,A MOV 51H,B SETB RS0 MOV R2,#02 MOV R0,#51HDL0:MOV A,R0 MOV DPTR,#TAB MOVC A,A+DPTR MOV SBUF,ADL1:JNB TI,DL1 CLR TI DEC R0 DJNZ R2,DL0 CLR RS0 MOV TMOD,#10H MOV TH1,#0D8H MOV TL1,#0F0H SETB EA SETB ET1 SETB TR1 MOV 52H,#100 MOV 53H,#3 LJMP MAININT1:MOV TH1,#0D8H MOV TL1,#0F0H DJNZ 52H,TT1 M
28、OV 52H,#100 DJNZ 53H,TT1 LJMP TT2TT1:CPL P1.0 RETITT2: CLR TR1 CLR P1.0 RETIINT0: CLR TR1 CLR P1.0MOV SCON, #00H MOV SBUF, #0FFHDL2:JNB TI,DL2 CLR TI MOV SBUF, #0FFHDL3:JNB TI,DL3 CLR TI RETITAB: DB 0C0H,0F9H,0A4H,0B0H,99H; DB 92H,82H,0F8H,80H,90H;DELAY: MOV R7, #3DL4: MOV R6,#20DL5: MOV R5,#250DL6: DJNZ R5,DL6 DJNZ R6,DL5 DJNZ R7,DL4 RETEND附2:系统原理图图附2-1 系统原理图 图附2-1 系统原理图