求一种基于51单片机病床呼叫系统的设计方案

控制/MCU

1814人已加入

描述

一、主要功能

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

系统运行后,LCD1602显示开机界面,当从机病床按键按下,主机LCD1602显示说按病床号且对应指示灯亮,蜂鸣器报警。此时主机中护士应答键按下,则清除本次病床号,同时对应LED灭。当多床号键被按下,LCD1602依次顺序显示,此时主机中护士应答键被按下,按优先顺序依次处理,LED灭。

主要功能:

(1)从机具有8床位呼叫;

(2)主机LCD显示和应答;

(3)灯光报警提示;

(4)顺序排列应答处理。

二、硬件资源

51单片机核心模块、MAX232模块、LCD1602液晶模块、蜂鸣器模块、LED电路、按键模块。

三、软件设计

(1)主机程序:

/*

#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

{

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');

}

}

四、实验现象

max232

max232

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分