文章目录
- 一、功能简介
- 二、软件设计
- 三、实验现象
- 联系作者
一、功能简介
本项目使用Proteus8仿真STM32单片机控制器,使用LCD1602液晶、按键、蜂鸣器LED、双机通信等。
主要功能:
系统运行后,LCD1602显示开机界面,当从机病床按键按下,主机LCD1602显示说按病床号且蜂鸣器报警LED指示灯亮。此时主机中护士应答键按下,则清除本次病床号。当多床号键被按下,LCD1602依次顺序显示,此时主机中护士应答键被按下,按优先顺序依次处理,LED灭。如果按下清零键,则将所有呼叫信息清除。
主要功能:
1、从机6床位呼叫
2、主机LCD显示和应答
3、灯光报警提示
4、顺序排列处理
二、软件设计
/*
作者:嗨小易(QQ:3443792007)
*/
//系统参数控制
void sys_parm_ctrl(void)
{
u8 key=0;
static u8 cnt=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;
}
sys_ctrl.cnt--;
if(sys_ctrl.cnt<=0)
{
sys_ctrl.cnt=0;
cnt=0;
LED0=1;//关闭呼叫指示灯
}
}
//清除所有病人呼叫
else if(key==KEY2_PRESS)
{
cnt=0;
sys_parm_init();//参数初始化
LED0=1;//关闭呼叫指示灯
lcd1602_clear();
lcd1602_show_string(0,0,"ID ID ID ID ");
lcd1602_show_string(0,1,"ID ID ");
}
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,USART1_RX_BUF[sys_ctrl.cnt-1],1);break;
case 2: lcd1602_show_num(6,0,USART1_RX_BUF[sys_ctrl.cnt-1],1);break;
case 3: lcd1602_show_num(10,0,USART1_RX_BUF[sys_ctrl.cnt-1],1);break;
case 4: lcd1602_show_num(14,0,USART1_RX_BUF[sys_ctrl.cnt-1],1);break;
case 5: lcd1602_show_num(2,1,USART1_RX_BUF[sys_ctrl.cnt-1],1);break;
case 6: lcd1602_show_num(6,1,USART1_RX_BUF[sys_ctrl.cnt-1],1);break;
case 7: lcd1602_show_num(10,1,USART1_RX_BUF[sys_ctrl.cnt-1],1);break;
case 8: lcd1602_show_num(14,1,USART1_RX_BUF[sys_ctrl.cnt-1],1);break;
}
beep_alarm(20,1000);//蜂鸣器响
sys_ctrl.sta=1;
}
break;
}
}
//应用控制系统
void appdemo_show(void)
{
sys_parm_init();//系统参数初始化
KEY_Init();
LED_Init();
BEEP_Init();
lcd1602_init();//LCD1602初始化
USART1_Init(9600);
sys_open_show();//系统初始界面显示
while(1)
{
sys_data_show();//系统数据显示
sys_parm_ctrl();//系统参数控制
}
}
/*******************************************************************************
* 函 数 名 : USART1_IRQHandler
* 函数功能 : USART1中断函数
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void USART1_IRQHandler(void) //串口1中断服务程序
{
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //接收中断
{
LED0=0;//打开呼叫指示灯
if(sys_ctrl.cnt<ID_MAX)
{
USART1_RX_BUF[sys_ctrl.cnt]=USART_ReceiveData(USART1)-0x30;
//连续两次相同键视为一次有效
if(sys_ctrl.cnt>=1)
if(USART1_RX_BUF[sys_ctrl.cnt]==USART1_RX_BUF[sys_ctrl.cnt-1])
sys_ctrl.cnt-=1;
sys_ctrl.cnt++;
}
sys_ctrl.sta=0;
}
}
三、实验现象
B站演示视频:https://space.bilibili.com/444388619
联系作者
专注于51单片机、STM32、国产32、DSP、Proteus、ardunio、ESP32、物联网软件开发,PCB设计,视频分享,技术交流。