基于51单片机的病房呼叫系统
声明:本系统仅仅是模拟基础功能,包括矩阵按键模块,数码管模块,蜂鸣器模块,独立按键模块,仅供学习使用。
首先,考虑到51单片机开发板的矩阵按键只有4*4=16个,数码管显示对应的IO口,利用三个数码管就可以完成显示模块的功能,可以利用138译码器来驱动数码管,其中一个数码管作为初始状态代表没有病人呼叫,第二个数码管作为显示病房号的个位数字,另外一个作为十位数字。运用矩阵按键的扫描,得到对应的病房号,驱动蜂鸣器的振铃以及数码管的显示。护士看到求助信息,按下独立按键来响应请求,数码管恢复初始状态,蜂鸣器停止工作,回归常态,完成呼叫系统的整体功能。
整机代码:
#include "reg52.h"
typedef unsigned char u8
;
typedef unsigned int u16
;
sbit beep
=P1
^5;
sbit LSA
=P2
^2;
sbit LSB
=P2
^3;
sbit LSC
=P2
^4;
sbit K1
=P3
^1;
#define GPIO_KEY P1
#define GPIO_DIG P0
u8 KeyValue
;
u8 code smg
[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
void delay(u16 i
)
{
while(i
--);
}
void KeyDown()
{
u8 a
=0;
GPIO_KEY
=0x0f;
if(GPIO_KEY
!=0x0f)
{
delay(1000);
if(GPIO_KEY
!=0x0f)
{
GPIO_KEY
=0x0f;
switch(GPIO_KEY
)
{
case(0x07):KeyValue
=1;break;
case(0x0b):KeyValue
=2;break;
case(0x0d):KeyValue
=3;break;
case(0x0e):KeyValue
=4;break;
}
GPIO_KEY
=0xf0;
switch(GPIO_KEY
)
{
case(0x70):KeyValue
=KeyValue
;break;
case(0xb0):KeyValue
=KeyValue
+4;break;
case(0xd0):KeyValue
=KeyValue
+8;break;
case(0xe0):KeyValue
=KeyValue
+12;break;
}
while((a
<50)&&(GPIO_KEY
!=0xf0))
{
delay(1000);
a
++;
}
}
}
}
void main()
{
while(1)
{
KeyDown();
if((KeyValue
>0)&&(KeyValue
<10))
{
LSA
=0;
LSB
=0;
LSC
=0;
GPIO_DIG
=smg
[KeyValue
];
delay(1000);
beep
=~beep
;
delay(100);
}
if((KeyValue
>=10))
{
LSA
=0;
LSB
=0;
LSC
=0;
GPIO_DIG
=smg
[KeyValue
%10];
delay(100);
GPIO_DIG
=0x00;
LSA
=1;
LSB
=0;
LSC
=0;
GPIO_DIG
=smg
[KeyValue
/10];
delay(100);
GPIO_DIG
=0x00;
delay(1000);
beep
=~beep
;
delay(100);
}
if(K1
==0)
{
delay(1000);
if(K1
==0)
{
KeyValue
=0;
}
while(!K1
);
LSA
=1;
LSB
=1;
LSC
=1;
GPIO_DIG
=smg
[KeyValue
];
}
}
}
至于具体的实验过程以及我个人的参考报告,测试视频,可以私聊我,仅供学习,谢谢。