当前位置:文档之家› 排队叫号系统

排队叫号系统

湖南人文科技学院课程设计报告课程名称:单片机原理及应用课程设计设计题目:排队叫号机系别:信工系专业:物理与电子信息工程班级: 13级电信一班学生姓名: 尹明曹培林学号: 13409146 13409122 起止日期: 2015-12-20至2015-12-30 指导教师:谢四莲成绩评定项目权重成绩姓名1 姓名21、设计过程中出勤、学习态度等方面0.22、课程设计质量与答辩0.53、设计报告书写及图纸规范程度0.3总成绩指导教师评语:指导教师签名:年月日摘要排队叫号管理系统(排队机、叫号机)是针对银行、工商、税务、通讯、政府机构等部门的大厅工作流程设计的,是利用电脑的科学管理客户排队的系统,很好地解决了客户在服务机构办理业务时所遇到的各种排队、拥挤和混乱现象,为客户办理业务带来莫大的方便和愉悦。

本课题研究的目的是研制一款无人排队的排队叫号机,它主要由主控制器、键盘、数码管显示电路、蜂鸣器电路等部分构成。

系统利用单片机进行控制,通过串行通信方式传输处理数据;通过按键取号,在数码管上显示排队的号码以及当前正在等待的人数;通过按键叫号,在数码管上显示叫到的号码,由扬声器发出声音提示客户。

同时免除了令客户不舒服的站立式排队,这种现代化的高科技产品彻底解决了银行、医院等服务性企业普遍存在的站立等候,服务无序的问题,深化并完善了服务的质量。

本系统采用单片机进行控制,利用数码管显示,蜂鸣器鸣叫提示的人机交互界面,模拟排队管理系统,科学地处理各种排队情况。

操作简便,控制灵活,显示清晰,制作成本低,性价比较高。

关键词:排队叫号机;串行通信;独立键盘;数码管动态显示;蜂鸣器目录1 方案论证 (4)2主要芯片功能介绍 (5)2.1 STC89C52 (5)2.2 74HC138及74HC245引脚功能说明 (7)3 硬件电路设计 (9)3.1总体设计电路 (9)3.2排队取号控制电路 (9)3.3排起取号电路 ................. 错误!未定义书签。

4.1程序流程图 (10)5系统功能测试与整体指标 (11)5.1 硬件测试 (11)5.2软件调试 (11)6 总结与思考及致谢 (11)参考文献 (11)附录一:详细元件清单 (12)附录二:详细系统源程序 (12)排队叫号机设计要求利用单片机的串行通信方式,完成一个科学管理各种复杂排队情况的排队叫号系统。

具体要求如下:(1)主机:通过按键来完成报号,由数码管显示叫到的号码,并发出蜂鸣声。

(2)客户端:通过按键完成取号,由数码管显示号码和当前需要等待的人数。

(3)主机和客户端用串口通信。

1 方案论证系统采用如图所示的电路,系统采用如图所示的电路,通过STC89C52单片机直接扩展的独立键盘,完成排队取号流程(本系统直接利用系统的中断0按键控制),单片机控制数码管显示排队等待情况控制蜂鸣器发声完成叫号功能。

数码显示独立键盘STC89C52(从机)STC89C52(主机)蜂鸣器(主机)数码显示独立键盘2主要芯片功能介绍2.1 STC89C521.STC89C52单片机简介STC89C52是美国ATMEL公司推出的系列单片机,将多种功能的8位CPU与FPEROM(快闪可编程/擦除只读存储器)结合在一个芯片上,是一种低功耗、高性能的CMOS控制器,为很多嵌入式控制应用提供了非常灵活而又价格适宜的方案,其性能价格比远高于同类芯片。

它与MCS-51指令系统兼容,片内FPEROM 允许对程序存储器在线重复编程,也可用常规的EPROM编程器编程,可循环写入/擦除1000次。

STC89C52内含4KB的FPEROM,一般的EEPROM的字节擦除时间和写入时间基本上均为10ms,对于任一个实时控制系统来说,这样长的时间是不可能在线修改程序的。

其内部结构框图如图3所示:图3 STC89C52内部结构图与EEPROM相比较,FPEROM大大缩短了存储内容擦除和写入的时间,为在线改写程序提供了极大的方便,而且价格也比带EPROM87C系列单片机便宜,这更显示出了89C系列的优越性。

