控制/MCU
一、主要功能
本项目使用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');
}
}
四、实验现象
全部0条评论
快来发表一下你的评论吧 !