基于51单片机的病房呼叫器(64张床位呼叫报警器)原理图、流程图、物料清单、仿真图、源代码
基于51单片机的病房呼叫器(64)
设计一个可容64张床位的比那个房呼叫系统。
1、每个床位都有一个按钮,当患者需要呼叫护士时,按下按钮
2、护士值班室面板上显示呼叫床位号,并响铃3秒
3、当护士按下“响应”键时,取消呼叫
#include "reg51.h"
#include "lcd1602.h"
#define uchar unsigned char
#define uint unsigned int
sbit k1=P1^0;//按钮
sbit beep=P1^7;//蜂鸣器
uchar code smgduan[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uchar time=0,sec=0;
uchar xian1[]="Call num:00";//显示数组
uchar xian2[]="All:00";
uchar key=0,all=0;
//按键存储
uchar num[64]={0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0
};
void key_scan()//搜索按键
{
uchar i,j;
for(i=0;i<8;i++)//行
{
P3=~(1<<i);
for(j=0;j<8;j++)//列
{
if((P2&(1<<j))==0)
{
if(!num[i*8+j])
{
time=60;
num[i*8+j]=1;//记录呼叫
all++;
}
}
}
}
}
void search()//搜索下一个呼叫
{
uchar i;
for(i=0;i<64;i++)
{
if(num[i])
{
key=i+1;
break;
}
}
}
void main()
{
init_1602();
TMOD|=0X01;
TH0=0X3C;
TL0=0XB0;
ET0=1;//打开定时器0中断允许
EA=1;//打开总中断
TR0=1;//打开定时器
while(1)
{
key_scan();
search();
if(!k1) //清除呼叫
{
if(all>0)
{
all--;
num[key-1]=0;
}
while(!k1);
}
}
}
//定时器0中断
void Timer0() interrupt 1
{
if(time>0)
{
time--;
beep=0;//蜂鸣器响
}
else
{
beep=1;//蜂鸣器停
}
if(sec<10)//0.5s
sec++;
else
{
sec=0;
if(all==0)
{
write_string(1,2,"Welcome! ");
write_string(2,2," ");
}
else
{
xian1[9]=key/10+0x30; //显示
xian1[10]=key%10+0x30;
xian2[4]=all/10+0x30;
xian2[5]=all%10+0x30;
write_string(1,2,xian1);
write_string(2,5,xian2);
}
}
TH0=0X3C;
TL0=0XB0;
}