【Proteus仿真】【51单片机】病床呼叫系统设计


一、主要功能

本项目使用Proteus8仿真51单片机控制器进行双机通信,使用MAX232通信模块、LCD1602液晶、按键模块、蜂鸣器LED模块等。

系统运行后,LCD1602显示开机界面,当从机病床按键按下,主机LCD1602显示说按病床号且对应指示灯亮,蜂鸣器报警。此时主机中护士应答键按下,则清除本次病床号,同时对应LED灭。当多床号键被按下,LCD1602依次顺序显示,此时主机中护士应答键被按下,按优先顺序依次处理,LED灭。
主要功能:
1、从机具有8床位呼叫
2、主机LCD显示和应答
3、灯光报警提示
4、顺序排列应答处理


二、硬件资源

1、51单片机核心模块
2、MAX232模块
3、LCD1602液晶模块
4、蜂鸣器模块
5、LED电路
6、按键模块

三、软件设计

1、主机程序

/*
作者:嗨小易(QQ:3443792007)
*/

#include "appdemo.h"
#include "key.h"
#include "lcd1602.h"
#include "beep.h"
#include "time.h"
#include "uart.h"


#define LED_PORT	P1

_sys_ctrl sys_ctrl;


//系统参数初始化
void sys_parm_init(void)
{
	sys_ctrl.id=0;
	sys_ctrl.sta=1;
	sys_ctrl.cnt=0;
}

//系统开机界面显示
void sys_open_show(void)
{
	lcd1602_clear();
	lcd1602_show_string(0,0,"Ward Call System");
	lcd1602_show_string(0,1,"  Quiet Please  ");
	while(RI==0);
	lcd1602_clear();
	lcd1602_show_string(0,0,"ID  ID  ID  ID ");
	lcd1602_show_string(0,1,"ID  ID  ID  ID ");	
}

//系统参数控制
void sys_parm_ctrl(void)
{
	u8 key=0;
	static u8 cnt=0;
	u8 i=0;

	while(1)
	{
		key=key_scan(0);
		//如果护士应答,则清除本次呼叫
		if(key==KEY1_PRESS)
		{
			cnt++;
			//应答后床位号刷新显示,取消显示应答床位的ID
			switch(cnt)
			{
				case 1: lcd1602_show_num(2,0,' ',0);break;
				case 2: lcd1602_show_num(6,0,' ',0);break;
				case 3: lcd1602_show_num(10,0,' ',0);break;
				case 4: lcd1602_show_num(14,0,' ',0);break;
				case 5: lcd1602_show_num(2,1,' ',0);break;
				case 6: lcd1602_show_num(6,1,' ',0);break;
				case 7: lcd1602_show_num(10,1,' ',0);break;
				case 8: lcd1602_show_num(14,1,' ',0);break;
			}
			//对应床位指示灯熄灭
			switch(UART_RX_BUF[cnt-1])
			{
				case 1: LED_PORT|=0X01;break;
				case 2: LED_PORT|=0X02;break;
				case 3: LED_PORT|=0X04;break;	
				case 4: LED_PORT|=0X08;break;
				case 5: LED_PORT|=0X10;break;
				case 6: LED_PORT|=0X20;break;
				case 7: LED_PORT|=0X40;break;	
				case 8: LED_PORT|=0X80;break;
			}			
			sys_ctrl.cnt--;	
			if(sys_ctrl.cnt<=0)
			{
				sys_ctrl.cnt=0;
				cnt=0;	
			}
		}

		break;
	}	
}

