医院住院病人呼叫器的设计
基本功能:
设计一个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