基于AT89C51单片机的排队叫号系统设计课程设计.docx
- 文档编号:4065694
- 上传时间:2023-05-06
- 格式:DOCX
- 页数:37
- 大小:627.47KB
基于AT89C51单片机的排队叫号系统设计课程设计.docx
《基于AT89C51单片机的排队叫号系统设计课程设计.docx》由会员分享,可在线阅读,更多相关《基于AT89C51单片机的排队叫号系统设计课程设计.docx(37页珍藏版)》请在冰点文库上搜索。
基于AT89C51单片机的排队叫号系统设计课程设计
摘要
本文设计了一套排队叫号系统。
该系统是以排队抽号顺序为核心,客户利用客户端抽号,工作人员利用叫号端叫号;通过显示器及时显示当前所叫号数,客户及时了解排队信息,通过合理的程序结构来执行排队抽号。
以提高排队等待效率,解决排队秩序混乱,前拥后挤等现象,实现排队自动化,规范化。
通过该系统的使用,客户不必为排队浪费大量精力,便于管理排队秩序,同时适应信息时代管理数字化的要求,提高服务水平与质量。
关键词:
单片机排队叫号系统开发
排队叫号系统设计
1.引言
近年来,随着科学技术的迅猛发展和人们生活水平的日益提高,各行各业特别是服务行业的竞争也逐渐激烈。
服务质量作为体现企业的公众形象、服务理念、管理水平的标准已越来越受到服务和被服务双方所关注,而营业窗口正是代表银行、医院、电信、税务、工商等企业服务质量的重要场所。
随着服务行业业务量的增长及业务种类的增加,排队等候已成为人们面临的实际问题。
长期以来,人们在银行、医院、电信、税务、工商等营业大厅里前拥后挤、杂乱无章地排队等候,有时一站就是一个多小时,这已是司空见惯的现象,极大地影响了服务质量。
员工坐着服务、客户站着等待的服务方式与“用户就是上帝”的服务宗旨完全背道而驰!
改善服务质量、树立良好形象,解决劳累的排队现象、创造人性化服务环境已成为急需解决的问题。
设计一套排队抽号的服务系统,可以很好的解决因排队引起的种种问题,排队系统应运而生。
此系统完全模拟人群排队过程,通过取票进队、排队等待、叫号服务等功能,诠释了人性化的服务理念,舒缓顾客等待的急噪情绪,使人们在等候服务的过程中拥有一个相对自由的空间,是科技以人为本的真正体现。
本文基于单片机的排队叫号系统,由客户端和主机终端组成,有LCD大屏幕显示信息,让客户知道自己的队号,并有叫号提示音提醒客户,方便快捷,可以满足日常的服务行业排队叫号,所以非常有意义。
2.系统功能分析及设计要求
一个很好的叫号系统,它的功能设计首先要符合用户的习惯,同时操作方便,易学,易用。
本系统由键盘输入系统、单片机系统、屏幕显示系统及叫号提示音系统组成,系统分为两个部分:
抽号部分和叫号部分,其控制核心为AT89C51单片机,选用此单片机编程简单,开发工具便于使用,
能满足很好的满足排队抽号的控制数据处理。
抽号部分和叫号部分采用一块LCD液晶显示器,这样显示数据直观,便于客户理解,抽号部分输入只需使用一个抽号按键即可,便于客户操作,叫号部分包括叫两个号键,系统采用自动清零,无需人工操作
3.系统框图
设备上电后,显示器屏幕亮,无信息显示。
当客户按键后,每按一下,队伍加1,显示器显示客户队伍号;排满20位后,再按取号键,屏幕显示“队伍满”。
当客服叫号时,队伍减1,程序进行信息处理,在显示器上显示“几号客户到几号窗口”,同时进行声音提示;当队伍空时,显示“队伍空”,显示器屏幕清空,储存的队伍号码归零处理
叫号提示音
1602液晶显示
AT89C51
单片机
终端窗口叫号
客户端取号
4.主要应用器件及技术原理
4.1微处理器介绍
4.1.1、MCS-51单片机的特点:
(1)小巧灵活、成本低、易于产品化。
能组装成各种智慧式测控设备及智能仪器仪表。
(2)可靠性好,应用范围广。
单片机芯片本身是按工业测控环境要求设计的,抗干扰性强,能适应各种恶劣的环境,这是其它机种无法比拟的。
(3)易扩展,很容易构成各种规模的应用系统,控制功能强。
单片机的逻辑控制功能很强,指令系统有各种控制功能指令,可以对逻辑功能比较复杂的系统进行控制。
(4)具有通讯功能,可以很方便地实现多机和分布式控制,形成控制
网络和远程控制。
正是由于51系列单片机具有以上优点,所以成为本次毕业设计所选用的处理器。
4.12、MCS-51单片机的结构
AT89C51是一种带4K字节闪烁可编程可擦除只读存储器(FPEROM—FalshProgrammableandErasableReadOnlyMemory)的低电压,高性能CMOS8位微处理器,俗称单片机。
单片机的可擦除只读存储器可以反复擦除100次。
从工作原理上讲,单片机就是一种微型计算机,是一种“程序存储式”计算机。
它是在一块硅片上集成了中央处理器(CPU)、随机内存(RAM)、程序内存(ROM或EPROM)、定时/计数器以及各种I/O接口,也就是集成在一块芯片上的计算机。
图4.1MCS-51单片机的结构
4.2液晶LCD1602的介绍
4.2.1字符型液晶显示器的显示原理
用LCD显示一个字符时比较复杂,因为一个字符由6x8或8x8点阵组成,既要找到和显示屏幕上某几个位置对应的显示RAM区的8个字节,还要使每字节的不同位为“1”,其它的为“0”,为“1”的点亮,为“0”的不亮。
这样一来就组成某个字符。
但对于内带字符发生器的控制器来说,显示字符就比较简单了,可以让控制器工作在文本方式,根据在LCD上开始显示的行列号及每行的列数找出显示RAM对应的地址,设立游标,在此送上该字符对应的代码即可。
4.2.2液晶LCD1602的简介
5.系统硬件电路设计
系统Proteus仿真图:
图中主要以AT89C51为控制核心,包括显示电路,音乐提示电路,晶振电路。
图5.1电路仿真
5.1晶振电路
AT89C51中有一个用于构成内部振荡器的高增益反相放大器,引脚XTAL1和XTAL2分别是该放大器的输入端和输出端。
这个放大器与作为回馈组件的片外石英晶体或陶瓷谐振器一起构成自激振荡器。
外接石英晶体(或陶瓷谐振器)及电容C1、C2接在放大器的反馈回路中构成并联振荡电路。
对外接电容C1、C2虽然没有十分严格的要求,但是电容容量的大小会轻微影响振荡频率的高低、振荡器工作的稳定性、起振的难易程序及温度稳定性,如果使用石英晶体,我们推荐电容使用30pF±10pF,而如果使用陶瓷谐振器建议选用40pF±10pF。
使用外部振荡器时,外部振荡信号应直接加到XTAL1,而XTAL2悬空。
内部方式时,时钟发生器对振荡脉冲二分频,如晶振为12MHz,时钟频率就为6MHz。
晶振的频率可以在1MHz-24MHz内选择。
电容取30PF左右。
本系统采用内部方式,晶振选用12MHz。
图5.2晶体内部方式
5.2液晶显示电路
如下图5.3,P1口接LCD1602的8个双向数据线接口,P3.4接1602的数据/命令选择端,P3.5接1602的读/写选择端,P3.6接1602的使能信号。
BLA、BLK分别是1602的背光源的正负极,VL是1602对比度调整端。
本文是通过对RS、RW以及E的高低电平进行写指令和写数据操作来控制1602的显示的。
图5.3液晶显示电路
5.3声音提示电路
使用最简单的蜂鸣器来作为提示音部分,通过改变端口高低电平来进行发声,并对延时进行修改来调试发声频率,从而修改发出的声音的好坏
图5.4声音提示电路图
6.系统仿真
仿真是在软件Proteus7.4上进行的,用C语言编写的程序,通过keil生成了hex文件,经过调试,仿真实现了排队叫号系统的功能
客户取号图
按下客户端取号按键,屏幕显示“YourNo.is03!
”
图6.1客户端显示
窗口叫号图
按下窗口服务叫号按键一,屏幕显示“No.03CometoNo.1window,please”
图6.2窗口服务叫号显示
7.系统软件设计
7.1系统软件流程图
7.2系统程序设计
7.2.1主程序
设备上电后,显示器屏幕亮,无信息显示。
当客户按键后,每按一下,队伍加1,显示器显示客户队伍号;排满20位后,再按取号键,屏幕显示“队伍满”。
当客服叫号时,队伍减1,程序进行信息处理,在显示器上显示“几号客户到几号窗口”,同时进行声音提示;当队伍空时,显示“队伍空”,显示器屏幕清空,储存的队伍号码归零处理。
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitrs=P2^0;
sbitrw=P2^1;
sbite=P2^2;
sbitkey1=P1^0;
sbitkey2=P1^1;
sbitkey3=P1^2;
sbitsounder=P3^7;
ucharprompt1[]="YourNo.is00!
";
ucharprompt2[]="No.00GoToWin.0";
ucharprompt3[]="Queueisfull";
ucharprompt4[]="Queueisempty!
";
uintnum_count=0;//排队叫的号码
uintrank_number[20]={0};//排队叫号存储的数组
uintnum=0;//窗口消的号码
intRankFlag=0;//叫号的标志
intClearNumFlag=0;//消号的标志
uintLengthFlag=0;//队列长度叫一次号时+1,消一次号时-1
/*延时函数*/
voiddelay(uintn)
{
while(n--);
/*****************************************
LCD1602*显示屏命令写入函数*
*****************************************/
voidLCD_write_com(ucharcom)
{
e=0;
rs=0;
rw=0;
P0=com;
delay(1000);
e=1;
delay(1000);
e=0;
}
/*****************************************
LCD1602*显示屏数据写入函数*
*****************************************/
voidLCD_write_data(uchardat)
{
e=0;
rs=1;
rw=0;
P0=dat;
delay(1000);
e=1;
delay(1000);
e=0;
}
/*****************************************
LCD1602*显示屏清空显示*
*****************************************/
voidLCD_clear(void)
{
LCD_write_com(0x01);
delay(1000);
}
/*****************************************
LCD1602显示屏初始化函数
*****************************************/
voidLCD_init(void)
{
LCD_write_com(0x38);/*显示模式设置*/
delay(100);
LCD_write_com(0x38);
delay(100);
LCD_write_com(0x38);
delay(100);
LCD_write_com(0x38);
LCD_write_com(0x08);/*显示关闭*/
LCD_write_com(0x01);/*显示清屏*/
LCD_write_com(0x06);/*显示光标移动设置*/
delay(100);
LCD_write_com(0x0C);/*显示开及光标设置*/
}
/*简单的蜂鸣器提示音*/
voidsound()
{uinta;
for(a=0;a<500;a++)
{
sounder=0;
delay(61);
sounder=1;
}
}
/*获取键值函数*/
uintsweep_key()
{
uintjianzhi;
if(key1==0)
{delay(1000);
if(key1==0)
jianzhi=1;
RankFlag=1;
}
if(key2==0||key3==0)
{delay(1000);
if(key2==0)
jianzhi=2;
if(key3==0)
jianzhi=3;
ClearNumFlag=1;
}
return(jianzhi);
}
/*****************************************
叫号机按一次一号键变量+1,最大为20
*****************************************/
voidQueueNumProcess()
{
if(RankFlag==1)//判断叫号标志是否有效
{
if(LengthFlag<20)
{
num_count++;
rank_number[LengthFlag]=num_count;
}
LengthFlag++;
}
}
/*****************************************
窗口消号处理函数
*****************************************/
voidClearNumProcess()
{
uinti;
if(ClearNumFlag==1)//判断消号标志是否有效
{
num=rank_number[0];//把消的号赋给全局变量num
for(i=0;i<19;i++)//让数组整体左移一个存储单元,即把消得号删除
{
rank_number[i]=rank_number[i+1];
}
LengthFlag--;
}
}
/*****************************************
检测到按键后,检测函数处理及LCD显示处理
*****************************************/
voidCheckButtonProcess(uintm)//m代表检测到的键值
{
uintjz,i;
jz=m;
if((jz==1)&&(RankFlag==1))
{
//当队列人数达到20时,提示
//Queueisfull
if(LengthFlag>=20)
{
LCD_clear();
LCD_write_com(0x80+0x02);
delay(100);
for(i=0;i<16;i++)
{
LCD_write_data(prompt3[i]);
delay(100);
}
}
else
{
QueueNumProcess();
prompt1[11]=(num_count)/10+'0';
prompt1[12]=(num_count)%10+'0';
LCD_clear();
LCD_write_com(0x80+02);
delay(100);
for(i=0;i<15;i++)
{
LCD_write_data(prompt1[i]);//"YourNo.is00!
";
delay(100);
}
RankFlag=0;
}
}
if((jz==2||jz==3)&&ClearNumFlag==1)
{
if(LengthFlag==0)
{
LCD_clear();
LCD_write_com(0x80+0);
delay(1000);
for(i=0;i<16;i++)
{
LCD_write_data(prompt4[i]);//"Queueisempty";
delay(100);
}
delay(65535);//无人排队时屏幕自动清屏,计数归零
LCD_clear();
num_count=0;
}
else
{
ClearNumProcess();//消号处理,营业员操作
sound();
prompt2[3]=num/10+'0';
prompt2[4]=num%10+'0';
prompt2[15]=(jz-1)+'0';
LCD_clear();
LCD_write_com(0x80+0);
delay(100);
for(i=0;i<16;i++)
{
LCD_write_data(prompt2[i]);//"No.00cometoNo.0";
delay(100);
}
ClearNumFlag=0;
}
}
}
/*****************************************
main函数
*****************************************/
voidmain()
{
uintKvalue;
LCD_init();
while
(1)
{
Kvalue=sweep_key();//获取键值
if(RankFlag==1||ClearNumFlag==1)//判断叫号标志和消号标志是否有效
CheckButtonProcess(Kvalue);
delay(200);
RankFlag=0;//使叫号标志无效
ClearNumFlag=0;//使消号标志无效
Kvalue=0;//键值清0
}
}
7.2.2液晶LCD1602显示处理程序
/*****************************************
LCD1602*显示屏命令写入函数*
*****************************************/
voidLCD_write_com(ucharcom)
{
e=0;
rs=0;
rw=0;
P0=com;
delay(1000);
e=1;
delay(1000);
e=0;
}
/*****************************************
LCD1602*显示屏数据写入函数*
*****************************************/
voidLCD_write_data(uchardat)
{
e=0;
rs=1;
rw=0;
P0=dat;
delay(1000);
e=1;
delay(1000);
e=0;
}
/*****************************************
LCD1602*显示屏清空显示*
*****************************************/
voidLCD_clear(void)
{
LCD_write_com(0x01);
delay(1000);
}
/*****************************************
LCD1602显示屏初始化函数
*****************************************/
voidLCD_init(void)
{
LCD_write_com(0x38);/*显示模式设置*/
delay(100);
LCD_write_com(0x38);
delay(100);
LCD_write_com(0x38);
delay(100);
LCD_write_com(0x38);
LCD_write_com(0x08);/*显示关闭*/
LCD_write_com(0x01);/*显示清屏*/
LCD_write_com(0x06);/*显示光标移动设置*/
delay(100);
LCD_write_com(0x0C);/*显示开及光标设置*/
}
这几个是1602显示的必备程序,设置好1602后,只需通过写指令和写数据的程序处理,能够把需要显示的内容显示出来,是比较简单的显示设备
7.2.3按键检测程序
/*获取键值函数*/
uintsweep_key()
{
uintjianzhi;
if(key1==0)
{delay(1000);
if(key1==0)
jianzhi=1;
RankFlag=1;
}
if(key2==0||key3==0)
{delay(1000);
if(key2==0)
jianzhi=2;
if(key3==0)
jianzhi=3;
ClearNumFlag=1;
}
return(jianzhi);
}
本设计只设立了两个处理窗口,相对来说简单,通过按键检测程序,来分辨是哪个按键按下了。
窗口依据实际需要可以增加,程序有很大的扩展性。
8.结束语
通过查阅相关书籍、网上资料和一些仿真实例,做成了现在的排队叫号系统。
此系统采用LCD1602显示,做起来比较简单,其中只设立了两个处理窗口,虽然很少,不过根据需要可以经行增加,具有较好的扩展功能。
设计采用声音提示,由于能力有限,不会编写音乐程序,就用了最简单的蜂蜜器声音,通过改变延时程序,对蜂蜜器的频率来进行调节,最后声音勉强可以。
本设计虽不及现今比较成熟的产品,不过对需求不是很高的人还是可以的。
从此次设计中,我学到了很多,对没有掌握的知识都有了一定的了解。
虽然本科毕业设计已经即将结束,但是我对排队叫号系统的研究并没有告一段落我会接着研究。
以后目标是,用更高级的芯片把叫号系统进行完善,争取达到银行的那样
四年来的的本科生活伴随着论文的完成,也要结束了。
时间终是短暂,但是这四年大学的时间里却经历了重要的人生蜕变。
做学问总是枯燥和寂寞的,而生活本身又是那么丰富多彩。
在这个忙碌而火热的行业中,我总算找到了一个合理时间能够静静的思考我的发展方向,以及我未来的事业。
9致谢辞
首先,感谢我的指导老师朱煜钰老师对我的鼓励和帮助,使我能能够顺利地完成论文,从他的身上无论做事还是学习使我学到了好多宝贵的经验,让我在人生的道路上更加自信,这些将使我受益终生。
感谢各位师的辛勤培育,将信息工程这个全新的领域引入我的大学生活,在人生最重和发展的最初阶段,为我指明了方向。
感谢学院的其他老师,您们从生活和教学中流露出的言行,您们的学识和修养,使我不禁对自己的要求也更高了一分。
还要感谢电工实验室的老师,四年来在学习上的帮助和动手能力的培养,更加启发了我的学习爱好和兴趣。
机电专业的同学,谢谢你们的
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 AT89C51 单片机 排队 叫号 系统 设计 课程设计