概述
基于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,表示初始状态
}
}
}
至于具体的实验过程以及我个人的参考报告,测试视频,可以私聊我,仅供学习,谢谢。
最后
以上就是结实乐曲为你收集整理的基于51单片机的病房呼叫系统的全部内容,希望文章能够帮你解决基于51单片机的病房呼叫系统所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复