它还有128*8Bit的片内RAM;32根I/O线;2个16位定时/计数器;5个中断源;一个全双工的异步串行口;间歇和掉电工作模式;三级程序存储器加密;全静态工作,晶振工作范围:0Hz—24MHz。

2.管脚功能STC89C52单片机为40引脚芯片如图4所示。

①I/O口线: P0、P1、P2、P3共四个八位标准双向口。

P0口是三态双向口, 通称数据总线口, 因为只有该口能直接用于对外部存储器的读写操作。

P0口也用以输出外部存储器的低8位地址。

由于是分时输出, 故应在外部加锁存器将此地址数据锁存, 地址锁存信号用ALE。

P1口是专门供用户使用的I/O口, 是准双向口。

P2口是从系统扩展时作高8位地址线用。

不扩展外部存储器时, P2口也是标准双向口。

P3口是双功能口, 该口的每一位均可独立地定义为第一I/O 功能或第二I/O功能,作为第一功能使用时操作同P1口,P3口的第二功能如表1。

图4 STC89C52引脚图②控制口线: PSEN (片外取控制)、ALE( 地址锁存控制)、EA (片外储器选择)。

③电源及时钟: VCC、VSS;XTAL1,XTAL2。

表1 引脚功能表2.2 74HC138及74HC245引脚功能说明引脚图如下所示:74HC245:74HC138:当一个选通端(G1)为高电平,另两个选通端(/(G2A)和/(G2B))为低电平时,可将地址端(A、B、C)的二进制编码在一个对应的输出端以低电平译出。

利用G1、/(G2A)和/(G2B)可级联扩展成24 线译码器;若外接一个反相器还可级联扩展成32 线译码器。

3 硬件电路设计3.1总体设计电路按照课程设计要求,结合单片机系统特点,排队叫号总体设计电路如图所示:4系统软件设计4.1程序流程图 否是是 否初始化判断从机是否取号数码管显示当前人数向主机发送数据主机接收数据主机是否叫号 蜂鸣器响应数码管显示叫到的号码5系统功能测试与整体指标5.1 硬件测试第一步:目测。

检查外部的各种元件或则电路是否有断点;第二步:用万用表测试。

先用万用表复核目测中有疑问的连接点,再检测各种电源线与地线之间是否有短路现象。

第三步:加电检测。

给板加电,检测所有的插座或是器件的电源端是否符合要求的值。

第四步:联机检查。

因为只有用单片机开发系统才能完成对用户系统的调试。

5.2软件调试软件调试是通过对用户程序的汇编、连接、执行来发现程序中存在的语法错误与逻辑错误并加以排除纠正的过程。

程序后,编辑,查看程序是否有逻辑的错误。

6 总结与思考及致谢(1) 通过本次课程设计,加深了对于怎样学好单片机这门课程的理解,学单片机就是要多实践,老师领我们进入单片机世界,精通它就得靠我们自己,那就是多实践,灵活运用自己所学知识到自己的作品当中。

(2) 在程序设计过程中遇到的很多问题,阻碍设计的过程,通过总结,深深体会到程序设计的时候模块化处理的重要性,可以先画好程序流程图,然后各个模块各个击破。

同时遇到问题时可以同学之间相互讨论、回到书本在学习,更有助于加深对所学知识的理解。