//系统数据显示
void sys_data_show(void)
{
	
	while(1)
	{	
		//病房有键按下
		if(sys_ctrl.sta==0)
		{
			//按照按下顺序LCD显示床位号
			switch(sys_ctrl.cnt)
			{
				case 1: lcd1602_show_num(2,0,UART_RX_BUF[sys_ctrl.cnt-1],1);break;
				case 2: lcd1602_show_num(6,0,UART_RX_BUF[sys_ctrl.cnt-1],1);break;
				case 3: lcd1602_show_num(10,0,UART_RX_BUF[sys_ctrl.cnt-1],1);break;
				case 4: lcd1602_show_num(14,0,UART_RX_BUF[sys_ctrl.cnt-1],1);break;
				case 5: lcd1602_show_num(2,1,UART_RX_BUF[sys_ctrl.cnt-1],1);break;
				case 6: lcd1602_show_num(6,1,UART_RX_BUF[sys_ctrl.cnt-1],1);break;
				case 7: lcd1602_show_num(10,1,UART_RX_BUF[sys_ctrl.cnt-1],1);break;
				case 8: lcd1602_show_num(14,1,UART_RX_BUF[sys_ctrl.cnt-1],1);break;
			}
			
			//对应床位指示灯显示
			switch(UART_RX_BUF[sys_ctrl.cnt-1])
			{
				case 1: LED_PORT&=0XFE;break;
				case 2: LED_PORT&=0XFD;break;
				case 3: LED_PORT&=0XFB;break;	
				case 4: LED_PORT&=0XF7;break;
				case 5: LED_PORT&=0XEF;break;
				case 6: LED_PORT&=0XDF;break;
				case 7: LED_PORT&=0XBF;break;	
				case 8: LED_PORT&=0X7F;break;
			}
			BEEP=0;	//蜂鸣器响
			delay_ms(1000);
			BEEP=1;	//蜂鸣器关闭
			sys_ctrl.sta=1;			
		}

		break;
	}
}

//主机应用系统程序
void appdemo_show(void)
{
	sys_parm_init();	//系统参数初始化
	UART_Init();
	lcd1602_init();
//	time0_init();	//定时50ms
	sys_open_show();	//系统开机界面显示
	
	while(1)
	{
		sys_data_show();//系统数据显示
		sys_parm_ctrl();//系统参数控制		
	}
}

void UART_IRQn() interrupt 4
{
	ES=0;//关闭中断
	if(RI)
	{
		RI=0;
		if(sys_ctrl.cnt<ID_MAX)
		{
			UART_RX_BUF[sys_ctrl.cnt]=SBUF-0x30;
			//连续两次相同键视为一次有效
			if(sys_ctrl.cnt>=1)
				if(UART_RX_BUF[sys_ctrl.cnt]==UART_RX_BUF[sys_ctrl.cnt-1])
					sys_ctrl.cnt-=1;
			sys_ctrl.cnt++;
		}	
		sys_ctrl.sta=0;		
	}
	ES=1;//打开中断	
}

//定时器0中断函数
void time0(void) interrupt 1
{
	static u8 i=0;
	
	TH0=0X4C;	//给定时器赋初值,定时50ms
	TL0=0X00;

	i++;
	if(i>=4)//间隔500ms
	{
		i=0;
		
	}
}


2、从机程序

#include "appdemo.h"
#include "key.h"
#include "time.h"
#include "uart.h"


sbit LED=P0^0;

_sys_ctrl sys_ctrl;


//系统参数初始化
void sys_parm_init(void)
{
	
}

//从机应用系统程序
void appdemo_show(void)
{
	u8 key=0;

	sys_parm_init();
//	time0_init();
	UART_Init();

	while(1)
	{
		key=key_scan(0);
		if(key!=0)LED=!LED;
		if(key==KEY1_PRESS)UART_SendData('1');	
		else if(key==KEY2_PRESS)UART_SendData('2');
		else if(key==KEY3_PRESS)UART_SendData('3');
		else if(key==KEY4_PRESS)UART_SendData('4');
		else if(key==KEY5_PRESS)UART_SendData('5');
		else if(key==KEY6_PRESS)UART_SendData('6');
		else if(key==KEY7_PRESS)UART_SendData('7');
		else if(key==KEY8_PRESS)UART_SendData('8');		
	}
}


四、实验现象

B站演示视频:https://space.bilibili.com/444388619

在这里插入图片描述

在这里插入图片描述


联系作者

B站演示视频:https://space.bilibili.com/444388619
专注于51单片机、STM32、国产32、DSP、Proteus、ardunio、ESP32、物联网软件开发,PCB设计,视频分享,技术交流。

  • 3
    点赞
  • 59
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值