温馨提示:
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] 高