参考文献[1] 张鑫.单片机原理及应用[M].北京:电子工业出版社,2005.8.[2] 邱关源、罗先觉.电路[M].北京:高等教育出版社,2006.5.[3] 康光华.电子技术基础.数字部分[M].北京:高等教育出版社,2006.1.[4] 康光华.电子技术基础.模拟部分[M].北京:高等教育出版社,2006.1.[5] 祁伟, 杨亭. 单片机C51程序设计教程与实验[M].北京:北京航空航天大学出版社,2006.[6] 楼然苗.李光飞.单片机课程设计指导[M].北京:北京航空航天大学出版社,2007.4[7] 单片机学习网[8]谢四莲.王善伟.李石林.单片机原理及应用——基于项目教学附录一:详细元件清单仪器名称数量STC89C52芯片2个按键3个电阻29个数码管6块PCB板1块杜邦线2根电源线1根附录二:详细系统源程序排队叫号机程序:取号程序:#include<reg52.h>sbit addr3=P1^3;sbit enled=P1^4;sbit keyout1=P2^3;sbit keyin1=P2^4;unsigned char T0RH = 0;unsigned char T0RL = 0;void delay(unsigned int z);void ConfigTimer0(unsigned int ms);unsigned char code LedChar[] = {0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E };unsigned char LedBuff[6] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; //数码管缓冲unsigned char getdate;unsigned char allman;void main(){addr3=1;enled=0;keyout1=0;EA=1;ConfigTimer0(1);//串口设置SCON=0x50;PCON=0x00;TMOD&=0x0f;TMOD|=0x20;TH1=0xFD;TL1=0xFD;TR1=1;while(1){if(RI){RI=0;delay(5);allman=SBUF;}if(keyin1==0){delay(100);if(keyin1==0){allman++;getdate++;if(allman>=100)allman=0;}}LedBuff[0]=LedChar[allman%10];LedBuff[1]=LedChar[allman/10%10];LedBuff[2]=0xbf;LedBuff[3]=LedChar[getdate%10];LedBuff[4]=LedChar[getdate/10%10];SBUF=allman;if(TI){TI=0;delay(5);}}}void delay(unsigned int z){unsigned int x,y;for(x=z;x>0;x--)for(y=125;y>0;y--);}void ConfigTimer0(unsigned int ms) //T0配置函数{unsigned long tmp;tmp = 11059200/12; //定时器计数频率tmp = (tmp * ms)/1000; //计算所需的计数值tmp = 65536 - tmp; //计算定时重载值tmp = tmp + 18; //修正中断响应延时造成的误差T0RH = (unsigned char)(tmp >> 8); // 定时器重载值拆分为高低字节T0RL = (unsigned char)tmp;TMOD &= 0xF0;TMOD |= 0x01;TH0 = T0RH;TL0 = T0RL;ET0 =1;TR0 = 1;}void LedScan() //?????{static unsigned char i = 0;P0 = 0xFF;P1 = (P1 & 0xF8) | i;P0 = LedBuff[i];if (i < 5)i++;elsei = 0;}void InterruptTimer0() interrupt 1{TH0 = T0RH;TL0 = T0RL;LedScan();}叫号程序:#include<reg52.h>sbit addr3=P1^3;sbit enled=P1^4;sbit keyout1=P2^3;sbit keyin1=P2^4;sbit beep=P1^6;unsigned char flag = 0;unsigned char getdate =0;unsigned char allman;unsigned char T0RH = 0;unsigned char T0RL = 0;void delay(unsigned int z);unsigned char LedBuff[6] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};//数码管显示缓冲区,初值0XFF确保启动时都不亮unsigned char code LedChar[] = {0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E };void ConfigTimer0(unsigned int ms);void beeper();void main(){enled=0;addr3=1;keyout1=0;EA=1;ConfigTimer0(1);SCON=0x50; //设置串口工作方式1PCON=0x00;TMOD&=0x0f; //清零T1控制位TMOD|=0x20; //配置T1为模式2TH1=0xFD;TL1=0xFD; //设置TH1.TL1初值TR1=1;LedBuff[0]=LedChar[getdate%10];LedBuff[1]=LedChar[getdate/10%10];while(1){if(RI){RI=0;delay(5);allman=SBUF;if(keyin1==0){delay(100);if(keyin1==0){if(allman != 0){getdate++;allman--;flag = 1;}else{allman = allman;getdate = getdate;flag = 0;}LedBuff[0]=LedChar[getdate%10];LedBuff[1]=LedChar[getdate/10%10];SBUF=allman;if(TI){TI=0;delay(5);}if(flag){beeper();}}}else{beep=0;}}}}void beeper(){unsigned char i,j,k;for(i=0;i<18;i++){for(j=0;j<250;j++){for(k=0;k<120;k++) ;beep=!beep;}for(j=0;j<130;j++){for(k=0;k<120;k++) ;}}}void ConfigTimer0(unsigned int ms)//T0配置函数{unsigned long tmp;tmp = 11059200/12;tmp = (tmp * ms)/1000;tmp = 65536 - tmp;tmp = tmp + 18;T0RH = (unsigned char)(tmp >> 8);T0RL = (unsigned char)tmp;TMOD &= 0xF0;TMOD |= 0x01;TH0 = T0RH;TL0 = T0RL;ET0 =1;TR0 = 1;}void LedScan(){static unsigned char i = 0;P0 = 0xFF;P1 = (P1 & 0xF8) | i;P0 = LedBuff[i];if (i < 5)i++;elsei = 0;}void delay(unsigned int z){unsigned int x,y;for(x=z;x>0;x--)for(y=125;y>0;y--);}void InterruptTimer0() interrupt 1 {TH0 = T0RH;TL0 = T0RL;LedScan();}。

相关主题