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