1、模拟病房呼叫系统一、设计目的通过设计模拟病床呼叫的程序,更加熟练掌握单片机C语言指令的使用,培养用单片机来实现一些电子设备运行的逻辑思路,为以后更好的使用单片机打下基础。二、设计要求模拟一个护理站下管8个床位,哪个病人要呼叫可以按键,相应蜂鸣器响,数码管显示:呼叫数量_床位号.要求:16个数码管,正常情况下显示时间(时分秒),时间可通过按键调整。2有人呼叫则闪烁显示数量_床位号并蜂鸣器响,按应答键后继续显示时间。3若同时有多个病人呼叫则依次轮流显示:数量_床位号。4、要求做出实物。注:本机地址为01H,当接到上位机发的01H时,则回发01H三、设计原理当单片机一上电时,数码管显示时,分,秒。并
2、且可通过按键对时,分的调节。调节按键主要运用外部中断程序,其中时钟的显示是通过TO定时器定时1s和数码管显示电路主要运用动态扫描的方式以实现的。此设计主要运用键盘扫描电路来设计病床号。当有按键按下时数码管由当前的显示时,分,秒,变为显示当前呼叫数量和呼叫床号,并且呼叫床号按呼叫顺序循环显示,程序中运用数组作为按键缓冲区,先存储按键键值然后实现动态显示。当按下复位键后重新显示时,分,秒。并且清空按键缓冲区。四、硬件电路设计4.1 系统结构框图图3-1系统框图4.2 STC89C52单片机芯片 89C52共有四个八位的并行双向口,即有32根输入输出口线。各口的每一位均由锁存器、输出驱动器和输入缓冲
3、器组成。 图4-2 STC89C52集成芯片VCC(40引脚):电源电压VSS(20引脚):接地P0端口(P0.0P0.7,3932引脚):P0口是一个漏极开路的8位双向I/O口。作为输出端口,每个引脚能驱动8个TTL负载,对端口P0写入“1”时,可以作为高阻抗输入。在访问外部程序和数据存储器时,P0口也可以提供低8位地址和8位数据的复用总线。此时,P0口内部上拉电阻有效。在Flash ROM编程时,P0端口接收指令字节;而在校验程序时,则输出指令字节。验证时,要求外接上拉电阻。P1端口(P1.0P1.7,18引脚):P1口是一个带内部上拉电阻的8位双向I/O口。P1的输出缓冲器可驱动(吸收或
4、者输出电流方式)4个TTL输入。对端口写入1时,通过内部的上拉电阻把端口拉到高电位,这是可用作输入口。P1口作输入口使用时,因为有内部上拉电阻,那些被外部拉低的引脚会输出一个电流。P1口特点是输出锁存器,输出时没有条件。输入缓冲,输入时有条件,即需要先将该口设为输入状态,先输出1。 此外,P1.0和P1.1还可以作为定时器/计数器2的外部技术输入(P1.0/T2)和定时器/计数器2的触发输入(P1.1/T2EX)P3口为准双向口。可以字节访问,也可以位访问。P3.0-RXD,串行输入口。P3.1-TXD,串行输出口。P3.2-INT0,外部中断0的请求。P3.3-INT1,外部中断1的请求。P
5、3.4-T0,定时器/计数器0外部计数脉冲。P3.5-T1,定时器/计数器,1外部计数脉冲。P3.6-WR,外部数据存储器写选通。P3.7-RD,外部数据存储器读选通。RST(9引脚):复位输入。当输入连续两个机器周期以上高电平时为有效,用来完成单片机单片机的复位初始化操作。ALE(30引脚):地址锁存控制信号(ALE)是访问外部程序存储器时,锁存低8位地址的输出脉冲。XTAL1(19引脚):振荡器反相放大器和内部时钟发生电路的输入端。XTAL2(18引脚):振荡器反相放大器的输入端。STC89C52引脚图如图3-2所示。4.2 键盘扫描电路图3-4 按键扫描电路在病床呼叫系统中,我们采用了矩
6、阵键盘扫描的方式。按键设置在行、列线交点上,行、列线分别连接到按键开关的两端。首先将列至零,主程序中扫描P1是否有键按下,如果有键按下执行子程序,先将列至零,扫描行然后置位行扫描列。本实验中,采用的是共阴极数码管,通过两个锁存器来控制数码管的点亮,一个控制位码,控制那个数码管亮;一个控制段码,控制数码管亮什么。 4.4 数码管显示电路图3-3 数码管显示电路数码管是通过锁存器573输出的。驱动573需要上拉电阻。通过P0口控制他的片选,以及数码管的位选,通过P2口控制数码管的段选,主程序中通过动态扫描以实现数码管的动态输出。4.5 报警电路图3-5 报警电路单片机的IO口驱动能力足以让蜂鸣器发
7、出声音,所以使IO口输出的电压通过1K的电阻转化为电流使蜂鸣器发出声响。4.6 系统电路原理图图3-6 系统电路原理图所用器件如下如所示:数码管:7SEG-COM-CATHODE锁存器:74HC573单片机:AT89S52按键:BUTTON蜂鸣器:BUZZER电容:CAP电阻:RES上拉电阻:RESPACK-8五、程序流程图设计5.1 主流程图 图5-1 主流程图 5.2 键盘扫描子程序流程图图5-2 系统显示程序流程图六、实验结果图仿真时间图如6-1图所示:6-1 仿真时间图有呼叫时仿真图所示:6-2 仿真呼叫图 6-3 仿真呼叫图6-4 仿真呼叫图七、程序设计#include#define
8、 uchar unsigned char#define uint unsigned intuchar code DSY_CODE=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0xc6,0xa1,0x86,0x8e,0x00;uchar d8=0,0,0,0,0,0,0,0; uchar Pre_KeyNo=8,KeyNo=8;uchar g=0,t=0,CEN=0;uchar HOUR=0,min=0,SECON=0;sbit LB=P36;sbit FW=P37;void DelayMS(uint x)uchar i
9、;while(x-)for(i=0;i40x0f;switch(Tmp) case 1: KeyNo+=0;break;case 2: KeyNo+=4;void main()TMOD=0x00; TH0=(8192-4000)/32; TL0=(8192-4000)%32;IE=0x87;PX1=1;IT0=1;IT1=1;TR0=1; P2=0x00;P1=0xf0;LB=0;while(1)if(g=0)P0=0xC1;P2=DSY_CODEHOUR/10;DelayMS(1);P0=0xC2;P2=DSY_CODEHOUR%10;DelayMS(1);P0=0xC4;P2=DSY_CO
10、DEmin/10;DelayMS(1);P0=0xC8;P2=DSY_CODEmin%10;DelayMS(1);P0=0xD0;P2=DSY_CODESECON/10;DelayMS(1);P0=0xE0;P2=DSY_CODESECON%10;DelayMS(1);elseDelayMS(1);P0=0xC2;P2=dCEN;DelayMS(1);P0=0xC1;P2=DSY_CODEg;DelayMS(1);if(FW=0)g=0;LB=0;CEN=0;d0=0;d1=0;d2=0;d3=0;d4=0;d5=0;d6=0;d7=0;P1=0xf0;if(P1!=0xf0)Keys_Sca
11、n(); if(Pre_KeyNo!=KeyNo) +g; if(g=9)g=0; switch(g) case 1: d0=DSY_CODEKeyNo;break; case 2: d1=DSY_CODEKeyNo;break; case 3: d2=DSY_CODEKeyNo;break; case 4: d3=DSY_CODEKeyNo;break; case 5: d4=DSY_CODEKeyNo;break; case 6: d5=DSY_CODEKeyNo;break; case 7: d6=DSY_CODEKeyNo;break; case 8: d7=DSY_CODEKeyNo
12、;break; default:KeyNo=8; KeyNo=8; LB=1;void Timer0() interrupt 1 TH0=(8192-4000)/32; /恢复初值TL0=(8192-4000)%32;if(dCEN=0)CEN=0;if(+t!=250) return; t=0;CEN+;if(CEN=8)CEN=0;SECON+;if(SECON=60) SECON=0; min+; if(min=60) min=0; HOUR+; if(HOUR=24)HOUR=0; void EX_INT0() interrupt 0 min+; if(min=60)min=0;void EX_INT1() interrupt 2 HOUR+; if(HOUR=24)HOUR=0;八、设计总结这次的程序设计使我懂得了动态扫描,第一次的C语言程序设计,让我懂得了关于汇编语言与C语言的联系。比如汇编语言的查表指令在C语言中可以用数组的形式实现。在编程过程中同样和其他同学一样也遇到了很多问题,比如在中断那忽略了interrupt 0中的0,后来查资料才知道这不是随便写的。这次课程设计通过我们小组的努力终于顺利完成了,在设计中遇到了很多编程问题,最后在老师的辛勤指导下,终于迎刃而解,在此我表示感谢!同时,对给过我帮助的所有同学和各位指导老师再次表示忠心的感谢!九、参考文献1 高