基于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];
}
}
}