1062-基于51单片机的病房呼叫器(12,数码管,矩阵键盘)原理图、流程图、物料清单、仿真图、源代码
功能介绍:
12路病房呼叫系统
设计功能简介:
假设有四个病房,每个病房有3个病床,设计具有12个呼叫器的远程病房呼叫系统,以实现病人与医护人员的远距离沟通。系统以AT89S51单片机为核心,呼叫器由3×4的矩阵键盘实现。当一位病人按下按键后,护士站的显示屏上会显示的病床号,指示灯亮,蜂鸣器一直响;直到有医护人员按下清除键后,取消当前呼叫,即指示灯灭、蜂鸣器关闭、显示屏清零。
有哪些资料:
1、仿真工程文件
2、源代码工程文件
3、原理图工程文件
4、流程图
5、功能介绍
6、元件清单
#include "reg51.h"
#define uchar unsigned char
#define uint unsigned int
sbit A0=P1^0;//数码管
sbit A1=P1^1;
sbit A2=P1^2;
sbit beep=P1^6;//蜂鸣器
sbit led1=P3^0;//led
sbit led2=P3^1;
sbit led3=P3^2;
sbit led4=P3^3;
sbit led5=P3^4;
sbit led6=P3^5;
sbit led7=P3^6;
sbit led8=P3^7;
sbit led9=P1^3;
sbit led10=P1^4;
sbit led11=P1^5;
sbit led12=P1^7;
//数码管编码
uchar code smgduan[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
uchar time=0;//定时
uchar num=0;
//延时
void delay(uint i)
{
while(i--);
}
uchar key=0;
uchar key_scan()//按键检测
{
uchar i,j;
i=0;
j=0;
P2=0x0f;
if(P2!=0x0f) //检测有无按下
{
delay(1000);
if(P2!=0x0f) //检测有无按下
{
switch(P2)//检测行
{
case 0x0e:i=3;break;
case 0x0d:i=2;break;
case 0x0b:i=1;break;
case 0x07:i=0;
}
P2=0xf0;
switch(P2)//检测列
{
case 0xe0:j=1;break;
case 0xd0:j=5;break;
case 0xb0:j=9;break;
case 0x70:j=13;
}
}
}
if(key!=i+j)
{
key=i+j;
return key;
}
else
return 0;
}
//主函数
void main()
{
uchar i;
TMOD|=0X01;
TH0=0X3C;
TL0=0XB0;
ET0=1;//打开定时器0中断允许
EA=1;//打开总中断
TR0=1;//打开定时器
while(1)
{
i=key_scan();//按键检测
if((i>0)&&(i<13))
{
num=i;
}
if(i==13)//清零
{
num=0;
P3=0xff;
led12=1;
led11=1;
led10=1;
led9=1;
}
//显示
if(num==0)
{
P0=0xff;
A2=0;A1=0;A0=0;
P0=0xbf;
delay(50);
P0=0xff;
A2=0;A1=0;A0=1;
P0=0xbf;
delay(50);
beep=1;
}
else//显示号码
{
P0=0xff;
A2=0;A1=0;A0=1;
P0=smgduan[num/10];
delay(50);
P0=0xff;
A2=0;A1=0;A0=0;
P0=smgduan[num%10];
delay(50);
P0=0xff;
//点亮led
switch(num)
{
case 1:led1=0;break;
case 2:led2=0;break;
case 3:led3=0;break;
case 4:led4=0;break;
case 5:led5=0;break;
case 6:led6=0;break;
case 7:led7=0;break;
case 8:led8=0;break;
case 9:led9=0;break;
case 10:led10=0;break;
case 11:led11=0;break;
case 12:led12=0;
}
beep=0;
}
}
}