一、系统方案
 设计一个可容8张床位的病房呼叫系统。要求每个床位都有一个按钮,当患者需要呼叫护士时,按下按钮,此时护士值班室内的呼叫系统板上显示该患者的床位号,并蜂鸣器报警。当护士按下“响应”键时,结束当前呼叫。
 操作视频BIBIBI:https://www.bilibili.com/video/BV1kN4y127f8/
 。
 二、硬件设计
 原理图如下:
 
三、单片机软件设计
 1、首先是系统初始化
 //LCD端口初始化
 void LCDPort_Init(void)
 {
 LCD_BUS = 0XFF;
 LCD_BUS_Direction_REG =0XFF; //LCD数据端口设置为输出
 LCD_ControlPort_SET;          //RS RW EN脚均设置为输出	
  LCD_ControlPort_CLR;          //RW RW EN低电平
}
//LCD写指令
 void Write_Com(unsigned char LCD_Com)
 {
 RS_CLR; //RS=0,写指令
 RW_CLR; //RW=0,写命令
 EN_SET; //E=1,写操作	
 LCD_BUS=LCD_Com;    //数据送往数据端口?
 _delay_ms(1);    //这个延时非常重要,结合时序图来理解,可以跟送数据顺序调换
 EN_CLR;// E=0,下角
 _delay_ms(1);  
}
 2、液晶显示程序
 //LCD端口初始化
 void LCDPort_Init(void)
 {
 LCD_BUS = 0XFF;
 LCD_BUS_Direction_REG =0XFF; //LCD数据端口设置为输出
 LCD_ControlPort_SET;          //RS RW EN脚均设置为输出	
  LCD_ControlPort_CLR;          //RW RW EN低电平
}
//LCD写指令
 void Write_Com(unsigned char LCD_Com)
 {
 RS_CLR; //RS=0,写指令
 RW_CLR; //RW=0,写命令
 EN_SET; //E=1,写操作	
 LCD_BUS=LCD_Com;    //数据送往数据端口?
 _delay_ms(1);    //这个延时非常重要,结合时序图来理解,可以跟送数据顺序调换
 EN_CLR;// E=0,下角
 _delay_ms(1);  
}
3、按键程序
 //按键处理函数
 void key_with(void)
 {
 uchar i;
 if(key_can <= 8)
 {
 if(key_can == 1)
 L1_0 ; //1号病房灯亮
 if(key_can == 2)
 L2_0 ; //2号病房灯亮
 if(key_can == 3)
 L3_0 ; //3号病房灯亮
 if(key_can == 4)
 L4_0; //4号病房灯亮
 if(key_can == 5)
 L5_0 ; //5号病房灯亮
 if(key_can == 6)
 L6_0 ; //6号病房灯亮
 if(key_can == 7)
 L7_0 ; //7号病房灯亮
 }
 4、核心算法程序
 void main(void)
 {
 unsigned char key =1;
 LCDPort_Init();
 LCD_Init();
 DDRB=0x7F;
 PORTB=0xff;
 DDRC=0xFF;
 PORTC=0xff;
 DDRD=0x00;
 PORTD=0xff;
 DDRA=0xFF;
 PORTA=0xff;
 write_string(1,0,Timer_buf); 
 write_string(2,0," wu bingrenhujiao");
while(1)
{
    Timer_buf[13] = br_geshu%10+47;
			   
     write_string(1,0,Timer_buf); //写显示
	if(br_geshu > 1)
			BEEP_0 ;   //蜂鸣器报警
	else 
				BEEP_1;       //取消报警
   key_with();
   if((PIND&0x01)==0x00)    // 按键1按下          
   {
	  _delay_ms(10);  // 延时消抖
	   if((PIND&0x01)==0x00)   // 确定按键依然1按下     
	   {
	     while((PIND&0x01)!=0X01); // 判断手松开
	     key_can = 1;
	   }		
	} 
	  if((PIND&0x02)==0x00)    // 按键1按下          
   {
	  _delay_ms(10);  // 延时消抖
	   if((PIND&0x02)==0x00)   // 确定按键依然1按下     
	   {
	     while((PIND&0x02)!=0X02); // 判断手松开
	     key_can = 2;
	   }		
	} 
	  if((PIND&0x04)==0x00)    // 按键1按下          
   {
	  _delay_ms(10);  // 延时消抖
	   if((PIND&0x04)==0x00)   // 确定按键依然1按下     
	   {
	     while((PIND&0x04)!=0X04); // 判断手松开
	     key_can = 3;
	   }		
	} 
  if((PIND&0x08)==0x00)    // 按键1按下          
   {
	  _delay_ms(10);  // 延时消抖
	   if((PIND&0x08)==0x00)   // 确定按键依然1按下     
	   {
	     while((PIND&0x08)!=0X08); // 判断手松开
	     key_can = 4;
	   }		
	}
	  if((PIND&0x10)==0x00)    // 按键1按下          
   {
	  _delay_ms(10);  // 延时消抖
	   if((PIND&0x10)==0x00)   // 确定按键依然1按下     
	   {
	     while((PIND&0x10)!=0X10); // 判断手松开
	     key_can = 5;
	   }		
	} 
	  if((PIND&0x20)==0x00)    // 按键1按下          
   {
	  _delay_ms(10);  // 延时消抖
	   if((PIND&0x20)==0x00)   // 确定按键依然1按下     
	   {
	     while((PIND&0x20)!=0X20); // 判断手松开
	     key_can = 6;
	   }		
	} 
	  if((PIND&0x40)==0x00)    // 按键1按下          
   {
	  _delay_ms(10);  // 延时消抖
	   if((PIND&0x40)==0x00)   // 确定按键依然1按下     
	   {
	     while((PIND&0x40)!=0X40); // 判断手松开
	     key_can = 7;
	   }		
	} 
	  if((PIND&0x80)==0x00)    // 按键1按下          
   {
	  _delay_ms(10);  // 延时消抖
	   if((PIND&0x80)==0x00)   // 确定按键依然1按下     
	   {
	     while((PIND&0x80)!=0X80); // 判断手松开
	     key_can = 8;
	   }		
	}  
	if((PINB&0x80)==0x00)    // 按键1按下          
   {
	  _delay_ms(10);  // 延时消抖
	   if((PINB&0x80)==0x00)   // 确定按键依然1按下     
	   {
	     while((PINB&0x80)!=0X80); // 判断手松开
	     key_can = 9;
	   }		
	}  
}
}
四、 proteus仿真设计
 Proteus软件是一款应用比较广泛的工具,它可以在没有硬件平台的基础上通过自身的软件仿真出硬件平台的运行情况,这样就可以通过软件仿真来验证我们设计的方案有没有问题,如果有问题,可以重新选择器件,连接器件,直到达到我们设定的目的,避免我们搭建实物的时候,如果当初选择的方案有问题,我们器件都已经焊接好了,再去卸载下去,再去焊接新的方案的器件,测试,这样会浪费人力和物力,也给开发者带来一定困惑,Proteus仿真软件就很好的解决这个问题,我们在设计之初,就使用该软件进行模拟仿真,测试,选择满足我们设计的最优方案。最后根据测试没问题的仿真图纸,焊接实物,调试,最终完成本设计的作品。




















