多位开关病床呼叫器

医院住院病人呼叫器的设计
基本功能:
设计一个5床位的无线呼叫器,供医院住院病人(或静脉点滴病人)呼叫医护人员使用。病人可通过按动自己床边的按钮(即开关),向医护人员发出呼叫信号。
准备阶段,6只数码管循环轮流显示b(跑马),当按下中断键,启动系统开始工作,4个数码管闪烁显示“START”,以拨动开关K1~K5作为5个病床申请源,开关拨成ON的为产生呼叫请求,在对应的开关位数码管上闪烁显示开关病床号 (定时)。
扩展功能:
1)如有多个病员请求,则分别循环显示病床号,每个病员号显示5S,当某位拨为OFF时,则对应位停止显示和停止鸣笛,当所有开关拨为OFF,显示‘End’(*5S),中断返回跑马。
2)除完成上述功能以外,喇叭还发出“嘟”的叫声,叫声数次等于每个病床号的号数。
创新设计:自行发挥

题目分析可知道单个开关关闭有5种情况

两个开关关闭有10种情况

三个开关关闭也有10种情况

四个关闭5种

全部关闭1种

硬件总体电路设计如下Proteus截图如下

蜂鸣器电路设计:

因为单片机IO口的驱动能力有限所以加PNP管增加驱动能力使蜂鸣器能发声。当IO口输出低电平三极管被导通,VCC接到蜂鸣器。蜂鸣器配置如下图

开关获取代码:

因为有多种闭合情况

unsigned char Key()//°´¼üÏû¶¶ºÍËÉÊÖ¼ì²â
{
	int KeyNumber=0;
	
	if(P0_0==0){KeyNumber=1;}//»ñÈ¡°´¼üÖµ
	if(P0_1==0){KeyNumber=2;}
	if(P0_2==0){KeyNumber=3;}
	if(P0_3==0){KeyNumber=4;}//»ñÈ¡°´¼üÖµ
	if(P0_4==0){KeyNumber=5;}
	
	if(P3_3==0){KeyNumber=6;}
	
	if(P0_4==0&&P0_0==0){KeyNumber=7;}
	if(P0_4==0&&P0_1==0){KeyNumber=8;}
	if(P0_4==0&&P0_2==0){KeyNumber=9;}
	if(P0_4==0&&P0_3==0){KeyNumber=10;}
	if(P0_3==0&&P0_0==0){KeyNumber=11;}
	if(P0_3==0&&P0_1==0){KeyNumber=12;}
	if(P0_3==0&&P0_2==0){KeyNumber=13;}
	if(P0_2==0&&P0_0==0){KeyNumber=14;}
	if(P0_2==0&&P0_1==0){KeyNumber=15;}
	if(P0_1==0&&P0_0==0){KeyNumber=16;}
	
	if(P0_3==0&&P0_2==0&&P0_1==0){KeyNumber=17;}
	if(P0_3==0&&P0_2==0&&P0_0==0){KeyNumber=18;}
	if(P0_3==0&&P0_1==0&&P0_0==0){KeyNumber=19;}
	if(P0_2==0&&P0_1==0&&P0_0==0){KeyNumber=20;}
	if(P0_4==0&&P0_2==0&&P0_1==0){KeyNumber=21;}
	if(P0_4==0&&P0_2==0&&P0_0==0){KeyNumber=22;}
	if(P0_4==0&&P0_1==0&&P0_0==0){KeyNumber=23;}
	if(P0_4==0&&P0_3==0&&P0_1==0){KeyNumber=24;}
	if(P0_4==0&&P0_3==0&&P0_0==0){KeyNumber=25;}
	if(P0_4==0&&P0_3==0&&P0_2==0){KeyNumber=26;}
	
	if(P0_4==0&&P0_3==0&&P0_2==0&&P0_1==0){KeyNumber=27;}
	if(P0_4==0&&P0_3==0&&P0_2==0&&P0_0==0){KeyNumber=28;}
	if(P0_4==0&&P0_3==0&&P0_1==0&&P0_0==0){KeyNumber=29;}
	if(P0_4==0&&P0_2==0&&P0_1==0&&P0_0==0){KeyNumber=30;}
	if(P0_3==0&&P0_2==0&&P0_1==0&&P0_0==0){KeyNumber=31;}
	
	if(P0_4==0&&P0_3==0&&P0_2==0&&P0_1==0&&P0_0==0){KeyNumber=32;}
	
	
	
	
	
	
//	if(P0_5==0){Delay(20);while(P0_5==0);Delay(20);KeyNumber=6;}
//	if(P0_6==0){Delay(20);while(P0_6==0);Delay(20);KeyNumber=7;}
//	if(P0_7==0){Delay(20);while(P0_7==0);Delay(20);KeyNumber=8;}
	
	return KeyNumber;
}

