前言
💗博主介绍:✌全网粉丝10W+,CSDN特邀作者、博客专家、CSDN新星计划导师,一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设计 主要对象是咱们电子相关专业的大学生,希望您们都共创辉煌!✌💗
👇🏻 精彩专栏 推荐订阅👇🏻
单片机设计精品实战案例✅
感兴趣的可以先收藏起来,还有大家在毕设选题,项目以及论文编写等相关问题都可以给我留言咨询,希望帮助更多的人
资料获取
文章底部名片,详细资料联系我。
设计介绍
基于单片机的餐厅呼叫控制系统仿真设计是一个综合性的工程,旨在通过融合单片机技术、呼叫控制原理以及系统仿真等多个领域的专业知识,提升餐厅的运营效率和顾客体验。以下是对该设计的一个详细介绍:
一、系统概述
基于单片机的餐厅呼叫控制系统主要由单片机作为控制核心,配合按键模块、显示模块、提示模块等硬件组件,实现呼叫请求的发起、接收、处理与反馈。顾客通过按键模块发起呼叫请求,单片机接收到请求后,通过显示模块展示呼叫信息,并利用提示模块通知服务员。服务员根据提示及时处理呼叫请求,从而完成整个呼叫服务流程。
设计程序
/****************************************************************************
******餐厅呼叫系统,数码管显示,无线遥控呼叫:1号房间0101、0102、0000********
****************************************************************************/
//头文件
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
#define WEI P2 //定义P2口和P0口
#define DUAN P0
//各无线模块输出定义引脚
sbit R1_01=P1^0;
sbit R1_02=P1^1;
sbit R1_00=P1^2;
sbit R2_01=P1^3;
sbit R2_02=P1^4;
sbit R2_00=P1^5;
sbit R3_01=P1^6;
sbit R3_02=P1^7;
sbit R3_00=P3^1;
//应答按键
sbit yingda=P3^7;
//蜂鸣器
sbit buzz =P3^6;
//数码管显示数组
uchar code tab_duan[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff}; //0-9共阳显示码
uchar code tab_wei[]={0x7f,0xdf,0xf7,0xfd};//数码管位选
uchar bdata tab[4];
uchar h,sec;//定义全局变量
uchar flag1,flag2,flag3,flag4;
void display(); //声明显示函数
/****************************************************************************
******函数名称:delay(uint x)**********************************************
******作用:延时x ms函数*****************************************************
****************************************************************************/
void delay(uint x)
{
uint i,j;
for(i=0;i<x;i++)
for(j=0;j<110;j++);
}
/****************************************************************************
******函数名称:KEY()******************************************************
******作用:扫描按键*********************************************************
****************************************************************************/
void KEY()
{
if(R1_01==1) //当1餐桌1号请求1时
{
tab[1]=1; //请求编号置1
flag1=1; //餐桌号置1
while(R1_01) display(); //按键释放
}
if(R1_02==1) //一号餐桌有请求2时
{
tab[1]=2; //请求编号置2
flag1=1; //餐桌号置1
while(R1_02) display(); //按键释放
}
if(R1_00==1) //一号餐桌无请求时
{
tab[1]=0; //请求编号置0
flag1=0; //餐桌编号置0
while(R1_00) display(); //按键释放
}
if(R2_01==1) //当二号餐桌... ... 同上
{
tab[2]=1;
flag2=1;
while(R2_01) display();
}
if(R2_02==1)
{
tab[2]=2;
flag2=1;
while(R2_02) display();
}
if(R2_00==1)
{
tab[2]=0;
flag2=0;
while(R2_00) display();
}
if(R3_01==1)
{
tab[3]=1;
flag3=1;
while(R3_01) display();
}
if(R3_02==1)
{
tab[3]=2;
flag3=1;
while(R3_02) display();
}
if(R3_00==1)
{
tab[3]=0;
flag3=0;
while(R3_00) display();
}
if(yingda==0) //应答按键按下时,清零各餐桌呼叫
{
tab[1]=0; //餐桌请求清零
flag1=0; //餐桌号清零
tab[2]=0;
flag2=0;
tab[3]=0;
flag3=0;
while(!yingda) display(); //按键释放
}
}
/****************************************************************************
******函数名称:display()**************************************************
******作用:根据呼叫状态显示不同状态*****************************************
****************************************************************************/
void display()
{
WEI=tab_wei[0]; //打开第一位
DUAN=tab_duan[0]; //送入第一位显示数据
delay(1); //延时1ms
DUAN=tab_duan[10]; //清屏
WEI=tab_wei[2]; //打开第二位
DUAN=tab_duan[0]; //送入第二位数据
delay(1); //延时1ms
DUAN=tab_duan[10]; //清屏 以下同理
if(sec==1) //循环显示变量为1时
{
if(flag1==1) //如果一号餐桌有请求
{ //显示一号餐桌的请求编号
WEI=tab_wei[1];
DUAN=tab_duan[flag1];
delay(1);
DUAN=tab_duan[10];
WEI=tab_wei[3];
DUAN=tab_duan[tab[1]];
delay(1);
DUAN=tab_duan[10];
}
else //如果一号餐桌没有请求
sec=2; //循环显示变量直接赋值为2,用于显示下个餐桌的请求
}
if(sec==2) //循环显示变量为2
{
if(flag2==1) //2号餐桌是否有请求
{ //显示2号餐桌的请求
WEI=tab_wei[1];
DUAN=tab_duan[flag2+1];
delay(1);
DUAN=tab_duan[10];
WEI=tab_wei[3];
DUAN=tab_duan[tab[2]];
delay(1);
DUAN=tab_duan[10];
}
else //没有请求
sec=3; //循环显示变量直接赋值3,用于显示下个餐桌的请求
}
if(sec==3)
{
if(flag3==1)
{
WEI=tab_wei[1];
DUAN=tab_duan[flag3+2];
delay(1);
DUAN=tab_duan[10];
WEI=tab_wei[3];
DUAN=tab_duan[tab[3]];
delay(1);
DUAN=tab_duan[10];
}
else
sec=1;
}
if(flag1==0&&flag2==0&&flag3==0) //没有呼叫时,数码管显示0000
{
WEI=tab_wei[1];
DUAN=tab_duan[0];
delay(1);
DUAN=tab_duan[10];
WEI=tab_wei[3];
DUAN=tab_duan[0];
delay(1);
DUAN=tab_duan[10];
}
}
/****************************************************************************
******函数名称:init()*****************************************************
******作用:定时的初始化函数*************************************************
****************************************************************************/
void init()
{
TMOD=0x01; //工作方式
TH0=0x3c; //赋初值
TL0=0xb0;
EA=1; //打开中断总开关
ET0=1; //打开中断允许开关
TR0=1; //打开定时器开关
}
/****************************************************************************
******函数名称:main()*****************************************************
******作用:程序的入口,每个工程文件中都要有一个main函数*********************
****************************************************************************/
void main()
{
init(); //调用初始化函数
R1_01=0;
R1_02=0;
R1_00=0;
R2_01=0;
R2_02=0;
R2_00=0;
R3_01=0;
R3_02=0;
R3_00=0; //将各无线模块输入引脚置低电平,用来采集高电平信号
while(1) //进入循环
{
KEY(); //调用按键函数
display(); //调用显示函数
}
}
/****************************************************************************
******函数名称:time0()******************************************************
******作用:定时器T0的服务函数,定时器中断进入时需要完成的任务***************
****************************************************************************/
void time0() interrupt 1
{
uchar m;
TH0=0x3c;
TL0=0xb0; //重新赋初值
m++;
if(m%5==0&&(tab[1]!=0||tab[2]!=0||tab[3]!=0))
buzz=!buzz; //有呼叫时蜂鸣器闪烁
else if(tab[1]==0&&tab[2]==0&&tab[3]==0)
buzz=1; //无呼叫时关闭蜂鸣器
if(m==40)
{
m=0;
sec++;
if(sec==4)
sec=1;
}
}
具体实现截图
设计获取
文章下方名片联系我即可~
精彩专栏推荐订阅:在下方专栏👇🏻
毕业设计精品实战案例
收藏关注不迷路!!
🌟文末获取设计🌟