基于51单片机的病房呼叫系统

基于51单片机的病房呼叫系统

  声明:本系统仅仅是模拟基础功能,包括矩阵按键模块,数码管模块,蜂鸣器模块,独立按键模块,仅供学习使用。
  首先,考虑到51单片机开发板的矩阵按键只有4*4=16个,数码管显示对应的IO口,利用三个数码管就可以完成显示模块的功能,可以利用138译码器来驱动数码管,其中一个数码管作为初始状态代表没有病人呼叫,第二个数码管作为显示病房号的个位数字,另外一个作为十位数字。运用矩阵按键的扫描,得到对应的病房号,驱动蜂鸣器的振铃以及数码管的显示。护士看到求助信息,按下独立按键来响应请求,数码管恢复初始状态,蜂鸣器停止工作,回归常态,完成呼叫系统的整体功能。
  整机代码:
#include "reg52.h"		//头文件
typedef unsigned char u8;
typedef unsigned int u16;

sbit beep=P1^5;	 //蜂鸣器对应的IO口
sbit LSA=P2^2;	 //138译码器A口输入
sbit LSB=P2^3;	 //138译码器B口输入
sbit LSC=P2^4;	 //138译码器C口输入
sbit K1=P3^1;	 //独立按键K1,用于模拟护士的“响应”操作

#define GPIO_KEY P1	 //定义P1口,用于矩阵按键扫描
#define GPIO_DIG P0	 //定义P0口,用于数码管显示

u8 KeyValue;		 //全局变量病房号

u8 code smg[]={
    
    0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};   //数码管0-9的数字显示

void delay(u16 i)	 //延时子程序
{
    
    
   	while(i--);
}
void KeyDown()		//矩阵按键扫描子程序
{
    
    
    /* 由于开发板的矩阵按键是4*4,按键扫描先是列扫描,设置为每一列的第一行,然后再行扫描,如果是第一行就保持原值,若是第2行,与第1行相差4
	,则在原值的基础上再加4,得到最终结果,依次类推第3、4行    */
    u8 a=0;
   	GPIO_KEY=0x0f;	   	//高4位置0,低4位置1,进行列扫描
	if(GPIO_KEY!=0x0f)	  //有按键按下
	{
    
    
	  delay(1000);		  //消除按键抖动
      if(GPIO_KEY!=0x0f)   //再次检测是否有按键按下
	  {
    
    
	    GPIO_KEY=0x0f;	  //高4位置0,低4位置1,列扫描
		switch(GPIO_KEY)
		{
    
    
		  case(0x07):KeyValue=1;break;	//检测到第1列有按键按下,令KeyValue=1
		  case(0x0b):KeyValue=2;break;	//检测到第2列有按键按下,令KeyValue=2
		  case(0x0d):KeyValue=3;break;	//检测到第3列有按键按下,令KeyValue=3
		  case(0x0e):KeyValue=4;break;	//检测到第4列有按键按下,令KeyValue=4	  
		}
	   GPIO_KEY=0xf0;	   //高4位置1,低4位置0,行扫描
	   switch(GPIO_KEY)			 
		{
    
    
		
		  case(0x70):KeyValue=KeyValue;break;	  //检测到第1行有按键按下,则令KeyValue=KeyValue
		  case(0xb0):KeyValue=KeyValue+4;break;	  //检测到第2行有按键按下,则令KeyValue=KeyValue+4
		  case(0xd0):KeyValue=KeyValue+8;break;	  //检测到第3行有按键按下,则令KeyValue=KeyValue+8
		  case(0xe0):KeyValue=KeyValue+12;break;  //检测到第4行有按键按下,则令KeyValue=KeyValue+12		  
		}
		while((a<50)&&(GPIO_KEY!=0xf0))	 //按键消抖
		{
    
    
		  delay(1000);
		  a++;
		}
	  }
	}
}

void main()
{
    
    
     
     while(1)	  //死循环,令系统一直工作
	   {
    
    		
	     KeyDown();	   //调用矩阵按键扫描子程序
		
		 if((KeyValue>0)&&(KeyValue<10))	//扫描得到的结果小于10时
		 {
    
    
		   LSA=0;
	       LSB=0;
	       LSC=0;	   //输入138译码器,选中/Y0,第一个数码管(个位)
		   GPIO_DIG=smg[KeyValue];	 //显示数值,即病房号
		   delay(1000);				 //延时
		   beep=~beep;				 
		   delay(100);		  		 //给蜂鸣器一个脉冲,使其工作,进行呼叫
		 }
		  
		if((KeyValue>=10))		//扫描得到的结果大于等于10时
		{
    
    
		   LSA=0;		//数码管动态显示结果
	       LSB=0;
	       LSC=0;	   //输入138译码器,选中/Y0,第一个数码管(个位)
		   GPIO_DIG=smg[KeyValue%10];  //得到结果与10相除,取余数,即个位数
		   delay(100);
		   GPIO_DIG=0x00;	 //消除残影

		   LSA=1;
	       LSB=0;
	       LSC=0;		  //输入138译码器,选中/Y1,第二个数码管(十位)
		   GPIO_DIG=smg[KeyValue/10];	 //得到结果与10相除,取商,即十位数
		   delay(100);
		   GPIO_DIG=0x00;	   //消除残影

		   delay(1000);
		   beep=~beep;
		   delay(100);		   //给蜂鸣器一个脉冲,使其工作,进行呼叫
		}
		 if(K1==0)			   //独立按键K1按下,即护士"响应"
		{
    
    
	       delay(1000);		   //消除按键抖动
		   if(K1==0)
		   {
    
    
		     KeyValue=0;		//确定K1按下,护士“响应“,使数码管显示数值置零,恢复初始状态    
		   }
		   while(!K1);			//按键松开,进行系统重置操作
		   LSA=1;				//恢复开始状态
	       LSB=1;
	       LSC=1;
		   GPIO_DIG=smg[KeyValue];	 //选中最后一个数码管置0,表示初始状态
	    }				  
	   }
}

 至于具体的实验过程以及我个人的参考报告,测试视频,可以私聊我,仅供学习,谢谢。

猜你喜欢

转载自blog.csdn.net/weixin_43789635/article/details/108378518