按键中断代码

void Timer1Init(void)
{
	//设置INT1
	IT1=1;//跳变沿出发方式(下降沿)
	EX1=1;//打开INT1的中断允许。	
	EA=1;//打开总中断	
}

按键中断服务函数

void Int1()	interrupt 2		//
{
	if(KeyNum==0)
	{
//		P3_7=0;
			P1=0xff;
			P2=0x77;	
			Delay(500);
	}
}

因为显示时间有要求所以用了定时器0,定时器中断函数(定时时间1ms)

void Timer0Init(void)
{
	TMOD &= 0xF0;		//设置定时器模式
	TMOD |= 0x01;		//设置定时器模式
	TL0 = 0x18;		//设置定时初值
	TH0 = 0xFC;		//设置定时初值
	TF0 = 0;		//清除TF0标志
	TR0 = 1;		//定时器0开始计时
	ET0=1;
	EA=1;
	PT0=0;
}

定时器服务函数



void Timer0_Routine() interrupt 1
{
	int a[7]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf};
	static unsigned int T0Count;
	TL0 = 0x18;		
	TH0 = 0xFC;	
	T0Count++;
	if(T0Count==250)
	{
		P1=0;
	
	}		
	if(T0Count>=500)
	{
		P3_7=1;
		T0Count=0;
//		z++;
//		P1=0;
//		if(z==2)
		
		if(KeyNum==0)
		{
			P1=~(b[i++]);
			P2=0x7c;			
			if(i>6)
			{
				i=0;
			}
		}
		if(KeyNum==1)
		{
			P3_7=0;
			P1=~(b[KeyNum-1]);
			P2=0x06;	//????
		}
		if(KeyNum==2)
		{
			P3_7=0;
			P1=~(b[KeyNum-1]);
			P2=0x5b;	//????
		}
				if(KeyNum==3)
		{
			P3_7=0;
			P1=~(b[KeyNum-1]);
			P2=0x4f;	//????
		}
				if(KeyNum==4)
		{
			P3_7=0;
			P1=~(b[KeyNum-1]);
			P2=0x66;	//????
		}
				if(KeyNum==5)
		{
			P3_7=0;
			P1=~(b[KeyNum-1]);
			P2=0x6d;	//????
		}
//				if(KeyNum==6)
//		{
			P3_7=0;
//			P1=0xff;
//			P2=0x77;	//????
//		}
		if(KeyNum==7)
		{
			x++;
			P3_7=0;
			if(x<=10)
			{
			P1=~(b[0]);
			P2=0x06;
			}
			if(x>10&&x<=20)
			{
			P1=~(b[4]);
			P2=0x6d;
				
			}
			if(x==20)
			{
				x=0;
			}
		}
		if(KeyNum==8)
		{
			x1++;
			P3_7=0;
			if(x1<=10)
			{
			P1=~(b[1]);
			P2=0x5b;
			}
			if(x1>10&&x1<=20)
			{
			P1=~(b[4]);
			P2=0x6d;
			}
					if(x1==20)
			{
				x1=0;
			}
		}
				if(KeyNum==9)
		{
			x2++;
			P3_7=0;
			if(x2<=10)
			{
			P1=~(b[2]);
			P2=0x4f;
			}
			if(x2>10&&x2<=20)
			{
			P1=~(b[4]);
			P2=0x6d;
			}
					if(x2==20)
			{
				x2=0;
			}
		}
		if(KeyNum==10)
		{
			x3++;
			P3_7=0;
			if(x3<=10)
			{
			P1=~(b[3]);
			P2=0x66;
			}
			if(x3>10&&x3<=20)
			{
			P1=~(b[4]);
			P2=0x6d;
			}
					if(x3==20)
			{
				x3=0;
			}
		}
				if(KeyNum==11)
		{
			x4++;
			P3_7=0;
			if(x4<=10)
			{
			P1=~(b[3]);
			P2=0x66;
			}
			if(x4>10&&x4<=20)
			{
			P1=~(b[0]);
			P2=0x06;
			}
					if(x4==20)
			{
				x4=0;
			}
		}
			if(KeyNum==12)
		{
			x5++;
			P3_7=0;
			if(x5<=10)
			{
			P1=~(b[3]);
			P2=0x66;
			}
			if(x5>10&&x5<=20)
			{
			P1=~(b[1]);
			P2=0x5b;
			}
					if(x5==20)
			{
				x5=0;
			}
		}
					if(KeyNum==13)
		{
			x6++;
			P3_7=0;
			if(x6<=10)
			{
			P1=~(b[3]);
			P2=0x66;
			}
			if(x6>10&&x6<=20)
			{
			P1=~(b[2]);
			P2=0x4f;
				x6=0;
			}
					if(x6==20)
			{
				x6=0;
			}
		}
					if(KeyNum==14)
		{
			x7++;
			P3_7=0;
			if(x7<=10)
			{
			P1=~(b[2]);
			P2=0x4f;
			}
			if(x7>10&&x7<=20)
			{
			P1=~(b[0]);
			P2=0x06;
			}
					if(x7==20)
			{
				x7=0;
			}
		}
					if(KeyNum==15)
		{
			x8++;
			P3_7=0;
			if(x8<=10)
			{
			P1=~(b[2]);
			P2=0x4f;
			}
			if(x8>10&&x8<=20)
			{
			P1=~(b[1]);
			P2=0x5b;
			}
					if(x8==20)
			{
				x8=0;
			}
		}
					if(KeyNum==16)
		{
			x9++;
			P3_7=0;
			if(x9<=10)
			{
			P1=~(b[1]);
			P2=0x5b;
			}
			if(x9>10&&x9<=20)
			{
			P1=~(b[0]);
			P2=0x06;
			}
					if(x9==20)
			{
				x9=0;
			}
		}
		
			if(KeyNum==17)
		{
			y++;
			P3_7=0;
			if(y<=10)
			{
			P1=~(b[3]);
			P2=0x66;
			}
			if(y>10&&y<=20)
			{
			P1=~(b[2]);
			P2=0x4f;
			}
				if(y>20&&y<=30)
			{
			P1=~(b[1]);
			P2=0x5b;
			}
					if(y==30)
			{
				y=0;
			}
		}
		
					if(KeyNum==18)
		{
			y1++;
			P3_7=0;
			if(y1<=10)
			{
			P1=~(b[3]);
			P2=0x66;
			}
			if(y1>10&&y1<=20)
			{
			P1=~(b[2]);
			P2=0x4f;
			}
				if(y1>20&&y1<=30)
			{
			P1=~(b[0]);
			P2=0x06;
				y1=0;
			}
				if(y1==30)
			{
				y1=0;
			}
		}
		
		if(KeyNum==19)
		{
			y2++;
			P3_7=0;
			if(y2<=10)
			{
			P1=~(b[3]);
			P2=0x66;
			}
			if(y2>10&&y2<=20)
			{
			P1=~(b[1]);
			P2=0x5b;
			}
				if(y2>20&&y2<=30)
			{
			P1=~(b[0]);
			P2=0x06;
			}
								if(y2==30)
			{
				y2=0;
			}
		}
		
		if(KeyNum==20)
		{
			y3++;
			P3_7=0;
			if(y3<=10)
			{
			P1=~(b[1]);
			P2=0x5b;
			}
			if(y3>10&&y3<=20)
			{
			P1=~(b[2]);
			P2=0x4f;
			}
				if(y3>20&&y3<=30)
			{
			P1=~(b[0]);
			P2=0x06;
			}
								if(y3==30)
			{
				y3=0;
			}
		}
		
			if(KeyNum==21)
		{
			y4++;
			P3_7=0;
			if(y4<=10)
			{
			P1=~(b[4]);
			P2=0x6d;
			}
			if(y4>10&&y4<=20)
			{
			P1=~(b[2]);
			P2=0x4f;
			}
				if(y4>20&&y4<=30)
			{
			P1=~(b[1]);
			P2=0x5b;
			}
								if(y4==30)
			{
				y4=0;
			}
		}
		
					if(KeyNum==22)
		{
			y5++;
			P3_7=0;
			if(y5<=10)
			{
			P1=~(b[4]);
			P2=0x6d;
			}
			if(y5>10&&y5<=20)
			{
			P1=~(b[2]);
			P2=0x4f;
			}
				if(y5>20&&y5<=30)
			{
			P1=~(b[0]);
			P2=0x06;
			}
								if(y5==30)
			{
				y5=0;
			}
		}
		
		if(KeyNum==23)
		{
			y6++;
			P3_7=0;
			if(y6<=10)
			{
			P1=~(b[4]);
			P2=0x6d;
			}
			if(y6>10&&y6<=20)
			{
			P1=~(b[1]);
			P2=0x5b;
			}
				if(y6>20&&y6<=30)
			{
			P1=~(b[0]);
			P2=0x06;
			}
								if(y6==30)
			{
				y6=0;
			}
		}
		
				if(KeyNum==24)
		{
			y7++;
			P3_7=0;
			if(y7<=10)
			{
			P1=~(b[4]);
			P2=0x6d;
			}
			if(y7>10&&y7<=20)
			{
			P1=~(b[3]);
			P2=0x66;
			}
				if(y7>20&&y7<=30)
			{
			P1=~(b[1]);
			P2=0x5b;
			}
								if(y7==30)
			{
				y7=0;
			}
		}
		
						if(KeyNum==25)
		{
			y8++;
			P3_7=0;
			if(y8<=10)
			{
			P1=~(b[4]);
			P2=0x6d;
			}
			if(y8>10&&y8<=20)
			{
			P1=~(b[3]);
			P2=0x66;
			}
				if(y8>20&&y8<=30)
			{
			P1=~(b[0]);
			P2=0x06;
			}
								if(y8==30)
			{
				y8=0;
			}
		}
		
		if(KeyNum==26)
		{
			y9++;
			P3_7=0;
			if(y9<=10)
			{
			P1=~(b[4]);
			P2=0x6d;
			}
			if(y9>10&&y9<=20)
			{
			P1=~(b[3]);
			P2=0x66;
			}
				if(y9>20&&y9<=30)
			{
			P1=~(b[2]);
			P2=0x4f;
			}
								if(y9==30)
			{
				y9=0;
			}
		}
		
		if(KeyNum==27)
		{
			n++;
			P3_7=0;
			if(n<=10)
			{
			P1=~(b[4]);
			P2=0x6d;
			}
			if(n>10&&n<=20)
			{
			P1=~(b[3]);
			P2=0x66;
			}
				if(n>20&&n<=30)
			{
			P1=~(b[2]);
			P2=0x4f;
			}
				if(n>30&&n<=40)
			{
			P1=~(b[1]);
			P2=0x5b;
			}
								if(n==40)
			{
				n=0;
			}
		}
		
		if(KeyNum==28)
		{
			n1++;
			P3_7=0;
			if(n1<=10)
			{
			P1=~(b[4]);
			P2=0x6d;
			}
			if(n1>10&&n1<=20)
			{
			P1=~(b[3]);
			P2=0x66;
			}
				if(n1>20&&n1<=30)
			{
			P1=~(b[2]);
			P2=0x4f;
			}
				if(n1>30&&n1<=40)
			{
			P1=~(b[0]);
			P2=0x06;
				n1=0;
			}
								if(n1==40)
			{
				n1=0;
			}
		}
		
				if(KeyNum==29)
		{
			n2++;
			P3_7=0;
			if(n2<=10)
			{
			P1=~(b[4]);
			P2=0x6d;
			}
			if(n2>10&&n2<=20)
			{
			P1=~(b[3]);
			P2=0x66;
			}
				if(n2>20&&n2<=30)
			{
			P1=~(b[1]);
			P2=0x5b;
			}
				if(n2>30&&n2<=40)
			{
			P1=~(b[0]);
			P2=0x06;
			}
											if(n2==40)
			{
				n2=0;
			}
		}
		
						if(KeyNum==30)
		{
			n3++;
			P3_7=0;
			if(n3<=10)
			{
			P1=~(b[4]);
			P2=0x6d;
			}
			if(n3>10&&n3<=20)
			{
			P1=~(b[2]);
			P2=0x4f;
			}
				if(n3>20&&n3<=30)
			{
			P1=~(b[1]);
			P2=0x5b;
			}
				if(n3>30&&n3<=40)
			{
			P1=~(b[0]);
			P2=0x06;
			}
											if(n3==40)
			{
				n3=0;
			}
		}
		
		if(KeyNum==31)
		{
			n4++;
			P3_7=0;
			if(n4<=10)
			{
			P1=~(b[3]);
			P2=0x66;
			}
			if(n4>10&&n4<=20)
			{
			P1=~(b[2]);
			P2=0x4f;
			}
				if(n4>20&&n4<=30)
			{
			P1=~(b[1]);
			P2=0x5b;
			}
				if(n4>30&&n4<=40)
			{
			P1=~(b[0]);
			P2=0x06;
			}
											if(n4==40)
			{
				n4=0;
			}
		}
		
		if(KeyNum==32)
		{
			m++;
			P3_7=0;
			if(m<=10)
			{
			P1=~(b[3]);
			P2=0x66;
			}
			if(m>10&&m<=20)
			{
			P1=~(b[2]);
			P2=0x4f;
			}
				if(m>20&&m<=30)
			{
			P1=~(b[1]);
			P2=0x5b;
			}
				if(m>30&&m<=40)
			{
			P1=~(b[0]);
			P2=0x06;
			}
					if(m>40&&m<=50)
			{
			P1=~(b[4]);
			P2=0x6d;
				m=0;
			}
											if(m==50)
			{
				m=0;
			}
		}
		
		
		
		
		
		
		
	}
}

主函数

void main()
{
	 Timer1Init();
	 Timer0Init();
	while(1)
	{	
//		P3_7=0;
//		Delay(500);
//		P3_7=1;
//		Delay(500);
		KeyNum=Key();	
	}
}

QQ录屏20231213172245

  • 9
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

半生烟火一世迷离

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

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

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

打赏作者

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

抵扣说明:

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

余额充值