全球最实用的IT互联网信息网站!

AI人工智能P2P分享&下载搜索网页发布信息网站地图

当前位置:诺佳网 > 电子/半导体 > 接口/总线/驱动 >

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

时间:2023-07-24 09:45

人气:

作者:admin

标签: 病床  一种  基于  单片机   

导读:求一种基于51单片机病床呼叫系统的设计方案-本项目使用Proteus8.12仿真51单片机控制器进行双机通信,使用MAX232通信模块、LCD1602液晶、按键模块、蜂鸣器LED模块等。...

一、主要功能

本项目使用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');

}

}

四、实验现象

图片

图片

温馨提示:以上内容整理于网络,仅供参考,如果对您有帮助,留下您的阅读感言吧!
相关阅读
本类排行
相关标签
本类推荐

CPU | 内存 | 硬盘 | 显卡 | 显示器 | 主板 | 电源 | 键鼠 | 网站地图

Copyright © 2025-2035 诺佳网 版权所有 备案号:赣ICP备2025066733号
本站资料均来源互联网收集整理,作品版权归作者所有,如果侵犯了您的版权,请跟我们联系。

关注微信