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

tech2022-11-25  89

基于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,表示初始状态 } } } 至于具体的实验过程以及我个人的参考报告,测试视频,可以私聊我,仅供学习,谢谢。
最新回复(0)