排队叫号系统(带源程序)
- 格式:doc
- 大小:226.30 KB
- 文档页数:14
2011年至2012年第一学期《银行排队叫号系统设计》课程设计班级1006402指导教师涂立、李旎学生人数 3设计份数 12011年12月23日银行排队叫号系统设计报告一.设计时间2011年12月 19日——---12月23日二.设计地点湖南城市学院实验楼计算机机房三.设计目的1.进一步熟悉和掌握单片机的结构及工作原理。
2.掌握单片机的接口技术及相关外围芯片的外特性,控制方法。
3.通过课程设计,掌握以单片机核心的电路设计的基本方法和技术,详细使用Protel软件绘制原理图的过程.4.通过实际程序设计和调试,逐步掌握模块化程序设计方法和调试技术。
四.实验成员及分工五。
指导老师涂立副教授、李旎讲师.六.设计课题设计一个银行排队叫号系统。
理由: 1、系统原理容易理解,更贴近我们的生活。
2、怎个系统简洁明了,适于初学者。
3、能提高我们的综合应用能力。
七.基本思路及关键问题的解决方法用八个二极管表示客户取号的号码和营业员准备给那位客户办理业务的号码,用二进制表示,亮的二极管表示0,灭的二极管表示为1 。
开关KEY为客户取号码是所用,KEY闭合时八个二极管的亮灭顺序就是客户的号码。
开关KEY1,KEY2,KEY3,KEY4是分别在四个营业窗口,其中任意一个按下,八个二极管的亮灭会显示一个号码,此号码对应要办理业务客户的号码,与此同时蜂鸣器也会提醒客户。
八.算法及流程图算法:程序利用循环结构检测整个系统中的客户端和叫号端是否有按键被按下,如果检测到有按下的信号,首先判断按下按键的端口的类型,然后相应的计数变量加一,并把计数变量的信息以二进制的形式传送到相应的端口;如果没检测到按下信号,程序则跳入下一个循环继续检测按键信息。
表1 元件清单芯片晶振发光二级管电容电源按键蜂鸣器导线P87C52X2BN11.0592MHZLED10uf、30pf5V非自锁式1183181若干图1。
银行排队叫号系统原理图图2. 银行排队叫号系统流程图九、调试过程中出现的问题及相应解决办法1.开打keil软件,建立一个新工程单击【Project】在下拉菜单中找到【New project。
课程设计任务书课程名称:课程设计1(数据结构)设计题目:银行排队叫号系统1.问题描述:目前,在以银行营业大厅为代表的窗口行业,大量客户的拥挤排队已成为了这些企事业单位改善服务品质、提升营业形象的主要障碍。
排队(叫号)系统的使用将成为改变这种状况的有力手段。
排队系统完全模拟了人群排队全过程,通过取票进队、排队等待、叫号服务等功能,代替了人们站队的辛苦,把顾客排队等待的烦恼变成一段难得的休闲时光,使客户拥有了一个自由的空间和一份美好的心情。
排队叫号软件的具体操作流程为:●顾客取服务序号。
当顾客抵达服务大厅时,前往放置在入口处旁的取号机,并按一下其上的相应服务按钮,取号机会自动打印出一张服务单。
单上显示服务号及该服务号前面正在等待服务的人数。
●银行职员呼叫顾客,顾客的服务号就会按顺序的显示在显示屏上。
当一位顾客办事完毕后,柜台银行职员只需按呼叫器相应键,即可自动呼叫下一位顾客。
2. 功能要求:1)使用数组或链表以及C#接口和范型技术实现通用的队列功能;2)编写算法,利用队列模拟银行排队系统;3)利用多窗口分别模拟顾客取服务号、银行窗口服务顾客。
3.界面要求:用户界面设计不做统一规定,但应做到界面友好,易于操作。
4. 技术要求:要求利用面向对象的方法以及队列数据结构来完成系统的设计;在设计的过程中,建立清晰的类层次;在系统设计中要分析和定义各个类,每个类中要有各自的属性和方法;要求运用面向对象的机制来实现系统功能。
5.创新要求在基本要求达到后,可以进行创新设计(包括界面、功能、数据结构)。
6. 课程设计时间:1周(18课时)7. 课程设计的考核方式及评分方法1)考核方式⏹课程设计结束时,在机房当场验收。
⏹教师提供测试数据,检查运行结果是否正确。
⏹回答教师提出的问题。
⏹学生提交课程设计文档(A4纸打印)2)评分方法上机检查及答辩: 书面报告: 学习态度= 6 : 3 : 1,没有通过上机检查的其成绩直接记录不及格。
排队叫号系统的设计与实现毕业设计排队叫号系统的设计与实现毕业设计导言排队叫号系统在各个行业中广泛应用,如医院、银行、餐厅等。
它的设计和实现涉及到多个方面,例如用户体验、系统稳定性等。
本文将从深度和广度两个方面对排队叫号系统的设计与实现进行全面评估,并给出个人观点和理解。
一、排队叫号系统概述1.1 什么是排队叫号系统排队叫号系统是一种通过电子化方式管理和控制人群排队顺序的系统。
其主要功能包括叫号、排队管理、叫号记录等。
这个系统通常由硬件设备和软件程序组成,用户通过取号机或手机APP进行取号,然后等待被叫号。
1.2 排队叫号系统的重要性排队叫号系统不仅提高了服务效率,还提升了用户体验和工作效率。
通过系统化地管理排队顺序,可以避免客户等待时间过长以及拥挤的人群场景。
这个系统对于后台的数据统计和分析也提供了便利,可以更好地优化工作流程和资源分配。
二、排队叫号系统的设计与实现2.1 用户需求分析在设计排队叫号系统之前,需要对用户需求进行详细分析。
不同行业的用户需求可能有所不同,如医院用户需求主要是等待时间减少和服务效率提高,而银行用户则更关注服务质量和系统稳定性。
根据不同行业和用户需求的差异,可以调整系统的设计和功能。
2.2 系统架构设计排队叫号系统的系统架构设计要考虑到系统的稳定性和扩展性。
一个良好的系统架构设计可以提高系统的性能和容错能力。
可以采用分布式架构,将排队管理和数据存储分离,在高并发情况下,有效提高系统的处理能力。
2.3 界面设计与用户体验用户体验是排队叫号系统设计中非常重要的一环。
界面设计要简洁明了,方便用户操作和理解。
可以提供多种语言版本和主题以满足不同用户群体的需求。
用户操作流程要简化,减少用户等待时间和操作步骤。
2.4 数据管理与分析排队叫号系统会产生大量的数据,包括用户叫号信息、等待时间、服务时长等。
这些数据可以用于后期的数据分析和服务优化。
可以采用大数据分析技术,对用户等待时间、服务质量等进行统计和分析,以便优化服务流程和资源分配。
排队叫号系统技术方案引言随着社会的发展和人们生活水平的提高,各种服务行业如银行、医院、餐厅等面临的客流量不断增长。
为了提高客户满意度和服务效率,排队叫号系统应运而生。
本文将介绍排队叫号系统的技术方案,包括系统架构、功能模块和技术实现等内容。
系统架构排队叫号系统的整体架构可以分为前端、后端和数据库三个部分。
前端前端是与用户直接交互的界面,包含以下功能模块:•取号功能:用户通过前端界面选择服务类型,并获取对应的排队号码。
•叫号显示功能:前端界面显示当前叫号的号码以及窗口信息。
用户可以实时了解自己的位置。
•排队信息查询功能:用户可以通过前端界面查询当前排队信息,了解自己的等待时间。
前端可以采用Web页面、移动App等形式。
采用Web页面的好处是不需要用户下载和安装App,可以通过浏览器轻松访问系统。
后端后端是系统的核心部分,包含以下功能模块:•排号算法:根据不同的服务类型和窗口设置,对用户进行排队。
•叫号逻辑:根据排队算法决定当前叫号的号码以及窗口信息。
•数据统计和报表:统计每日、每周、每月的客流量,并生成相应的报表统计数据。
后端可以采用Java、Python等语言进行开发。
使用现代编程语言能够提高代码的可读性和维护性。
数据库数据库用于存储排队叫号系统的数据,包括用户信息、队列信息、窗口信息、服务类型等。
同时,数据库还可以支持数据统计和报表生成。
数据库可以选择关系型数据库(如MySQL、Oracle)或非关系型数据库(如MongoDB、Redis)。
关系型数据库适合存储结构化数据,而非关系型数据库适合存储半结构化数据。
功能模块排队叫号系统包含以下功能模块:用户管理该模块用于管理用户的基本信息,包括用户姓名、手机号码、身份证号码等。
用户在取号时需要提供基本信息以便系统进行排队和叫号。
服务类型管理该模块用于管理不同的服务类型,包括银行业务、医院挂号、餐厅用餐等。
每个服务类型都对应一套排队规则和窗口设置。
取号管理该模块用于用户取号,用户通过前端界面选择服务类型,系统会自动为用户分配一个排队号码。
排队系统设计方案燕大正洋电子有限公司2007年四月排队系统方案一、系统简介目前,在以营业大厅为代表的窗口行业,大量客户的拥挤排队已成为了这些企事业单位改善服务品质、提升营业形象的主要障碍。
排队(叫号)系统的使用将成为改变这种状况的有力手段。
排队系统完全模拟了人群排队全过程,通过取票进队、排队等待、叫号服务等功能,代替了人们站队的辛苦,把来访者排队等待的烦恼变成一段难得的休闲时光,使客户拥有了一个自由的空间和一份美好的心情。
1、某营业厅需采用排队系统管理。
具体如下:***在营业厅内设计1台发号主机及1台滚动点阵双行主显示屏或数码滚动双行主显示屏;***每个营业点设1台叫号机及1个数码窗口显示屏或1台点阵窗口显示屏***若采用电脑管理,需增配相应软件2、排队系统可以通过排队叫号,显示系统(大屏幕技术、流媒体技术、电视墙)、语音系统,为用户提供新一代的宣传媒体和广告媒体的运行平台,同时显示新产品发布、新业务介绍、调查结果显示。
3、系统器材组成:发号主机PD-50-88、叫号机PD-50-30(可带IC/ID卡)、点阵滚动双行主显示屏PD-50-32H或数码滚动双行主显示屏PD-50-32、数码窗口显示屏PD-50-31或点阵窗口显示屏PD-50-31H、中继分线盒PD-50-08、开关电源PD-50-6A、打印纸PD-50-71、统计软件PD-50-81二、排队等待流程三、四、系统的基本功能及技术参数1、发号主机(PD-50-88)功能***发号主机:含面板,支架,主控模块,打印模块等;***支架采用全模具成型制造,外形美观、大方;***主控模块有自检功能,可自动检查、判别显示故障类别;停电后能自动记忆全部资料,来电时不影响系统工作;***打印模块含中、英文字库,采用韩国三星打印机机芯,打印号票清晰,内容可以编辑。
***安装简捷,只需一条八芯网络总线与外部配置相连;***多对列主机可同时服务8个队列、管理80个工作窗口。
主函数:#include "stdafx.h"#include "Queue.h"#include "stdio.h"int main(int argc, char* argv[]){Queue s;s.q[0] = 0; // 让入队的第一个数取数值1int a=1, b=0 ,d=1 ,e=0;char c;while(a) // 运用switch实现选择{printf("顾客要号请输入A \n要提示下一位下一位顾客的号码请输入B \n 要显示等待的人数请输入C\n结束循环请输入D \n ");c= getchar();while(getchar()!='\n') continue ;switch(c){case 'A':;case 'a':// 顾客要号之后让元素入队s.addQ();b = s.getQ();printf("顾客要的号码为:%d\n", b);break;case 'B ': ;case'b':// 删除队首元素即显示要来办理业务的顾客d = s.delQ();printf("请%d号客户前来柜台办理业务\n", d);case 'C ':;case 'c':// 显示等待的人数e = s.number();printf("等待的总人数为:%d\n", e);break;case 'D' :;case 'd':// 结束循环c=0;break;default:printf("输入错误!\n");}}printf("Hello World!\n");return 0;}队列的建立:(类)Queue.h#if !defined(AFX_QUEUE_H__BA389AF8_C207_4C3E_8A7F_99499FBBA143__I NCLUDED_)#defineAFX_QUEUE_H__BA389AF8_C207_4C3E_8A7F_99499FBBA143__INCLUDED _#if _MSC_VER > 1000#pragma once#endif // _MSC_VER > 1000#define M 1000class Queue // 定义队列名{public:Queue();void initialQ();int emptyQ (); // 定义队空int getQ(); // 取队首元素int addQ(); // 入队int delQ(); // 出队int number(); // 统计队列元素数目int q[M]; // 定义数组qint front; //定义队首元素int rear ; //定义队尾元素virtual ~Queue();};#endif// !defined(AFX_QUEUE_H__BA389AF8_C207_4C3E_8A7F_99499FBBA143__I NCLUDED_)Queue.cpp:// Queue.cpp: implementation of the Queue class.////////////////////////////////////////////////////////////////////////#include "stdafx.h"#include "Queue.h"#define M 1000//////////////////////////////////////////////////////////////////////// Construction/Destruction//////////////////////////////////////////////////////////////////////Queue::Queue(){front = 0;rear = 0;}int Queue::emptyQ() //初始化队列{return front == rear;}int Queue::getQ() // 取队首元素{if(rear+1==front)return 0;else{int item;item=q[rear];return item;}}int Queue::addQ() // 入队{if((rear+1)%M==front)return 0;else{q[rear+1] = q[rear] + 1 ; // 每次入队依次使入队元素的值加1,即表示顾客叫号依次递增rear ++; //实现循环return 1;}}int Queue::delQ() //删除队首元素{if((front ==rear))return 0;else{int item;front=(front+1)%M;item=q[front];return item;}}int Queue:: number() // 统计队列元素的数目{int item;item = q[rear] - q[front];return item;}Queue::~Queue(){}。
排队叫号系统设计方案排队叫号系统是一种用于医疗、银行、邮局等场所的管理系统,可以提高工作效率、减少等待时间,提升用户体验。
以下是一个基本的排队叫号系统设计方案:硬件设备:1.叫号机:用于发出叫号信息,包括当前叫号号码、窗口号等。
2.叫号器:用于发出叫号声音和显示叫号号码,可以是电子屏幕或者语音提示设备。
3.号码发放机:用于生成并发放叫号号码,可以是纸质号码牌或者电子号码牌。
4.取号机:用户可以通过取号机自助取得一个叫号号码。
5.窗口显示器:用于显示当前窗口服务对象的叫号号码。
软件设计:1.取号功能:用户通过取号机自助取得一个叫号号码,系统会自动向用户展示当前等待人数,并将用户的叫号号码显示在窗口显示器上。
2.叫号功能:系统通过叫号机发出叫号信息,包括当前叫号号码和窗口号码,用户可以根据叫号信息到指定窗口办理业务。
3.排队叫号逻辑:系统按照先到先服务的原则,依次叫号,用户到达窗口后,窗口人员确认用户身份和需求,并进行业务办理。
4.多窗口管理:系统可以支持多个窗口,并可以根据窗口人员的工作情况自动分配号码给各窗口。
5.监控数据统计:系统可以实时监控每个窗口的工作情况,包括叫号次数、办理业务用时等,通过数据分析可以对服务质量进行评估和优化。
6.设置等候时间:系统可以根据窗口的办理速度和等候人数估计每个用户的等候时间,并向用户展示。
系统流程:1.用户到达场所后,通过取号机自助取得一个叫号号码,并将号码显示在窗口显示器上。
2.系统通过叫号机发出叫号信息,用户根据叫号信息到指定窗口办理业务。
3.窗口人员确认用户身份和需求,并进行业务办理。
4.窗口办理完当前用户的业务后,系统自动叫号下一个用户。
5.系统可以实时监控每个窗口的工作情况,并通过数据分析对服务质量进行评估和优化。
以上是一个基本的排队叫号系统设计方案,可以根据具体需求进行定制和改进。
通过排队叫号系统,可以优化服务流程,提高工作效率,提升用户体验。
排队叫号系统技术方案排队叫号系统技术方案1. 系统概述排队叫号系统是一种用于优化排队流程的技术方案。
通过使用排队叫号系统,用户可以避免长时间等待并提高办事效率。
本文将介绍排队叫号系统的技术方案,包括系统架构、主要功能和实施步骤。
2. 系统架构排队叫号系统主要包括以下几个部分:•服务器端:用于管理和控制整个系统的中央服务器。
服务器端负责处理用户请求、生成排队号码、分配对应的办理窗口等功能。
•客户端:安装在用户终端设备上,用于向服务器端发送请求,并接收和显示排队号码以及相关信息。
•办理窗口设备:每个办理窗口都需要安装一个设备,用于接收服务器端分配的排队号码,并在完成业务后通知服务器端。
下图展示了排队叫号系统的整体架构:-------- -------- --------| | | | | || 客户端1 | <--> | 服务器 | <--> |窗口设备1|| | | | | |-------- -------- --------| || || |-------- --------| | |窗口设备2|| 客户端2 | <--> | || | | |-------- --------3. 主要功能排队叫号系统具有以下主要功能:•排队叫号:用户通过客户端向服务器端发送请求,服务器端根据当前排队情况和窗口可用情况生成一个排队号码,并通知用户。
•实时排队信息显示:客户端会实时显示当前排队号码、预计等待时间、办理窗口信息等。
用户可以根据实时信息来调整等待时间。
•窗口管理:服务器端会监控窗口设备的工作状态和办理情况。
在窗口设备完成一项业务后,会向服务器端发送通知,服务器端会根据当前排队情况为窗口设备分配下一个排队号码。
•统计与报表:系统可以记录每个用户的办理情况,包括等待时间、办理时间等,并生成统计与报表,用于分析排队状况和优化系统效率。
4. 实施步骤实施排队叫号系统的步骤如下:1.需求分析:与业务部门合作,明确排队叫号系统的具体需求。
c语言课程设计排队叫号系统一、教学目标本课程的教学目标是使学生掌握C语言的基本语法,能够运用C语言设计简单的排队叫号系统。
通过本课程的学习,学生将能够理解C语言的基本数据类型、运算符、控制结构、函数等知识,具备一定的编程能力,能够运用C语言解决实际问题。
具体来说,知识目标包括:1.掌握C语言的基本数据类型和运算符。
2.理解控制结构,如if语句、循环语句等。
3.了解函数的定义和调用。
技能目标包括:1.能够使用C语言编写简单的程序。
2.能够运用控制结构解决实际问题。
3.能够编写和调用函数。
情感态度价值观目标包括:1.培养学生的编程兴趣,提高学生的自主学习能力。
2.培养学生的团队协作意识,提高学生的沟通表达能力。
3.使学生认识到编程在实际生活中的重要性,培养学生的创新思维。
二、教学内容根据课程目标,本课程的教学内容主要包括C语言的基本语法、数据类型、运算符、控制结构、函数等。
具体安排如下:1.第一章:C语言概述。
介绍C语言的历史、特点和基本语法。
2.第二章:数据类型和运算符。
讲解C语言的基本数据类型和运算符。
3.第三章:控制结构。
讲解if语句、for循环、while循环等控制结构。
4.第四章:函数。
讲解函数的定义、声明和调用。
5.第五章:排队叫号系统设计。
运用所学知识设计一个简单的排队叫号系统。
三、教学方法为了激发学生的学习兴趣和主动性,本课程将采用多种教学方法,如讲授法、讨论法、案例分析法、实验法等。
1.讲授法:用于讲解C语言的基本语法、数据类型、运算符、控制结构、函数等知识点。
2.讨论法:通过小组讨论,让学生相互学习,共同解决问题。
3.案例分析法:分析实际案例,让学生学会将所学知识运用到实际问题中。
4.实验法:让学生动手编写程序,培养学生的编程能力。
四、教学资源为了支持教学内容和教学方法的实施,丰富学生的学习体验,我们将选择和准备以下教学资源:1.教材:《C语言程序设计》。
2.参考书:《C语言编程实例解析》。
综合性设计性实验报告专业:软件工程班级:*** 组别: ***——***学年第 2 学期课程名称Unix高级编程指导教师***Weibo昵称:年年有余事事顺利本组成员学号姓名实验地点逸夫楼A实验时间***-06-08实验类型实践课实验名称银行排队叫号模拟系统实验环境: VMware虚拟机实验内容:编程实现一个“银行排队模拟系统”1)该程序模拟客户到银行取号-排队-被叫号-被服务的过程;2)程序执行流程如下:Step1: 客户到达银行,并从取号机取号;Step2: 如果大厅中有空闲座位,则座下等待,否则,在大厅外等待;Step3: 银行职员如果发现有客户等待,则依次叫号服务,否则休息;Step4: step1-step4重复执行3)大厅中座椅数量为20个;4)服务窗口为2个;5)“客户到来”通过命令行输入客户名字模拟;6)为了模拟实际情况,每个客户服务时间不小于20秒,可随机确定;7)程序顺序列出不同窗口服务客户的:名称,窗口号,服务时间2、提示1)需一个主控进程,随时监控客户到来,并为之创建进程;2)取号机应视为互斥型临界资源3)座椅应视为临界资源4)客户等待及被叫号应视为进程间同步过程实验目的与要求:掌握常用IPC方法能够应用IPC方法解决实际编程问题设计思路:(设计原理、设计方案及流程等)设计原理:“银行排队模拟系统”由于进程之间通信需要进行相应进程通信机制实现,进程通信机制很多,比如信号量、管道、消息队列、套接字等通过我们组的讨论决定用信号量机制的函数来实现,因此通过我们组的讨论决定以这样的方式来进行设计:通过信号量机制<signal.h>创建子进程fork()的过程来实现设计方案:主控进程即服务进程需完成以下任务:1.创建信号量集,并为之初始化2.监督客户的到来(实时循环)3.客户输入名字后,为客户创建子进程。
4.子进程进行相关操作。
实现与主进程的同步。
5.服务进程等待有人(p操作)(P(S3))p成功,显示窗口信息6.服务进程叫号(v操作)(V(S4))7.v成功,则进行服务子进程完成的操作:1.取号(因互斥有对取号的互斥信号量S1初值1)2.申请椅子(有资源信号量S2 初值20)(P(S2))3.唤醒柜员(告知柜员有人故有同步信号量S3,初值为0) (V(S3))4.等待叫号(故有同步信号量S4,初值为0,S3,S4实现父子进程的同步) (P(S4))5.4通过,输出客户名字5.4通过,则释放椅子(V(S2))8.显示服务时间(不少于20s)程序流程:Step1: 客户到达银行,并从取号机取号;Step2: 如果大厅中有空闲座位,则座下等待,否则,在大厅外等待;Step3: 银行职员如果发现有客户等待,则依次叫号服务,否则休息;Step4: step1-step4重复执行大厅中座椅数量为20个;服务窗口为2个;“客户到来”通过命令行输入客户名字模拟;为了模拟实际情况,每个客户服务时间不小于20秒,可随机确定;程序顺序列出不同窗口服务客户的:名称,窗口号,服务时间提示:需一个主控进程,随时监控客户到来,并为之创建进程;取号机应视为互斥型临界资源座椅应视为临界资源客户等待及被叫号应视为进程间同步过程关键技术分析:1)使用信号量机制-int crt_sig(key_t key,int nsems)2)创建一个子进程 pid_t crt_child()3)使用消息队列-int msg_stat(int msqid,structmsqid_ds msg_info)4)使用sem-op函数来设置程序的申请与释放,sem_op>0对应相应进程要释放sem_op数目的共享资源;sem_op=0可以用于对共享资源是否已用完的测试; sem_op<0相当于进程要申请-sem_op个共享资源5)利用函数void srand()和rand()来获取系统的服务时间等实验步骤:编写程序:源代码为:#include<stdio.h>#include<stdlib.h>#include<unistd.h>#include<string.h>#include<sys/types.h>#include<sys/ipc.h>#include<sys/wait.h>#include<time.h>#include<sys/sem.h>#include<signal.h>#include<errno.h>#define N_SEC 20static union semun{int val;struct semid_ds *buf;unsigned short * array;struct seminfo *__buf;}arg;int BeginWaiter(int sems,int num) {int id=-1;if(!(id=fork()))//child{while(1){struct sembuf op={2,-1,0};if(-1==semop(sems,&op,1))exit(0);op.sem_num=3;op.sem_op=1;if(-1==semop(sems,&op,1))exit(0);///serviceint random=1+(int)(20.0*rand()/(RAND_MAX*1.0));printf("\n********\n%d is on duty,serve time=%d\n***********\n",num,20+random);sleep(10+random);}}elsereturn id;}int main(int argc, char *argv[]){printf("parent id=%d\n",getpid());int sems=semget(IPC_PRIVATE,5,0666);union semun arg;unsigned short init_v[5]={1,20,0,0,0};arg.array=init_v;semctl(sems,0,SETALL,arg);char custom[100]="";////////////////////////srand(0);int s1=BeginWaiter(sems,0);int s2=BeginWaiter(sems,1);printf("Waiters are:%d,%d",s1,s2);//////////////while(1){printf("Welcome!please input you name:");scanf("%s",custom);if(!strcmp(custom,"exit")){semctl(sems,0,IPC_RMID,arg);kill(SIGKILL,s1);kill(SIGKILL,s2);exit(0);}if(!fork())//child{struct sembuf ops={0,-1,0};semop(sems,&ops,1);//p mutex,alternativeops.sem_num=4,ops.sem_op=1;semop(sems,&ops/*(struct sembuf*)&{4,1,0}*/,1);//get ticketops.sem_num=0;ops.sem_op=1;semop(sems,&ops/*(struct sembuf*)&{0,1,0}*/,1);//V mutex.alternative/////////////////////ops.sem_num=1;ops.sem_op=-1;semop(sems,&ops/*(struct sembuf*)&{1,-1,0}*/,1);//compete for seatint seats=semctl(sems,1,GETVAL,arg);printf("\nThere are %d seates remained\n",seats);////////////////ops.sem_num=2;ops.sem_op=1;semop(sems,&ops/*(struct sembuf*)&{2,1,0}*/,1);//wake waiter upops.sem_num=3;ops.sem_op=-1;semop(sems,&ops/*(struct sembuf*)&{3,-1,0}*/,1);//wait for called forops.sem_num=1;ops.sem_op=1;semop(sems,&ops/*(struct sembuf*)&{1,1,0}*/,1);//release seat;//get serviceprintf("\n**********\ncustom:%s\n**************\n",custom);exit(0);}}}运行结果如下:实验分析:明确题意 ----要求的是编写小程序,非传统意义上的系统。
排队叫号系统方案简介排队叫号系统是一种用于管理并优化顾客排队等待的系统。
它可以帮助机构提高服务质量、减少等待时间,并提升客户满意度。
本文将介绍一个基于数字技术的排队叫号系统方案,旨在提供一个高效、可靠的解决方案。
系统功能排队叫号系统方案应具备以下主要功能: 1. 生成唯一的排队号码:系统应能够为每位到达的顾客生成唯一的排队号码,以确保每位顾客的顺序准确无误。
2. 实时显示叫号信息:系统应能够在显示屏上实时展示当前叫号信息,包括当前叫号号码和预计等待时间。
3. 语音叫号功能:系统应支持语音播报叫号信息,以便于顾客能够清晰地听到自己的叫号信息。
4.多种叫号方式:系统应支持多种叫号方式,如数字屏幕显示、语音播报、手机App推送等,以满足不同顾客的需求。
5. 客户管理功能:系统应能够管理顾客的基本信息,如姓名、联系方式等,以便机构能够更好地服务顾客并进行后续跟踪和统计分析。
6. 统计报表功能:系统应能够生成各种统计报表,包括顾客到达次数、平均等待时间、服务满意度等,以帮助机构对服务质量进行评估和改进。
系统架构排队叫号系统方案的整体架构如下图所示:系统架构系统主要由以下几个组件组成: - 排队机:用于生成唯一的排队号码,并与其他组件进行数据交互。
- 显示屏:用于实时展示当前叫号信息,包括当前叫号号码和预计等待时间。
- 语音模块:用于播报叫号信息,确保顾客能够清晰地听到自己的叫号信息。
- 客户管理系统:用于管理顾客的基本信息,如姓名、联系方式等。
- 统计分析系统:用于生成各种统计报表,帮助机构对服务质量进行评估和改进。
系统流程排队叫号系统方案的主要流程如下: 1. 顾客到达:顾客到达机构后,将被要求提供基本信息,并由排队机为其生成唯一的排队号码。
2. 叫号显示:系统根据顾客的排队顺序,在显示屏上实时展示当前叫号信息,包括当前叫号号码和预计等待时间。
3. 语音叫号:系统通过语音模块,根据顾客的排队顺序,将叫号信息以语音方式播报出来,以便于顾客听到。
排队叫号系统施工方案一、引言。
排队叫号系统是指通过电子设备为顾客提供排队叫号服务,使顾客无需长时间等待,能够提前预约或者通过取号系统进行排队等候,提高顾客的就餐体验和服务效率。
本文档旨在制定排队叫号系统的施工方案,确保系统能够稳定运行,满足顾客和商家的需求。
二、系统设计。
1. 系统组成。
排队叫号系统主要由叫号机、显示屏、取号设备、后台管理系统等组成。
叫号机用于发放顾客的叫号信息,显示屏用于显示当前叫号信息和等候顾客的人数,取号设备用于顾客取号,后台管理系统用于管理叫号信息和统计数据。
2. 系统布局。
根据商家的实际情况,排队叫号系统的设备布局应该合理分布在就餐区域,保证顾客能够方便地取号和等候。
同时,显示屏的位置应当明显,能够让所有顾客都能够看到当前的叫号信息。
三、施工流程。
1. 设备安装。
首先,需要对叫号机、显示屏、取号设备进行安装,确保设备能够正常运行。
安装过程中需要注意设备的稳固性和安全性,避免设备出现倾斜或者摇晃的情况。
2. 系统调试。
安装完成后,需要对整个系统进行调试,确保设备能够正常工作。
包括叫号机的叫号功能、显示屏的显示功能、取号设备的取号功能以及后台管理系统的数据管理功能等。
3. 系统联调。
排队叫号系统需要与商家的现有系统进行联调,确保系统能够与现有系统无缝对接,实现叫号信息的同步和数据的共享。
四、系统优化。
1. 用户体验优化。
在系统施工完成后,需要对系统的用户体验进行优化。
包括叫号机的操作界面设计、显示屏的信息展示方式、取号设备的操作流程等,都需要考虑顾客的使用习惯和便利性。
2. 故障排除。
系统施工完成后,需要对系统进行全面的故障排查,确保系统能够稳定运行。
同时,需要建立健全的故障处理机制,及时处理系统出现的故障情况。
五、总结。
排队叫号系统的施工方案需要充分考虑系统的设计、施工流程、系统优化等方面,确保系统能够稳定运行,提高商家的服务效率,提升顾客的就餐体验。
在系统施工过程中,需要严格按照方案进行操作,确保系统能够按照预期效果进行运行。
c 排队叫号系统课程设计一、课程目标知识目标:1. 学生能理解排队叫号系统的基本原理和流程。
2. 学生能掌握利用编程实现排队叫号系统的关键步骤。
3. 学生了解并掌握队列数据结构在排队叫号系统中的应用。
技能目标:1. 学生能运用所学知识设计和编写简单的排队叫号系统程序。
2. 学生能通过实际操作,分析并解决排队叫号系统中出现的问题。
3. 学生能运用团队协作、沟通与表达技巧,完成项目任务。
情感态度价值观目标:1. 学生培养对计算机科学的兴趣和热情,激发学习编程的积极性。
2. 学生通过项目实践,认识到编程在解决实际问题中的价值,增强自信心。
3. 学生在团队协作中学会尊重他人、关心同伴,培养良好的团队精神和沟通能力。
本课程针对高年级学生,结合教材内容,注重理论与实践相结合,培养学生运用编程知识解决实际问题的能力。
课程设计充分考虑学生的认知水平、学习兴趣和个性特点,旨在提高学生的编程技能、团队协作能力和创新思维。
通过本课程的学习,使学生能够明确学习目标,达成具体的学习成果。
二、教学内容1. 排队叫号系统基本原理:介绍排队叫号系统的概念、作用和基本组成部分,引导学生理解其实际应用场景。
2. 队列数据结构:讲解队列的基本概念、操作方法,以及队列在排队叫号系统中的应用。
3. 编程实现排队叫号系统:结合教材相关章节,教授如何使用编程语言(如Python)设计和实现排队叫号系统。
- 系统设计:分析系统需求,设计系统功能模块。
- 编程实践:编写代码实现排队、叫号、查询等功能。
4. 排队叫号系统优化:探讨如何提高系统效率,降低等待时间,如优先级队列、多队列处理等策略。
5. 项目实践与展示:分组进行项目实践,每组完成一个排队叫号系统的设计和实现,并进行展示和交流。
教学内容根据课程目标和教材章节进行合理安排,注重科学性和系统性。
教学进度分为五个阶段,每个阶段对应具体的教学内容,确保学生能够逐步掌握排队叫号系统的设计与实现。
通过项目实践,培养学生将理论知识应用于实际问题的能力。
DeskDriver[i].enable=1; //开启允许无线发送DeskDriver[i].sendCount=0 /初始值 0 表示发送次数为 0,发送一次加 1 DeskDriver[i].sendOK=0; //初始值 0 表示没发送成功}}}#endifif(RCVCOMP_ID==1)//task1接收完成,发送数据{IO1CLR=IO1CLR|LED1;DelayNS(20);IO1SET=IO1SET|LED1;DelayNS(20);IO1CLR=IO1CLR|LED1;DelayNS(20);IO1SET=IO1SET|LED1;RCVCOMP_ID=0;UART0_SendBuf();UART0_SendBufEx(RcvBuf,RCV_LEN1+2); RcvBuf[0]=0x05;RFSendPacket((char*)RcvBuf,17);}if(SCAN_ID==1){SCAN_ID=0;KeyScan();}//task3发送柜台号if(SendDesk_ID==1){SendDesk_Pro();SendDesk_ID=0;}#ifdef WATCHDOGIRQDisable();WDFEED = 0xAA;WDFEED = 0x55;IRQEnable();#endif}return 0;}void DelayNS (uint32 dly)//从机地址//task2按键扫描//看门狗喂狗//关中断//第一次喂狗启动 WDT//喂狗序列//开中断{uint32 i;for ( ; dly>0; dly--)for (i=0; i<50000; i++);}//短延时子程序void delay(uint8 t){ uint8 i,j;for(i=0;i<t;i++)for(j=0;j<10;j++);}void VAR_Init(void){uint8 i;set.datab= 8; //串口数据位set.stopb= 1; //串口住手位set.parity = rcv_new = 0; RSMCHR=0; RSMCHR=0; RSSMS_ID=0; ;/串口校验位//串口接收完数据标志//接收数据暂存变量//判断接收数据用标志//直接接收数据标志RCVCOMP_ID=0; SCAN_ID=1; INPUT1=0; INPUT1_ID=1; Desk_NUM=0x5 0;SendDesk_ID=0; timerCount=0;//接收完成标志//按键扫描定时标志//按键扫描去颤动计数//按键按下放开标志//柜台号,初始值为无效柜台号//发送柜台号标志//定时器计数变量for(i=0;i<MaxDeskNum;i++){DeskDriver[i].allow10s=1; //初始值 1 为 10 秒已经过去,可以接受按键柜台号DeskDriver[i].keyScaned=0;//初始值 0 表示还没有按键柜台号被接受DeskDriver[i].sendCount=0;//初始值 0 表示发送次数为 0,发送一次加 1DeskDriver[i].sendOK=0; //初始值 0 表示没发送成功DeskDriver[i].timeCnt=0; //初始值 0,定时计数为 0,每秒加 1DeskDriver[i].enable=1; //初始值 1 表示允许发送}}void IO_Init(void){PINSEL0 = 0x00000005; //设置 I/O连接到 UART0PINSEL0 =PINSEL0 |0x00050000 ; //配置 UART1 引脚功能PINSEL0 =PINSEL0 |0x00005500 ; /置 SPI 总线引脚 0.4sck 0.5miso 0.6mosi0.7SSELPINSEL1 = 0x00000001; //配置 p0.16 TI_CC_GDO0_PIN 为外部中断引脚IO0DIR = 0x00000000;IO1DIR = 0x00000000;IO1DIR = IO1DIR|IO1DIR|LED1|LED2|LED3|LED4; //连 LED 的引脚配置为输出引脚IO0DIR=IO0DIR|KEY_R1 | KEY_R2| KEY_R3| KEY_R4; //行线引脚配置为出输出引脚IO0DIR=IO0DIR|MOSI0|SCLK0|TI_CC_CSn_PIN; //配置 SPI 的 cs 片选为输出MOSI0|SCLK0|EXTMODE=0x01; EXTPOLAR=0x00; }void TC0_Init(void) //EINT0使用边沿激活//下降沿或者低电平有效{T0TC T0PR T0M CRT0MR0T0TCR = 0;= 0;= 0x03; =Fpclk / 50; =0x01;//定时器设置为 0//时钟不分频//设置 T0MR0 匹配后复位 T0TC ,并产生中断标志//20毫秒 100 则 10ms 定时,修改定时间隔只需修改除数//启动定时器}void __irq IRQ_Timer0 (void){timerCount++;if(timerCount>20) //0.4秒计数{timerCount=0;#ifdef WIRLTESTTimerSend_ID=1;#endifif(IO1PIN&LED2) IO1CLR=IO1CLR|LED2;else IO1SET=IO1SET|LED2;time1sCount++;if(time1sCount>=3){time1sCount=0;UpdataDesk();} sendDeskNum();}SCAN_ID=1;T0IR = 0x01; VICVectAddr = 0x00; }//1.6秒执行一次//更新柜台号结构体的信息//发送柜台号给 pc 端//开启按键扫描//清除中断标志,并复位中断//通知 VIC 中断处理结束void UpdataDesk(void) {uint8 i;for(i=0;i<MaxDeskNum;i++){if(DeskDriver[i].allow10s==0) //按键按下还没有过 10s 限定时间{DeskDriver[i].timeCnt++;if((DeskDriver[i].timeCnt==2) | (DeskDriver[i].timeCnt==4) | (DeskDriver[i].timeCnt==5)) { DeskDriver[i].enable=1; //每隔 3 秒允许发送}if(DeskDriver[i].timeCnt>=7/超过限定时间,开启允许接收按键,并更新整个结构体{DeskDriver[i].allow10s=1;DeskDriver[i].keyScaned=0;//初始值 0 表示还没有按键柜台号被接受DeskDriver[i].sendCount=0;//初始值 0 表示发送次数为 0,发送一次加 1DeskDriver[i].sendOK=0;DeskDriver[i].timeCnt=0;DeskDriver[i].enable=1;}}}}//初始值 0 表示没发送成功//初始值 0,定时计数为 0,每秒加 1 //初始值 1 表示允许发送//end forvoid sendDeskNum(void){uint8 i;for(i=0;i<MaxDeskNum;i++) //论询所有柜台结构,看是否有满足发送条件的{if((DeskDriver[i].keyScaned==1)&(DeskDriver[i].sendOK==0)&(DeskDriver[i].enable==1)) { DeskLoadBuf(i); //将柜台号转载到发送缓冲区RFSendPacket(SendBuf, PAKT_LEN+1); //无线发射DeskDriver[i].sendCount++;DeskDriver[i].enable=0;return;}}}void DeskLoadBuf(uint8 deskNum) //发送次数加 1 //关闭允许发送{SendBuf[0]=OPPO_ADDR; //对方无线地址SendBuf[1]='a'; //打头关键字SendBuf[2]='b';SendBuf[3]=(char)deskNum; //柜台号码SendBuf[4]=0x0d;SendBuf[5]=0x0a;}//结尾关键字#ifdef WATCHDOGvoid WATCHDOG_Init(void){while(( WDMOD & 0x04 ) == 0x04) {WDMOD = 0x00;} //判断看门狗超时标志/ 软件清零看门狗超时标志位WDTC = 0x5f0000;WDMOD = 0x03;IRQDisable();WDFEED = 0xAA;WDFEED = 0x55;IRQEnable();}//设置看门狗定时器参数//设置看门狗模式:中断且复位//关中断//第一次喂狗启动 WDT//喂狗序列//开中断#endifint8 UART0_Init (uint32 baud, UARTMODE set) {uint32 bak;/* 参数过滤 */if ((baud ==0 ) || (baud > 115200)) return (0);if ((set.datab <5) || (set.datab > 8)) return (0);if ((set.stopb == 0) || (set.sto t r ))(0);if (set.parity >r urn (0);/* 设置串口波特率 */U0LCR = 0x80;bak = (Fpclk >> 4) / baud; (Fpclk/16)/16U0DLM = bak >> 8;bak/256 // DLAB = 1 使能除数所存访问//外设时钟左移四位相当于除以 16 相当于//除数高位取 16 位分频值的高 8 位相当于U0DLL = bak & 0xFF; //除数低位取 16 位分频值的低 8 位相当于bak%256/* 设置串口模式 */bak = set.datab - 5; //设置字长if (set.stopb ==b |= 0x04;//判断是否为 2 位住手位if (set.parity != 0){set.parity = set.parity - 1;bak |= 0x08;}bak |= set.parity << 4; U0LCR =(bak&0x7F); //设置奇偶校验//DLAB 除数访问位置 0 ,用于访问接收发送寄存器U0FCR = 0x01;U0IER = 0x01;return (1);}void __irq IRQ_UART0 (void){if ((U0IIR & 0x0F) == 0x04) {RSMCHR = U0RBR;if(RSSMS_ID==0) judge_RCV();else direct_RCV();}VICVectAddr = 0x00;}void judge_RCV(void){if (HDM1_ID==0) //使能FIFO ,并设置触发点为 8 字节//允许 RBR 中断,即接收中断//通过读取 U0IIR 来清除中断//读取接收的数据//直接保存到接收数组//中断处理结束//第一次判断{if(RSMCHR==cnPUREDA TCHR1){HDM1_ID=1;RcvBuf[0]=RSMCHR;}}else{if(RSMCHR==cnPUREDATCHR2){RcvBuf[1]=RSMCHR;RSSMS_ID=1;RSMLEN=RCV_LEN1;RcvPointer=2;HDM1_ID=0;}else{HDM1_ID=0;}}}void direct_RCV(void){RcvBuf[RcvPointer]=RSMCHR;//判断为点阵数据关键字 1 0xaa //保存关键字 1//第二次判断//判断为点阵数据关键字 2 0x55//保存关键字 1//置直接保存数据标志//置接收数据长度//置接收数据指针为 2//向接收数据缓冲区保存数据RcvPointer++;RSMLEN--;if (RSMLEN==0){RCVCOMP_ID=1;RSSMS_ID=0;RcvPointer=2;}} //接收缓冲区地址加 1//接收长度减 1//当接收长度变为 0 时,置相应标志//置接收完成标志//清除直接接收数据标志//接收数据缓冲区地址归位void {} void {} void {UART0_SendBuf (void)uint8 i;for (i=0; i<(RCV_LEN1+2); i++)U0THR =RcvBuf[i];while ((U0LSR & 0x20) == 0);//等待数据发送完毕UART0_SendBufEx (char * buffer ,uint8 len)uint8 i;for (i=0; i<(len); i++)U0THR =buffer[i];while ((U0LSR & 0x20) == 0);//等待数据发送完毕VIC_Init(void)IRQEnable();VICIntSelect = 0x00000000; VICVectCntl0 = 0x20 | 14; //使能 IRQ 中断//设置所有的通道为 IRQ 中断//分配 EINT0 中断到向量中断 1VICVectAddr0 = (uint32)IRQ_Eint0;//设置中断服务程序地址VICVectCntl2 = 0x20 | 0x06; // UART0 分配到 IRQ slot,0 即最高优先级VICVectAddr2 = (uint32)IRQ_UART0; //设置 UART0 向量地址VICVectCntl1 = 0x20 | 0x04; //设置定时器 0 中断通道分配向量中断 1VICVectAddr1 = (uint32)IRQ_Timer0; /置中断服务程序地址VICIntEnable =(1<<14) | (1 << 0x06) | (1<<0x0使4);能//SPI 中断&UART0 中断和定时器 0 中断}uint8 KeyScan(void){uint8 nRes = 0;IO0CLR = IO0CLR|KEY_R1|KEY_R2|KEY_R3|KEY_R4; //行线输出全部输出高电平delay(5); //读取各个管脚的状态,判断是列线引脚是否有低电平浮现if(((IO0PIN&KEY_C1)==0) | | ((IO0PIN&KEY_C2)==0) | | ((IO0PIN&KEY_C3)==0) | | ((IO0PIN&K EY_C4)==0)){INPUT1++; //每 20ms 扫描一次,浮现低电平的次数计数if (INPUT1>=8) //超过一定次数,说明按键按下已经稳定,读取按键{if (INPUT1_ID==1) //为 0,表示按键按下未放开,当按键向来按下时,只进行一次处理{INPUT1_ID=0;nRes =KeyProcess();return nRes;}}}else{INPUT1=0;INPUT1_ID=1;}return 0;}uint8 KeyProcess(void)//列线无低电平浮现,计数清零//没有输入,为干扰*/{uint8 nResult = 0;//第一行输出低电平IO0CLR = IO0CLR|KEY_R1;IO0SET = IO0SET|KEY_R2|KEY_R3|KEY_R4;delay(2);if((IO0PIN&KEY_C1)==0) nResult = 4;if((IO0PIN&KEY_C2)==0) nResult = 3;if((IO0PIN&KEY_C3)==0) nResult = 2;if((IO0PIN&KEY_C4)==0) nResult = 1;if(nResult !=0 )goto result;//第三行输出低电平IO0CLR = IO0CLR|KEY_R3;IO0SET = IO0SET|KEY_R1|KEY_R2|KEY_R4;delay(2);if((IO0PIN&KEY_C1)==0) nResult = 12;if((IO0PIN&KEY_C2)==0) nResult = 11;if((IO0PIN&KEY_C3)==0) nResult = 10;if((IO0PIN&KEY_C4)==0) nResult = 9;if(nResult !=0 )goto result;//第二行输出低电平IO0CLR = IO0CLR|KEY_R2;IO0SET = IO0SET|KEY_R1|KEY_R3|KEY_R4; delay(2);if((IO0PIN&KEY_C1)==0) nResult = 8;if((IO0PIN&KEY_C2)==0) nResult = 7;if((IO0PIN&KEY_C3)==0) nResult = 6;if((IO0PIN&KEY_C4)==0) nResult = 5;if(nResult !=0 )goto result;//第二行输出低电平IO0CLR = IO0CLR|KEY_R4;IO0SET = IO0SET|KEY_R1|KEY_R2|KEY_R3; delay(2);if((IO0PIN&KEY_C1)==0) nResult = 16;if((IO0PIN&KEY_C2)==0) nResult = 15;if((IO0PIN&KEY_C3)==0) nResult = 14;if((IO0PIN&KEY_C4)==0) nResult = 13;/ 取各个管脚的状态result:Desk_NUM=nResult; SendDesk_ID=1;//保存柜台号//置发送柜台号标志if(DeskDriver[Desk_NUM].allow10s==1) {DeskDriver[Desk_NUM].allow10s=0;DeskDriver[Desk_NUM].keyScaned=1;DeskDriver[Desk_NUM].timeCnt=0;DeskDriver[Desk_NUM].enable=1;DeskDriver[Desk_NUM].sendCount=0; 1DeskDriver[Desk_NUM].sendOK=0;}return nResult;} //开始限定时间,在限定时间内不接受按键//接受按键,并置按下标志//计数归零//开启允许无线发送//初始值 0 表示发送次数为 0,发送一次加//初始值 0 表示没发送成功void SendDesk_Pro(void) {if (Desk_NUM==0x55) return;DeskBuf[0]='a';DeskBuf[1]='b';DeskBuf[2]=Desk_NUM;DeskBuf[3]=0x0d;DeskBuf[4]=0x0a;UART0_SendBufEx(DeskBuf,5);Desk_NUM=0x55;} //无效柜台号,返回//发送完毕,将柜台号置为无效柜台号void TI_CC_SPISetup(void){IO0SET=IO0SET|TI_CC_CSn_PIN ; //设置片选信号无效片选低电平有效PINSEL0 = (PINSEL0 & (~(0xFF << 8))) | (0x55 << 8) ; //设置管脚状态SPCCR = 0x52;SPCR = (0 << 3) |(1 << 4) |(1 << 5) |(0 << 6) |(0 << 7); }//设置 SPI 时钟分频 // CPHA = 0,数据在 SCK 的第一个时钟沿采样// CPOL = 1, SCK为低有效// MSTR = 1, SPI处于主模式 // LSBF = 0, SP数I据传输 MSB ( 位 7)在先// SPIE = 0, S I断被禁止Delay , ((cycles-15) % 6) + 15void TI_CC_Wait(unsigned int cycles0) {uint16 cycles=cycles0*56;while(cycles>15)cycles = cycles - 6;}void TI_CC_PowerupResetCCxxxx(void) {IO0SET=IO0SET|TI_CC_CSn_PIN; TI_CC_Wait(30);IO0CLR=IO0CLR|TI_CC_CSn_PIN; TI_CC_Wait(30);IO0SET=IO0SET|TI_CC_CSn_PIN; TI_CC_Wait(45);IO0CLR=IO0CLR|TI_CC_CSn_PIN; while (IO0PIN&SOMI0);SPDR = TI_CCxxx0_SRES; while( 0 == (SPSR & 0x80)); while (IO0PIN&SOMI0);IO0SET=IO0SET|TI_CC_CSn_PIN; }void writeRFSettings(void)//设置片选信号无效//设置片选信号有效//设置片选信号无效//至少 40us//设置片选信号有效//等待 CCxxxx 准备好//发送命令复位//等待 SPIF 置位,即等待数据发送完毕//等待 CCxxxx 准备好//设置片选信号无效{Write register settingsTI_CC_SPIWriteReg(TI_CCxxx0_IOCFG2, 0x0B); // GDO2输出脚配置(连续时钟) .TI_CC_SPIWriteReg(TI_CCxxx0_IOCFG0, 0x06);//GDO0 输出脚配置(当同步词汇发送/收到时声明,在数据端末尾时反声明) .TI_CC_SPIWriteReg(TI_CCxxx0_SYNC1, 0xD3); //同步词汇高字节.TI_CC_SPIWriteReg(TI_CCxxx0_SYNC0, 0x91); / 步词汇低字节.TI_CC_SPIWriteReg(TI_CCxxx0_PKTLEN, 0x11); /数/据包长度 (17).TI_CC_SPIWriteReg(TI_CCxxx0_PKTCTRL1, 0x05); //数据包自动控制(开启附加字节;地址检查,无广播) .TI_CC_SPIWriteReg(TI_CCxxx0_PKTCTRL0, 0x04);//数据包自动控制 (开启 CRC ; 固定长度数据包) .TI_CC_SPIWriteReg(TI_CCxxx0_ADDR,HOME_ADDR); // 设备地址. TI_CC_SPIWriteReg(TI_CCxxx0_CHANNR, 0x10); /信/道数 (16).TI_CC_SPIWriteReg(TI_CCxxx0_FSCTRL1, 0x06); /频/率合成器控制(软件给出) . TI_CC_SPIWriteReg(TI_CCxxx0_FSCTRL0, 0x00); /频/率合成器控制(软件给出) . TI_CC_SPIWriteReg(TI_CCxxx0_FREQ2, 0x10);//频率控制词汇, 高字节(软件给 .TI_CC_SPIWriteReg(TI_CCxxx0_FREQ1, 0xA7); //频率控制词汇, 中字节(软件给 .TI_CC_SPIWriteReg(TI_CCxxx0_FREQ0, 0x62);//频率控制词汇, 低字节(软件给 .TI_CC_SPIWriteReg(TI_CCxxx0_MDMCFG4, 0x2a);//调制器配置(信道滤波带宽: 101.56K) .TI_CC_SPIWriteReg(TI_CCxxx0_MDMCFG3, 0x83); /调/制器配置(数据率 38.4k) .TI_CC_SPIWriteReg(TI_CCxxx0_MDMCFG2, 0x11); /调/制器配置( GFSK 格式; 15/16 同步词汇侦测) .TI_CC_SPIWriteReg(TI_CCxxx0_MDMCFG1, 0x22); /调/制器配置( FEC ,前导数目) . TI_CC_SPIWriteReg(TI_CCxxx0_MDMCFG0, 0xF8); // 调 制 器 配 置 ( 信 道 空 间 199.951172 .TI_CC_SPIWriteReg(TI_CCxxx0_DEVIATN, 0x34); /调/制器背离配置(软件给出 19k) TI_CC_SPIWriteReg(TI_CCxxx0_MCSM1 , 0x3F); / 通信控制状态机配置(完成后 保持在 RX ) .TI_CC_SPIWriteReg(TI_CCxxx0_MCSM0 , 0x18); /主/通信控制状态机配置(软件给 出) (下同) .TI_CC_SPIWriteReg(TI_CCxxx0_FOCCFG, 0x16); /频/率便宜补偿配置. TI_CC_SPIWriteReg(TI_CCxxx0_BSCFG, 0x6C); //位同步配置. TI_CC_SPIWriteReg(TI_CCxxx0_AGCCTRL2, 0x43); // AGC 控制. TI_CC_SPIWriteReg(TI_CCxxx0_AGCCTRL1, 0x40); // AGC 控制. TI_CC_SPIWriteReg(TI_CCxxx0_AGCCTRL0, 0x91); // AGC 控制. TI_CC_SPIWriteReg(TI_CCxxx0_FREND1, 0x56); /前/末端 RX 配置. TI_CC_SPIWriteReg(TI_CCxxx0_FREND0, 0x10); /前/末端 TX 配置. TI_CC_SPIWriteReg(TI_CCxxx0_FSCAL3, 0xA9); //频率合成器校准. TI_CC_SPIWriteReg(TI_CCxxx0_FSCAL2, 0x2A); //频率合成器校准. TI_CC_SPIWriteReg(TI_CCxxx0_FSCAL1, 0x00); /频/率合成器校准. TI_CC_SPIWriteReg(TI_CCxxx0_FSCAL0, 0x11); /频/率合成器校准. TI_CC_SPIWriteReg(TI_CCxxx0_FSTEST, 0x59); /产/品测试.TI_CC_SPIWriteReg(TI_CCxxx0_TEST2, 0x81); /不/同的测试设置.TI_CC_SPIWriteReg(TI_CCxxx0_TEST1,TI_CC_SPIWriteReg(TI_CCxxx0_TEST0, } void TI_CC_SPIWriteReg(char addr, char{ IO0CLR=IO0CLR|TI_CC_CSn_PIN;0x35); /不/同的测试设置. 0x0B); //不同的测试设置.value)//设置 片选信号有效出) 出) 出)while (IO0PIN&SOMI0);SPDR = addr;while( 0 == (SPSR & 0x80));SPDR = value;while( 0 == (SPSR & 0x80));IO0SET=IO0SET|TI_CC_CSn_PIN; }//等待 CCxxxx 准备好//等待 SPIF 置位,即等待数据发送完毕//等待 SPIF 置位,即等待数据发送完毕//设置片选信号无效void TI_CC_SPIWriteBurstReg(char addr, char *buffer, char count) {char i;#ifdef WIRLUART#endifIO0CLR=IO0CLR|TI_CC_CSn_PIN;while (IO0PIN&SOMI0);SPDR = addr | TI_CCxxx0_WRITE_BURST; while( 0 == (SPSR & 0x80));for (i = 0; i < count; i++){SPDR = buffer[i];while( 0 == (SPSR & 0x80)); } IO0SET=IO0SET|TI_CC_CSn_PIN;#ifdef WIRLUART//设置片选信号有效//等待 CCxxxx 准备好//发送首地址//等待 SPIF 置位,即等待数据发送完毕//挨次发送数据//等待 SPIF 置位,即等待数据发送完毕//设置片选信号无效#endif}void __irq IRQ_Eint0(void){if(RFReceStadPacket(rcv_buf,PAKT_LEN+1,AddState)/)/接收数据包和附加字节( RSSI,CRC,LQI ){LoadRcvBuf();SendDate(rcv_buf,AddState);if(IO1PIN&LED2)IO1CLR=IO1CLR|LED1;elseIO1SET=IO1SET|LED1;#ifdef WIRLUARTrcv_buf[3]=rcv_buf[3]+0x30;UART0_SendBufEx((char*)(&(rcv_buf[3])),1);#endifTI_CC_SPIStrobe(TI_CCxxx0_SFRX); //冲洗 RX BUFFER}else{TI_CC_SPIStrobe(TI_CCxxx0_SIDLE); //置空暇模式TI_CC_SPIStrobe(TI_CCxxx0_SCAL); //手动校正频率合成器TI_CC_SPIStrobe(TI_CCxxx0_SFRX); //冲洗 RX BUFFERTI_CC_SPIStrobe(TI_CCxxx0_SFTX); //冲洗 RX BUFFERTI_CC_SPIStrobe(TI_CCxxx0_SRX);#ifdef WIRLUART//转为接收模式#endif}#ifdef WIRLUART#endifEXTINT = 0x01;VICVectAddr = 0x00;}//清除 EINT0 中断标志char RFReceStadPacket(char *rxBuffer,char length,char *status){if ((TI_CC_SPIReadStatus(TI_CCxxx0_RXBYTES) & TI_CCxxx0_NUM_RXBYTES)) { #ifdef WIRLUART#endifTI_CC_SPIReadBurstReg(TI_CCxxx0_RXFIFO, rxBuffer, length)弹; /数据TI_CC_SPIReadBurstReg(TI_CCxxx0_RXFIFO, status, 2);/ 附加字节暂未使用return (char)(status[TI_CCxxx0_LQI_RX]&TI_CCxxx0_CRC_OK);}else{return 0; //报错}}char TI_CC_SPIReadStatus(char addr){char x;uint32 i;i=0;IO0CLR=IO0CLR|TI_CC_CSn_PIN; while (IO0PIN&SOMI0){if(i>5000){//设置片选信号有效//等待 CCxxxx 准备好#ifdef WIRLUART#endifreturn 0;}//超时返回i++; }SPDR =(addr | TI_CCxxx0_READ_BURST);// 发送读取数据的地址while( 0 == (SPSR & 0x80)); SPDR = 0;while( 0 == (SPSR & 0x80)); x = SPDR;IO0SET=IO0SET|TI_CC_CSn_PIN; #ifdef WIRLUARTch[0]=x;UART0_SendBufEx(ch,1);#endifreturn x;//等待 SPIF 置位,即等待数据发送完毕//写入哑函数以读取数据//等待 SPIF 置位,即等待数据发送完毕//读出数据//设置片选信号无效//此处不能有串口发送函数,时间会影响//TI_CC_SPIReadBurstReg//返回寄存器的值}void TI_CC_SPIReadBurstReg(char addr, char *buffer, char count) {unsigned int i;IO0CLR=IO0CLR|TI_CC_CSn_PIN;while (IO0PIN&SOMI0);SPDR = (addr | TI_CCxxx0_READ_BURST);//设置片选信号有效//等待 CCxxxx 准备好//发送首地址while( 0 == (SPSR & 0x80));for (i = 0; i < count; i++){//等待 SPIF 置位,即等待数据发送完毕SPDR = 0 ;while (0 ==(SPSR & 0x80));buffer[i] = SPDR;}IO0SET=IO0SET|TI_CC_CSn_PIN; }void TI_CC_SPIStrobe(char strobe) //读出数据//设置片选信号无效{uint32 i;#ifdef WIRLUART #endifIO0CLR=IO0CLR|TI_CC_CSn_PIN; while (IO0PIN&SOMI0){ //设置片选信号有效//等待 CCxxxx 准备好if(i>5000){#ifdef WIRLUART#endifreturn ; //超时返回}i++;}SPDR = strobe;while( 0 == (SPSR & 0x80));IO0SET=IO0SET|TI_CC_CSn_PIN; #ifdef WIRLUART//发送命令滤波//等待 SPIF 置位,即等待数据发送完毕//设置片选信号无效#endif}void RFSendPacket(char *txBuffer, char size){#ifdef WIRLUART#endifTI_CC_SPIWriteBurstReg(TI_CCxxx0_TXFIFO, txBuffer, size)写;入//发送数据TI_CC_SPIStrobe(TI_CCxxx0_STX); //进入发送模式发送数据while ((IO0PIN&TI_CC_GDO0_PIN)==0); //等待 GDO0 变高#ifdef WIRLUART#endifwhile (IO0PIN&TI_CC_GDO0_PIN);#ifdef WIRLUART//等待 GDO0 变低,结束发送#endif}。
排队叫号系统程序流程设计下载温馨提示:该文档是我店铺精心编制而成,希望大家下载以后,能够帮助大家解决实际的问题。
文档下载后可定制随意修改,请根据实际需要进行相应的调整和使用,谢谢!并且,本店铺为大家提供各种各样类型的实用资料,如教育随笔、日记赏析、句子摘抄、古诗大全、经典美文、话题作文、工作总结、词语解析、文案摘录、其他资料等等,如想了解不同资料格式和写法,敬请关注!Download tips: This document is carefully compiled by theeditor. I hope that after you download them,they can help yousolve practical problems. The document can be customized andmodified after downloading,please adjust and use it according toactual needs, thank you!In addition, our shop provides you with various types ofpractical materials,such as educational essays, diaryappreciation,sentence excerpts,ancient poems,classic articles,topic composition,work summary,word parsing,copy excerpts,other materials and so on,want to know different data formats andwriting methods,please pay attention!1. 初始化:系统启动时,进行初始化操作,包括加载配置文件、连接数据库等。
一、课程设计的主要内容题目描述:利用队列模拟一个排队叫号系统。
功能要求及说明:(1)系统采用菜单方式操作,要求实现如下功能:(2)叫号排队:用户叫号时将该用户信息(用户名)入队,并打印用户排队序号、等待人数。
(3)业务处理:工作人员处理完前一业务后,从队列头中获取一个用户出队并呼叫该用户(终端打印输出)。
(4)队列信息浏览:工作人员可随时查看队列中目前未处理的所有业务信息。
(5)采用模块化设计。
二、概要设计1、本程序包含两个模块(1)主函数模块:main(){定义及初始化;让用户控制程序,实现排队叫号功能.}(2)排队叫号系统单元模块:主函数调用排队叫号系统单元模块.2、排队叫号的抽象数据类型定义:void QueueInitiate(LQueue * Q)Q为结构体指针;操作结果:使队列初始化.int QueueNotEmpty(LQueue Q)判断队列是否为空;操作结果:若队列为空,返回0;不为空,则返回1.int QueueAppend(LQueue * Q,int x)Q为结构体指针,x传输用户的序号;操作结果:用户叫号时,使用户序号按顺序入队.int QueueDelete(LQueue * Q,int * d)*d传输队头元素;操作结果:处理对头元素,并释放头结点.void Destroy(LQueue Q)操作结果:用户用完程序退出时,摧毁队列,释放内存.四详细设计1、实现菜单函数void menu(){printf ("****************************************************\n");printf ("****************1.排队叫号**************************\n");printf ("****************2.业务处理**************************\n");printf ("****************3.队列信息浏览**********************\n");printf ("****************4.退出******************************\n");printf ("****************************************************\n");}2、队列初始化函数void QueueInitiate(LQueue * Q) /*队列初始化*/{Q->rear=NULL; /*尾指针为空*/Q->front=NULL; /*头指针为空*/}3、判断队列是否为空函数int QueueNotEmpty(LQueue Q) /*队列不能为空*/{if(NULL==Q.front) /*如果头指针为空,则返回0*/{return 0;}else{return 1;}}4、实现排队叫号函数int QueueAppend(LQueue * Q,int x) /*元素入队*/{LQNode * p; /*p指针指向入队元素*/if((p=(LQNode *)malloc(sizeof(LQNode)))==NULL) /*申请入队元素空间*/ {return 0;}p->data=x;p->next=NULL;if(Q->rear!=NULL) /*队尾不为空则将入队元素插至队尾后*/{Q->rear->next=p;}Q->rear=p; /*队尾为空则队尾指向入队元素*/if(Q->front==NULL){Q->front=p; /*队头指向入队元素*/}return 1;}5、实现业务处理函数int QueueDelete(LQueue * Q,int * d) /*业务处理*/{LQNode *p;if(Q->front==NULL){return 0;}else{*d=Q->front->data; /*读取队头元素*/p=Q->front;Q->front=Q->front->next; /*头结点向后移动一个节点*/if(Q->front==NULL){Q->rear=NULL;}free(p); /*释放头结点*/return 1;}}6、释放队列函数void Destroy(LQueue Q) /*摧毁队列*/{LQNode *p,*p1;p=Q.front; /*p指针指向头结点*/while(p!=NULL){p1=p;p=p->next;free(p1); /*逐个释放队列的节点*/ }整个程序的流程图如下:五调试分析1、该程序的关键就是弄清楚队列及链表的操作方法和原理。
首先保证没有句法错误,其次要保证写的函数没有错误,能正常完成要求所需的功能,然后尽量完善各功能,使用户用起来更方便。
2、叫号时,输入不同的用户名,随时进行业务处理和队列信息浏览,查看相应功能是否正确。
3、本实习作业采用循序渐进的策略,首先分别写好三个相应功能的函数,然后再加入主函数中,以保证整个程序的正确性,也便于随时调整,改正各种错误。
调试程序很耗时间,比较的麻烦,往往改动一个地方能影响到很多位置。
六测试结果1、通过写该程序,充分理解队列及链表的操作原理,熟悉队列的操作。
2、主函数调用子函数时,涉及到参数的传递,要注意到程序里面还有局部变量与全局变量的区别,要时刻注意变量的值,循环调用就要注意到各个子函数的返回值。
3、该程序完整地实现了排队叫号系统的功能,程序简洁、明了,用户使用起来方便。
七用户使用说明1、本程序在VC下能正常运行。
2、程序运行后,出现主菜单,用户首先选择排队叫号功能,输入账号,回车结束,程序会显示用户的序号以及前面排队的人数;3、叫号多次,再选择业务处理功能,程序会打印第一个用户的序号,并叫其来办理业务;4、业务处理完后,返回主菜单,选择队列信息浏览功能,程序会打印出当前未办理业务的人数、用户队列序号和相应用户的账号;5、做完后,退出程序。
源程序:# include <stdio.h># include <stdlib.h>typedef char DataType;# include "CallSystem.h"int main(void){int i=0,countx=0,j=0;int a;char username[20][20];LQueue lqueue;DataType rturn;QueueInitiate(&lqueue);QueueNotEmpty(lqueue);while(1){system("cls");menu();printf("请选择相应功能:");scanf("%d",&a);fflush(stdin);switch(a){case 1: /*排队叫号*/{printf("请输入您的账号:");scanf("%s",username[i]);i++;countx++;if(0==QueueAppend(&lqueue,i)){printf("内存不足,警告!\n");return;}printf("您的序号是%03d 您前面有%d个人\n",i,countx-1);fflush(stdin);printf("\n操作完成,是否继续(N退出,任意键继续)\n");scanf("%c",&rturn);if(rturn=='N')return;}break;case 2: /*业务处理*/{int temp=0;if(0==countx){printf("无人排队,警告!\n");return;}QueueDelete(&lqueue,&temp);printf("请%03d号用户来前台办理业务\n",temp);countx--;fflush(stdin);printf("\n操作完成,是否继续(N退出,任意键继续)\n");scanf("%c",&rturn);if(rturn=='N')return;}break;case 3: /*队列信息浏览*/{LQNode * p;int temp;p=lqueue.front;printf("还有%d个人的业务未处理:\n",countx);while(p!=NULL){temp=p->data;printf("%03d:",temp);p=p->next;printf("%s\n",username[j]);j++;}fflush(stdin);printf("\n操作完成,是否继续(N退出,任意键继续)\n");scanf("%c",&rturn);if(rturn=='N')return;}break;case 4: /*退出*/{Destroy(lqueue);return;}break;default:break;}}}封装的头文件:typedef struct qnode{int data;struct qnode * next;}LQNode;typedef struct{LQNode * front;LQNode * rear;}LQueue;void menu(){printf ("****************************************************\n");printf ("****************1.排队叫号**************************\n");printf ("****************2.业务处理**************************\n");printf ("****************3.队列信息浏览**********************\n");printf ("****************4.退出******************************\n");printf ("****************************************************\n"); }void QueueInitiate(LQueue * Q){Q->rear=NULL;Q->front=NULL;}int QueueNotEmpty(LQueue Q){if(NULL==Q.front){return 0;}else{return 1;}}int QueueAppend(LQueue * Q,int x){LQNode * p;if((p=(LQNode *)malloc(sizeof(LQNode)))==NULL) {return 0;}p->data=x;p->next=NULL;if(Q->rear!=NULL){Q->rear->next=p;}Q->rear=p;if(Q->front==NULL){Q->front=p;}return 1;}int QueueDelete(LQueue * Q,int * d){LQNode *p;if(Q->front==NULL){return 0;}else{*d=Q->front->data;p=Q->front;Q->front=Q->front->next;if(Q->front==NULL){Q->rear=NULL;}free(p);return 1;}}void Destroy(LQueue Q){LQNode *p,*p1;p=Q.front;while(p!=NULL){p1=p;p=p->next;free(p1);}}。