摘要排队叫号管理系统是针对银行、工商、税务、通讯、政府机构等部门的大厅工作流程设计的,是利用电脑的科学管理客户排队的系统,很好地解决了客户在服务机构办理业务时所遇到的各种排队、拥挤和混乱现象,为客户办理业务带来莫大的方便和愉悦。
该题研究的目的是研制一款无人排队的排队叫号机,它主要由主控制器、键盘、显示电路、蜂鸣器电路等部分构成。
系统利用单片机进行控制,通过串行通信方式传输处理数据;通过按键取号,在LCD1602上显示排队的号码以及当前正在等待的人数;通过按键叫号,在LCD1602上显示叫到的号码,由扬声器发出声音提示客户。
同时免除了令客户不舒服的站立式排队,这种现代化的高科技产品彻底解决了银行普遍存在的站立等候,服务无序的问题,深化并完善了服务的质量。
本系统采用单片机进行控制,利用LCD1602显示,蜂鸣器鸣叫提示的人机交互界面,模拟排队管理系统,科学地处理各种排队情况。
操作简便,控制灵活,显示清晰,制作成本低,性价比较高。
关键词STC89C52 LCD1602 蜂鸣器目录1 系统方案论证 (1)1.1 设计要求 (1)1.2 单片机芯片的选择方案和论证 (1)1.3 显示模块选择方案和论证 (1)1.4 系统方案设计 (2)2 系统硬件设计 (3)2.1 系统总电路 (3)2.2 单片机处理部分设计 (3)2.3 显示电路部分 (4)2.4 时钟振荡电路 (5)2.5 复位电路 (6)2.6 叫号电路 (6)2.7 按键电路 (7)3 系统软件设计 (8)4系统测试 (9)5 小结 (10)参考文献 (11)附录 (12)源程序: (12)银行叫号排队系统的设计1 系统方案论证1.1 设计要求(1)实地调研,了解银行叫号过程;(2)画出一个实例的状态转移图;(3)程序设计,用单片机实现。
(汇编语言或C语言)注:根据实际情况,制定可行的技术路线,满足客户要求。
(如,等待时间最短;VIP 优先;老人优先(专柜);“飞号”不清除等。
飞号是指叫了该号3次后,而该号人没出现服务窗口,就不再呼叫,该号被清除了,该号就称之为飞号。
可用户又回来了,只好再取一个新号。
)1.2 单片机芯片的选择方案和论证方案一:采用AT89S51芯片作为硬件核心,内部具有4KB ROM 存储空间,而且与MCS-51系列单片机完全兼容,但是运用于电路设计中时由于不具备ISP在线编程技术,所以在对电路进行调试时,由于程序的错误修改或对程序的新增功能需要烧入程序时,对芯片的多次拔插会对芯片造成一定的损坏。
方案二:采用STC89C52芯片,STC89C52是一种低功耗、高性能的8位CMOS微控制器,具有8K的可编程Flash存储器。
同样具有AT89S51的功能,且具有在线编程可擦除技术,当对电路进行调试时,由于程序的错误修改或对程序的新增功能需要烧入程序时,不需要对芯片多次拔插,所以不会对芯片造成损坏。
综上所述,选择采用STC89C52作为主控制系统核心。
1.3 显示模块选择方案和论证方案一:采用LED数码管动态扫描,LED数码管价格适中,对于显示数字合适,采用动态扫描法与单片机连接时,虽然占用的单片机口线少,但连线还需要花费一点时间,所以也不用此种作为显示。
方案二:采用点阵式数码管显示,点阵式数码管是由八行八列的发光二极管组成,对于显示文字比较适合,若采用在显示数字显得太浪费,且价格也相对较高,所以在此也不用此种作为显示。
方案三:采用1602液晶显示屏,该液晶显示屏的显示功能强大,内置192种字符,可显示大量符号、数字,清晰可见,而且功率消耗小寿命长抗干扰能力强。
综上所述,在设计中采用1602液晶显示屏。
1.4 系统方案设计系统采用如图1所示的电路,通过STC89C52单片机直接扩展的独立键盘,完成排队取号流程(本系统直接利用系统的中断0按键控制),单片机控制LCD1602显示排队等待情况,控制蜂鸣器发声完成叫号功能。
图1采用独立键盘实现功能因为采用矩阵键盘完成排队取号流程,但客户较多的时候要实现排队取号的功能,就要占去过多的I/O端口,操作起来也比较复杂,而方案二的独立键盘操作控制简单,占用主机资源少,所以选择方案二,采用独立键盘控制排队取号,通过串行通信的方式,模拟排队取号管理系统的流程显得更加方便、科学。
2 系统硬件设计2.1 系统总电路系统电路由单片机部分,显示电路,时钟振荡电路,复位电路,叫号电路和按键电路组成。
图2 系统总电路图2.2 单片机处理部分设计设计的思想是简单实用,中心处理部分采用STC89C52单片机。
STC89C52单片机完全可以满足本系统的设计要求,相对于其他具有相当功能的器件来说,具有价格便宜,对环境要求不高,工作稳定等优点。
STC89C52高性能COMS 8位单片机,片内含4K Bytes的可反复擦写的只读程序存储器(ROM)和128 Bytes的随机存取数据存储器(RAM)。
具有32个可编程的I/O口,其中P 0口为一个8位漏极开路双向I/O口,编程时作为原码输入口,校验时,输出原码;P1口是一个内部提供上拉电阻的8位双向I/O口,在编程和校验时,作为第八位地址接收;P2口为一个内部上拉电阻的8位双向I/O口,在编程和校验时接收高八位地址信号和控制信号;P3口为8个带内部上拉电阻的双向I/O口,同时也偶一些特殊功能,我们所使用到的P3.6/WR可作为外部数据存储器写选通,P3.7/RD可作为外部数据存储器读选通;RST口为复位输入;XTAL1口为反向振荡放大器的输入及内部时钟工作电路的输入;XTAL2口为反向振荡器的输出。
89C52管脚功能如下图3 STC89C52管脚2.3 显示电路部分显示电路部分如下图所示,采用的是液晶显示屏1602模块,1602字符型LCD通常有14条引脚线或16条引脚线的LCD,多出来的2条线是背光电源线。
它可以显示两行,每行16个字符,采用单+5V电源供电,外围电路配置简单,价格便宜,具有很高的性价比。
STC89C52的P0.0至P0.7的8个端口用来控制数码管的显示。
图4 显示电路部分2.4 时钟振荡电路SCT98C52中有一个用于构成内部振荡器的高增益反向放大器,引脚XTAL1和XTAL2分别是该放大器的输入端和输出端。
这个放大器与作为反馈元件的片外石英晶体或陶瓷谐振器一起构成自激振荡器,震荡电路如图5所示。
因为一个机器周期含有6个状态周期,而每个状态周期为2个震荡周期,所以一个机器周期共有12个震荡周期,如果外接石英晶振的震荡频率为12MHz,故而一个机器周期为1uS 。
图5 时钟振荡电路外接石英晶体及电容C1、C2接在放大器的反馈回路中构成并联振荡电路。
对外接电容C1、C2虽然没有十分严格的要求,但电容容量的大小会轻微影响震荡频率的高低、震荡器工作的稳定性、起振的难易程度及温度稳定性。
外接石英晶体,电容使用30pF。
2.5 复位电路复位电路虽然简单,但其作用非常重要,一个单片机系统能否正常运行,首要检查是否能复位成功。
复位操作有上电自动复位和手动复位两种方式,本文采用手动复位方式。
手动复位是通过开关实现的其电路如图6所示。
在通电瞬间电容C通过电阻R充电,RST出现正脉冲,用以复位。
只要电源Vcc上升时间不超过1ms,就可以实现手动复位,即按下开关就可以实现系统的复位初始化。
关于参数的选定在震荡稳定后应保证复位高电平持续时间大于2个机器周期。
这里选用的是12MHz的石英晶振可取C=4.7uF,R=4.7K。
图6 复位电路2.6 叫号电路实现叫号的接口电路比较简单,其发音原件通常采用压电蜂鸣器,当在蜂鸣器两引脚加上+3V—+15V只留工作电压时,就能产生3KHz左右的蜂鸣器震荡音响。
压电式蜂鸣器结构简单、耗电少、更适合于单片机系统的应用。
压电式蜂鸣器,需要10mA的驱动电流,可在P3.1口接上一直三极管和电阻组成的驱动电路来驱动,如图7所示。
图7 叫号电路在图中,P3.1接三极管的极端输入端,当P3.1输出高电平时,三极管导通,蜂鸣器通电而发音,当P31输出低电平时,三极管截止,蜂鸣器停止发音。
2.7 按键电路按键电路实现的功能是取号和叫号,客户通过按键实现取号,工作人员通过按键实现叫号,使客户前来相应的窗口就诊,按键电路如图8所示。
图8 按键电路3 系统软件设计本程序可实现设计的基本要求,设备上电后,显示器屏幕亮,无信息显示。
当客户按键后,每按一下,队伍加1,显示器显示客户队伍号;排满20位后,再按取号键,屏幕显示“队伍满”。
当客服叫号时,队伍减1,程序进行信息处理,在显示器上显示“几号客户到几号窗口”,同时进行声音提示。
1602通过D0~D7的8位数据端传输数据和指令,其模块内的控制器有11条控制指令。
当液晶显示屏的接口电路与单片机系统I/O按照并行数据传输方式连接完成以后,即可以对STC89C52单片机进行编程。
在液晶屏完成显示之前首先要对液晶进行初始化。
程序流程图如图9所示。
图9总程序流程图4系统测试在Proteus上画出电路图,用C语言编写的程序,在Keil中生成hex文件,这样可在prteus中运行和仿真,实现排队叫号。
客户取号图如下图10 客户取号图服务叫号图如下图11 服务叫号图5 小结本次课程设计所做的是基于单片机的排队叫号机系统。
主要是为了解决大量客户的拥挤排队的问题,并同时使事业单位改善服务品质、提升营业形象。
排队系统完全模拟了人群排队全过程,通过取号进队、排队等待、叫号服务等功能,代替了人们站队的辛苦,把顾客排队等待的烦恼变成一段难得的休闲时光,使客户拥有了一个自由的空间和一份美好的心情。
在整个设计过程中,我充分发挥了人的主观能动性,自主学习,学到了许多课堂上没学到的知识。
程序编写中,由于思路不清晰,开始时遇到了很多的问题,经过静下心来思考查资料,和同学讨论,向老师请教,理清了思路,再加上先前做计算机控制技术课程设计积累的经验,完成对程序的编写。
进一步提高了对单片机的认识,进一步熟悉和掌握单片机的结构及工作原理。
通过实际程序设计和调试,逐步掌握模块化程序设计方法和调试技术,提高软件设计、调试能力;通过这次设计熟悉以单片机核心的应用系统开发的全过程,掌握硬件电路设计的基本方法和技术。
最终较好的完成了设计,达到了预期的目的,完了最初的设想。
经过了一个星期课设,我学到了不少课堂上未曾接触过的知识。
同时又把把以前没有学好的程序专业知识进行了补充和加强,加深了我对于单片机和数字电路的认识和理解,巩固了自己所学的专业知识,相信在以后的学习和工作中碰到这些基础的元器件我会更加得心应手。
参考文献[1] 四海科技.逸众排队管理系统[EB/OL].http://www.sea366.com/paidui _gs.asp.[2] 北京平安力合科技发展(集团)有限公司.中国排队产品市场分析[EB/OL].http://www.p-an.com/default.asp.[3] 刘守义.单片机应用技术[M].西安:西安电子科技大学出版社,2002.[4] 刘勇.数字电路[M].北京:电子工业出版社,2004.[5] 谭浩强.C程序设计[M].(第三版)北京:清华大学出版社,2005.256-278[6] 戴佳,戴卫恒.51单片机C语言应用程序设计实例精讲[M]北京:电子工业出版社,2006.附录源程序:#include<reg52.h>#define uint unsigned int#define uchar unsigned charuchar num,num1,a,b,c,d,e,f;uchar code table[]="number is "; uchar code table1[]="too much people"; uchar code table2[]="one two "; sbit lcdrs=P2^0;sbit lcdrw=P2^1;sbit lcde=P2^2;sbit buz=P3^1;sbit qu0=P3^2;sbit call1=P3^3;sbit call2=P3^4;void lcd_com(uchar com);void lcd_dat(uchar dat);void display(uchar add,uchar dat);void display1(uchar add,uchar dat);void keyscan();void delay(uint z);void startlcd();void start();void main(){start();startlcd();while(1){keyscan();}}void startlcd(){lcd_com(0x01);lcd_com(0x38);lcd_com(0x0c);lcd_com(0x06);lcd_com(0x80);for(num1=0;num1<16;num1++){lcd_dat(table[num1]);}lcd_com(0x80+0x40);for(num1=0;num1<16;num1++){lcd_dat(table2[num1]);}}void start(){buz=1;a=0;b=0;c=0;d=0;e=0;f=0;}void lcd_com(uchar com) {lcdrs=0;lcdrw=0;lcde=0;P0=com;lcde=1;lcde=0;delay(1);}void lcd_dat(uchar dat) {lcdrs=1;lcdrw=0;P0=dat;lcde=1;lcde=0;lcdrs=0;delay(1);}void display(uchar add,uchar dat) {uchar shi,ge;shi=dat/10%10;ge=dat%10;lcd_com(0x80+0x40+add);lcd_dat(0x30+shi);lcd_dat(0x30+ge);}void display1(uchar add,uchar dat) {uchar shi,ge;shi=dat/10%10;ge=dat%10;lcd_com(0x80+add);lcd_dat(0x30+shi);lcd_dat(0x30+ge);}void delay(uint z){uint x,y;for(x=0;x<z;x++)for(y=0;y<123;y++);}void keyscan(){if(qu0==0){delay(10);if(qu0==0){while(qu0==0); //松手检测,必须a++;if((a-e)>20){lcd_com(0x80);for(num1=0;num1<16;num1++){lcd_dat(table1[num1]);}buz=0;}else{for(num1=0;num1<16;num1++){lcd_dat(table[num1]);}buz=1;display1(10,a);}}}if(call1==0){delay(10);if(call1==0){while(call1==0); //松手检测,必须e++;if(e>a)e=a;display(4,e);if(e>100){e=e-100;a=a-100;}}}if(call2==0){delay(10);if(call2==0){while(call2==0); //松手检测,必须e++;if(e>a)e=a;display(13,e);if(e>100){e=e-100;a=a-100;}}}}//***液晶初始化函数****lcd_init(){write_1602com(0x38); //设置液晶工作模式,意思:16*2行显示,5*7点阵,8位数据write_1602com(0x0c); //开显示不显示光标write_1602com(0x06); //整屏不移动,光标自动右移write_1602com(0x01); //清显示write_1602com(yh+1); //日历显示固定符号从第一行第1个位置之后开始显示for(a=0;a<14;a++){write_1602dat(tab1[a]); //向液晶屏写日历显示的固定符号部分//delay(3);}write_1602com(er+2); //时间显示固定符号写入位置,从第2个位置后开始显示for(a=0;a<8;a++){write_1602dat(tab2[a]); //写显示时间固定符号,两个冒号//delay(3);}}。