基于51单片机的病房呼叫器(12,数码管,矩阵键盘)原理图、流程图、物料清单、仿真图、源代码

请添加图片描述

课程设计 基于51单片机的病房呼叫器(12,数码管,矩阵键盘)原理图 PCB 仿真 源代码及proteus 软件

12路病房呼叫系统
设计功能简介:
假设有四个病房,每个病房有3个病床,设计具有12个呼叫器的远程病房呼叫系统,以实现病人与医护人员的远距离沟通。系统以AT89S51单片机为核心,呼叫器由3×4的矩阵键盘实现。当一位病人按下按键后,护士站的显示屏上会显示的病床号,指示灯亮,蜂鸣器一直响;直到有医护人员按下清除键后,取消当前呼叫,即指示灯灭、蜂鸣器关闭、显示屏清零。
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述

#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;
		} 
	}
}
//定时器中断
void Timer0() interrupt 1
{
	if(time<10)//0.5s
		time++;
	else
	{
		time=0;

	}
	TH0=0X3C;
	TL0=0XB0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cqtianxingkeji

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值