分享
模拟病床呼叫.doc
下载文档

ID:100305

大小:186KB

页数:14页

格式:DOC

时间:2023-02-24

收藏 分享赚钱
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,汇文网负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。
网站客服:3074922707
模拟 病床 呼叫
模拟病房呼叫系统 一、设计目的 通过设计模拟病床呼叫的程序,更加熟练掌握单片机C语言指令的使用,培养用单片机来实现一些电子设备运行的逻辑思路,为以后更好的使用单片机打下基础。 二、设计要求 模拟一个护理站下管8个床位,哪个病人要呼叫可以按键,相应蜂鸣器响,数码管显示:呼叫数量_床位号.要求: 1.6个数码管,正常情况下显示时间(时分秒),时间可通过按键调整。 2.有人呼叫则闪烁显示数量_床位号并蜂鸣器响,按应答键后继续显示时间。 3.若同时有多个病人呼叫则依次轮流显示:数量_床位号。 4、要求做出实物。 注:本机地址为01H,当接到上位机发的01H时,则回发01H 三、设计原理 当单片机一上电时,数码管显示时,分,秒。并且可通过按键对时,分的调节。调节按键主要运用外部中断程序,其中时钟的显示是通过TO定时器定时1s和数码管显示电路主要运用动态扫描的方式以实现的。 此设计主要运用键盘扫描电路来设计病床号。当有按键按下时数码管由当前的显示时,分,秒,变为显示当前呼叫数量和呼叫床号,并且呼叫床号按呼叫顺序循环显示,程序中运用数组作为按键缓冲区,先存储按键键值然后实现动态显示。 当按下复位键后重新显示时,分,秒。并且清空按键缓冲区。 四、硬件电路设计 4.1 系统结构框图 图3-1 系统框图 4.2 STC89C52单片机芯片 89C52共有四个八位的并行双向口,即有32根输入输出口线。各口的每一位均由锁存器、输出驱动器和输入缓冲器组成。 图4-2 STC89C52集成芯片 VCC(40引脚):电源电压 VSS(20引脚):接地 P0端口(P0.0~P0.7,39~32引脚):P0口是一个漏极开路的8位双向I/O口。作为输出端口,每个引脚能驱动8个TTL负载,对端口P0写入“1”时,可以作为高阻抗输入。在访问外部程序和数据存储器时,P0口也可以提供低8位地址和8位数据的复用总线。此时,P0口内部上拉电阻有效。在Flash ROM编程时,P0端口接收指令字节;而在校验程序时,则输出指令字节。验证时,要求外接上拉电阻。 P1端口(P1.0~P1.7,1~8引脚):P1口是一个带内部上拉电阻的8位双向I/O口。P1的输出缓冲器可驱动(吸收或者输出电流方式)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的请求。 P3.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 按键扫描电路 在病床呼叫系统中,我们采用了矩阵键盘扫描的方式。按键设置在行、列线交点上,行、列线分别连接到按键开关的两端。首先将列至零,主程序中扫描P1是否有键按下,如果有键按下执行子程序,先将列至零,扫描行然后置位行扫描列。 本实验中,采用的是共阴极数码管,通过两个锁存器来控制数码管的点亮,一个控制位码,控制那个数码管亮;一个控制段码,控制数码管亮什么。 4.4 数码管显示电路 图3-3 数码管显示电路 数码管是通过锁存器573输出的。驱动573需要上拉电阻。通过P0口控制他的片选,以及数码管的位选,通过P2口控制数码管的段选,主程序中通过动态扫描以实现数码管的动态输出。 4.5 报警电路 图3-5 报警电路 单片机的IO口驱动能力足以让蜂鸣器发出声音,所以使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<reg51.h> #define uchar unsigned char #define uint unsigned int uchar code DSY_CODE[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f, 0x77,0x7c,0xc6,0xa1,0x86,0x8e,0x00}; uchar d[8]={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=P3^6; sbit FW=P3^7; void DelayMS(uint x) { uchar i; while(x--) { for(i=0;i<120;i++); } } void Keys_Scan() { uchar Tmp; P1=0x0f; DelayMS(70); Tmp=P1^0x0f; switch(Tmp) { case 1: KeyNo=0;break; case 2: KeyNo=1;break; case 4: KeyNo=2;break; case 8: KeyNo=3;break; default:KeyNo=8; } P1=0xf0; DelayMS(70); Tmp=P1>>4^0x0f; 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_CODE[HOUR/10]; DelayMS(1); P0=0xC2; P2=~DSY_CODE[HOUR%10]; DelayMS(1); P0=0xC4; P2=~DSY_CODE[min/10]; DelayMS(1); P0=0xC8; P2=~DSY_CODE[min%10]; DelayMS(1); P0=0xD0; P2=~DSY_CODE[SECON/10]; DelayMS(1); P0=0xE0; P2=~DSY_CODE[SECON%10]; DelayMS(1); } else { DelayMS(1); P0=0xC2; P2=d[CEN]; DelayMS(1); P0=0xC1; P2=~DSY_CODE[g]; DelayMS(1); } if(FW==0) { g=0; LB=0; CEN=0; d[0]=0; d[1]=0; d[2]=0; d[3]=0; d[4]=0; d[5]=0; d[6]=0; d[7]=0; } P1=0xf0; if(P1!=0xf0)Keys_Scan(); if(Pre_KeyNo!=KeyNo) { ++g; if(g==9)g=0; switch(g) { case 1: d[0]=~DSY_CODE[KeyNo];break; case 2: d[1]=~DSY_CODE[KeyNo];break; case 3: d[2]=~DSY_CODE[KeyNo];break; case 4: d[3]=~DSY_CODE[KeyNo];break; case 5: d[4]=~DSY_CODE[KeyNo];break; case 6: d[5]=~DSY_CODE[KeyNo];break; case 7: d[6]=~DSY_CODE[KeyNo];break; case 8: d[7]=~DSY_CODE[KeyNo];break; default:KeyNo=8; } KeyNo=8; LB=1; } } } void Timer0() interrupt 1 { TH0=(8192-4000)/32; //恢复初值 TL0=(8192-4000)%32; if(d[CEN]==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] 高

此文档下载收益归作者所有

下载文档
你可能关注的文档
收起
展开