排队叫号系统源程序
#include "config.h"#include "include.h"int main (void){V AR_Init(); //变量初始化IO_Init(); //引脚初始化TI_CC_SPISetup(); //SPI初始化TI_CC_PowerupResetCCxxxx(); // Reset CCxxxxwriteRFSettings(); // 写入无线模块配置寄存器TI_CC_SPIWriteBurstReg(TI_CCxxx0_PA TABLE, paTable, paTableLen);//写入能量控制寄存器UART0_Init(UART_BPS, set); // 串口初始化TC0_Init(); // 定时器0初始化VIC_Init(); // 中断初始化TI_CC_SPIStrobe(TI_CCxxx0_SFSTXON); //开启和校准频率合成器TI_CC_SPIStrobe(TI_CCxxx0_SRX); // 初始化模块为接收模式.// 数据包接收结束后,GDO0下降沿触发中断#ifdef WATCHDOGW ATCHDOG_Init(); //看门狗初始化#endifUART0_SendBufEx("-begin-",7);while (1){#ifdef WIRLTESTif(TimerSend_ID==1){TimerSend_ID=0;/* IO1CLR=IO1CLR|LED1;DelayNS(20);IO1SET=IO1SET|LED1;DelayNS(20);IO1CLR=IO1CLR|LED1;DelayNS(20);IO1SET=IO1SET|LED1;RcvBuf[0]=0x05; */ //从机地址RcvBuf[0]=0x05;for(i=1;i<16;i++){RFSendPacket((char*)RcvBuf,17);if(DeskDriver[i].allow10s==1){DeskDriver[i].allow10s=0; //开始限定时间,在限定时间内不接受按键DeskDriver[i].keyScaned=1; //接受按键,并置按下标志DeskDriver[i].timeCnt=0; //计数归零DeskDriver[i].enable=1; //开启允许无线发送DeskDriver[i].sendCount=0; //初始值0表示发送次数为0,发送一次加1DeskDriver[i].sendOK=0; //初始值0表示没发送成功}}}#endif //task1 接收完成,发送数据if(RCVCOMP_ID==1){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);}//task2 按键扫描if(SCAN_ID==1){SCAN_ID=0;KeyScan();}//task3 发送柜台号if(SendDesk_ID==1){SendDesk_Pro();SendDesk_ID=0;}#ifdef WATCHDOG //看门狗喂狗IRQDisable(); //关中断WDFEED = 0xAA; //第一次喂狗启动WDTWDFEED = 0x55; //喂狗序列IRQEnable(); //开中断#endif}return 0;}void DelayNS (uint32 dly){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 = 0; //串口校验位rcv_new = 0; //串口接收完数据标志RSMCHR=0; //接收数据暂存变量RSMCHR=0; //判断接收数据用标志RSSMS_ID=0; //直接接收数据标志RCVCOMP_ID=0; //接收完成标志SCAN_ID=1; //按键扫描定时标志INPUT1=0; //按键扫描去抖动计数INPUT1_ID=1; //按键按下放开标志Desk_NUM=0x50; //柜台号,初始值为无效柜台号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连接到UART0 PINSEL0 =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; //EINT0使用边沿激活EXTPOLAR=0x00; //下降沿或低电平有效}void TC0_Init(void){T0TC = 0; // 定时器设置为0T0PR = 0; // 时钟不分频T0MCR = 0x03; //设置T0MR0匹配后复位T0TC,并产生中断标志T0MR0 = Fpclk / 50; //20毫秒100则10ms定时,修改定时间隔只需修改除数T0TCR = 0x01; // 启动定时器}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) //1.6秒执行一次{time1sCount=0;UpdataDesk(); //更新柜台号结构体的信息}sendDeskNum(); //发送柜台号给pc端}SCAN_ID=1; //开启按键扫描T0IR = 0x01; //清除中断标志,并复位中断VICVectAddr = 0x00; //通知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; //初始值0表示没发送成功DeskDriver[i].timeCnt=0; //初始值0,定时计数为0,每秒加1DeskDriver[i].enable=1; //初始值1表示允许发送}}} //end for}void 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++; //发送次数加1DeskDriver[i].enable=0; //关闭允许发送return;}}}void DeskLoadBuf(uint8 deskNum){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; //第一次喂狗启动WDTWDFEED = 0x55; //喂狗序列IRQEnable(); //开中断}#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.stopb > 2)) return (0);if (set.parity > 4) return (0);/* 设置串口波特率*/U0LCR = 0x80; // DLAB = 1 使能除数所存访问bak = (Fpclk >> 4) / baud; //外设时钟左移四位相当于除以16 相当于(Fpclk/16)/16U0DLM = bak >> 8; //除数高位取16位分频值的高8位相当于bak/256U0DLL = bak & 0xFF; //除数低位取16位分频值的低8位相当于bak%256/* 设置串口模式*/bak = set.datab - 5; // 设置字长if (set.stopb == 2) bak |= 0x04; // 判断是否为2位停止位if (set.parity != 0){set.parity = set.parity - 1;bak |= 0x08;}bak |= set.parity << 4; // 设置奇偶校验U0LCR =(bak&0x7F); //DLAB 除数访问位置0 ,用于访问接收发送寄存器U0FCR = 0x01; // 使能FIFO,并设置触发点为8字节U0IER = 0x01; // 允许RBR中断,即接收中断return (1);}void __irq IRQ_UART0 (void){if ((U0IIR & 0x0F) == 0x04) //通过读取U0IIR来清除中断{RSMCHR = U0RBR; //读取接收的数据if(RSSMS_ID==0) judge_RCV();else direct_RCV(); //直接保存到接收数组}VICVectAddr = 0x00; // 中断处理结束}void judge_RCV(void){if (HDM1_ID==0) //第一次判断{if(RSMCHR==cnPUREDA TCHR1) //判断为点阵数据关键字1 0xaa {HDM1_ID=1;RcvBuf[0]=RSMCHR; //保存关键字1}}else //第二次判断{if(RSMCHR==cnPUREDATCHR2) //判断为点阵数据关键字2 0x55{RcvBuf[1]=RSMCHR; //保存关键字1RSSMS_ID=1; //置直接保存数据标志RSMLEN=RCV_LEN1; //置接收数据长度RcvPointer=2; //置接收数据指针为2HDM1_ID=0;}else{HDM1_ID=0;}}}void direct_RCV(void){RcvBuf[RcvPointer]=RSMCHR; //向接收数据缓冲区保存数据RcvPointer++; //接收缓冲区地址加1RSMLEN--; //接收长度减1if (RSMLEN==0) //当接收长度变为0时,置相应标志{RCVCOMP_ID=1; //置接收完成标志RSSMS_ID=0; //清除直接接收数据标志RcvPointer=2; //接收数据缓冲区地址归位}}void UART0_SendBuf (void){uint8 i;for (i=0; i<(RCV_LEN1+2); i++)U0THR =RcvBuf[i];while ((U0LSR & 0x20) == 0); // 等待数据发送完毕}void UART0_SendBufEx (char * buffer ,uint8 len){uint8 i;for (i=0; i<(len); i++)U0THR =buffer[i];while ((U0LSR & 0x20) == 0); // 等待数据发送完毕}void VIC_Init(void){IRQEnable(); // 使能IRQ中断VICIntSelect = 0x00000000; // 设置所有的通道为IRQ中断VICVectCntl0 = 0x20 | 14; // 分配EINT0中断到向量中断1VICVectAddr0 = (uint32)IRQ_Eint0; // 设置中断服务程序地址VICVectCntl2 = 0x20 | 0x06; // UART0分配到IRQ slot0,即最高优先级VICVectAddr2 = (uint32)IRQ_UART0; // 设置UART0向量地址VICVectCntl1 = 0x20 | 0x04; // 设置定时器0中断通道分配向量中断1VICVectAddr1 = (uint32)IRQ_Timer0; // 设置中断服务程序地址VICIntEnable =(1<<14)|(1 << 0x06)|(1<<0x04);// 使能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; //置发送柜台号标志UART0_SendBufEx("##",2);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; //初始值0表示发送次数为0,发送一次加1DeskDriver[Desk_NUM].sendOK=0; //初始值0表示没发送成功}return nResult;}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; // 设置SPI时钟分频SPCR = (0 << 3) | // CPHA = 0, 数据在SCK 的第一个时钟沿采样(1 << 4) | // CPOL = 1, SCK 为低有效(1 << 5) | // MSTR = 1, SPI 处于主模式(0 << 6) | // LSBF = 0, SPI 数据传输MSB (位7)在先(0 << 7); // SPIE = 0, SPI 中断被禁止}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); // 至少40usIO0CLR=IO0CLR|TI_CC_CSn_PIN; // 设置片选信号有效while (IO0PIN&SOMI0); // 等待CCxxxx 准备好SPDR = TI_CCxxx0_SRES; // 发送命令复位while( 0 == (SPSR & 0x80)); // 等待SPIF置位,即等待数据发送完毕while (IO0PIN&SOMI0); // 等待CCxxxx 准备好IO0SET=IO0SET|TI_CC_CSn_PIN; // 设置片选信号无效}void writeRFSettings(void){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 k).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, 0x35); // 不同的测试设置.TI_CC_SPIWriteReg(TI_CCxxx0_TEST0, 0x0B); // 不同的测试设置.}void TI_CC_SPIWriteReg(char addr, char value){IO0CLR=IO0CLR|TI_CC_CSn_PIN; // 设置片选信号有效while (IO0PIN&SOMI0); // 等待CCxxxx 准备好SPDR = addr;while( 0 == (SPSR & 0x80)); // 等待SPIF置位,即等待数据发送完毕SPDR = value;while( 0 == (SPSR & 0x80)); // 等待SPIF置位,即等待数据发送完毕IO0SET=IO0SET|TI_CC_CSn_PIN; // 设置片选信号无效}void TI_CC_SPIWriteBurstReg(char addr, char *buffer, char count){char i;#ifdef WIRLUARTUART0_SendBufEx("-WrBurstReg_begin-",21);#endifIO0CLR=IO0CLR|TI_CC_CSn_PIN; // 设置片选信号有效while (IO0PIN&SOMI0); // 等待CCxxxx 准备好SPDR = addr | TI_CCxxx0_WRITE_BURST; // 发送首地址while( 0 == (SPSR & 0x80)); // 等待SPIF置位,即等待数据发送完毕for (i = 0; i < count; i++){SPDR = buffer[i]; // 依次发送数据while( 0 == (SPSR & 0x80)); // 等待SPIF置位,即等待数据发送完毕}IO0SET=IO0SET|TI_CC_CSn_PIN; // 设置片选信号无效#ifdef WIRLUARTUART0_SendBufEx("-WrBurstReg_end-",19);#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 WIRLUARTUART0_SendBufEx("$$$",3);#endif}#ifdef WIRLUARTUART0_SendBufEx("***",3);#endifEXTINT = 0x01; // 清除EINT0中断标志VICVectAddr = 0x00;}char RFReceStadPacket(char *rxBuffer,char length,char *status){if ((TI_CC_SPIReadStatus(TI_CCxxx0_RXBYTES) & TI_CCxxx0_NUM_RXBYTES)) {#ifdef WIRLUARTUART0_SendBufEx("@@@",3);#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) // 等待CCxxxx 准备好{if(i>5000){#ifdef WIRLUARTUART0_SendBufEx("~~~~",4);#endifreturn 0; //超时返回}i++;}SPDR = (addr | TI_CCxxx0_READ_BURST);// 发送读取数据的地址while( 0 == (SPSR & 0x80)); // 等待SPIF置位,即等待数据发送完毕SPDR = 0; // 写入哑函数以读取数据while( 0 == (SPSR & 0x80)); // 等待SPIF置位,即等待数据发送完毕x = SPDR; // 读出数据IO0SET=IO0SET|TI_CC_CSn_PIN; // 设置片选信号无效#ifdef WIRLUARTch[0]=x; //此处不能有串口发送函数,时间会影响UART0_SendBufEx("&&&",3); //TI_CC_SPIReadBurstRegUART0_SendBufEx(ch,1);#endifreturn x; //返回寄存器的值}void TI_CC_SPIReadBurstReg(char addr, char *buffer, char count){unsigned int i;IO0CLR=IO0CLR|TI_CC_CSn_PIN; // 设置片选信号有效while (IO0PIN&SOMI0); // 等待CCxxxx 准备好SPDR = (addr | TI_CCxxx0_READ_BURST); // 发送首地址while( 0 == (SPSR & 0x80)); // 等待SPIF置位,即等待数据发送完毕for (i = 0; i < count; i++){SPDR = 0 ;while (0 ==(SPSR & 0x80));buffer[i] = SPDR; // 读出数据}IO0SET=IO0SET|TI_CC_CSn_PIN; // 设置片选信号无效}void TI_CC_SPIStrobe(char strobe){uint32 i;#ifdef WIRLUARTUART0_SendBufEx("-SPIStrobe_begin-",17);#endifIO0CLR=IO0CLR|TI_CC_CSn_PIN; // 设置片选信号有效while (IO0PIN&SOMI0) // 等待CCxxxx 准备好{if(i>5000){#ifdef WIRLUARTUART0_SendBufEx("~~~~",4);#endifreturn ; //超时返回}i++;}SPDR = strobe; // 发送命令滤波while( 0 == (SPSR & 0x80)); // 等待SPIF置位,即等待数据发送完毕IO0SET=IO0SET|TI_CC_CSn_PIN; // 设置片选信号无效#ifdef WIRLUARTUART0_SendBufEx("-SPIStrobe_end-",15);#endif}void RFSendPacket(char *txBuffer, char size){#ifdef WIRLUARTUART0_SendBufEx("-SendPacket_begin-",20);#endifTI_CC_SPIWriteBurstReg(TI_CCxxx0_TXFIFO, txBuffer, size); // 写入发送数据TI_CC_SPIStrobe(TI_CCxxx0_STX); // 进入发送模式发送数据while ((IO0PIN&TI_CC_GDO0_PIN)==0); // 等待GDO0变高#ifdef WIRLUARTUART0_SendBufEx("-GDO0_high-",11);#endifwhile (IO0PIN&TI_CC_GDO0_PIN); // 等待GDO0变低,结束发送#ifdef WIRLUARTUART0_SendBufEx("-SendPacket_end-",18);#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 #include<stdio.h>2 #include<stdlib.h>3#define FALSE 04#define ERROR 05#define OK 16#define TRUE 17#define MAXSIZE 6 //队列的长度8 typedef int Elem;9 typedef int Status;10/*11这⾥似乎没⽤到GetHead(),QueueEmpty()这两个函数,但是我还是定义了12*/13//队列的顺序存储结构14 typedef struct15 {16 Elem data[MAXSIZE];17int front;18int rear;19 }Sq;2021int IsInit = FALSE;//这个是⽤来判断是否初始化,即主函数中⽤来要求先输⼊0(即先选上班,不然队列没有初始化);22//队列的初始化,即将队列的头尾指针都等于0;23void Init(Sq &S)24 {25 S.front = 0;26 S.rear = 0;27 IsInit = TRUE;28 }29//⼊队列,注:⼊队列时会空出⼀个数组位置,⽅便尾指针的指向,所以这也是判断队满时为什么尾指针要加130 Status EnQueue(Sq &S,Elem num)31 {32if((S.rear+1)%MAXSIZE==S.front) return ERROR;//判断是否栈满,即尾指针后移⼀位与头指针相逢,队列就满了33 S.data[S.rear] = num; //存数34 S.rear = (S.rear+1)%MAXSIZE; //队尾指针后移35return OK;36 }37//出队列38 Status DeQueue(Sq &S,Elem &e)39 {40if(S.front == S.rear) return ERROR;//判断队空,当队头指针遇到队尾指针,队空41 e = S.data[S.front]; //队头元素赋值给e42 S.front = (S.front+1)%MAXSIZE;//队头指针后移43return OK;44 }45//获得队列的长度46int getLen(Sq S)47 {48return (S.rear+MAXSIZE-S.front)%MAXSIZE;//返回队列的长度49 }50//获得队列的头元素51 Status GetHead(Sq S,Elem &e)52 {53if(S.rear == S.front)54return ERROR;55else{56 e = S.data[S.front];57return OK;58 }59 }60//判断队空61 Status QueueEmpty(Sq S)62 {63if(S.front==S.rear) return ERROR;64else65return OK;66 }67//判断队满68 Status QueueFull(Sq S)69 {70if((S.rear+1)%MAXSIZE==S.front)71return ERROR;72else73return OK;74 }75int main()76 {77 Sq S;78int n,num=0;79 Elem e;8081while(1)82 {83 printf("---------------银⾏叫号系统-----------\n");84 printf("--------------------------------------\n");85 printf("1.上班\n");86 printf("2.排号\n");87 printf("3.叫号\n");88 printf("0.下班\n");89 printf("---------------------------------------\n\n");9091 scanf("%d",&n);92switch(n)93 {94case0:if(!IsInit)95 {96 printf("要先开始上班才能下班哦!!\n\n");97break;98//为什么要有这个判断呢,因为队列要初始化,这⾥其实可以不做判断 99 }100if(!QueueEmpty(S))101 {102 printf("下班啦,可以回家了\n\n");103return0;104 }else105 {106 printf("还有业务没有完成,暂时不能下班!!\n\n");107break;108 }109case1:110 Init(S);111 num = 0;112 printf("⼀切准备就绪,开始上班\n\n");113break;114115case2:116if(!IsInit)117 {118 printf("要先开始上班,请做好⼯作准备!!\n\n");119break;120//为什么要有这个判断呢,因为队列要初始化121 }122if(QueueFull(S))123 {124//如果队列没满,就⼊队列125 EnQueue(S,++num);126 printf("当前是%d号,前⾯有%d位\n\n",num,getLen(S)-1);127break;128 }else129 {130//如果队列满了131 printf("⼈已满了!!请耐⼼等待\n\n");132break;133 }134case3:135if(!IsInit)136 {137 printf("新的⼀天开始了\n要先开始上班,请先做好准备!!\n\n");138break;139//为什么要有这个判断呢,因为队列要初始化140 }141if(DeQueue(S,e))142 {143//如果队列没空,就可以出队列144 printf("%d号业务办理成功!还有%d⼈在等待!\n\n",e,getLen(S));145break;146 }else147 {148//如果队列空了149 printf("当前没有⼈办理业务!!\n\n");150break;151 }152default :153 printf("⽆效操作请重新输⼊\n\n");154break;155156 } 157 } 158 }。
银行排队叫号系统设计实验报告(范本模板)
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。
看病排队候诊源代码 用队列实现
break;
case 0:
printf("恭喜您!您什么病也没有!\n"LQueue(LQueue *q) {//入队列
QNode *p;
int x;
if((p = (QNode *)malloc(sizeof(QNode))) == NULL)
printf("当前队首病人诊断完毕:");
Type_Of_Sickness(rand() % 6);//rand() % 6 产生的值为0~5,rand()函数产生的值在0到32767之间
return;
}
}
void main() {
LQueue q;
int choice;//选择变量
return;
x = Length_of_LQueue(q);
printf("您的号码为:**%d**,在您前面的病人共有%d个,请稍后!\n",x + 1,x);
p->data = x;//新结点的数据域为data
p->next = NULL;//新结点指针域为NULL
case 2:
printf("您得的是严重感冒,打针吧!\n");
break;
case 3:
printf("您发烧37.8度,挂瓶吧!\n");
break;
case 4:
printf("您是劳累过度了,注意休息即可!\n");
break;
case 5:
break;
排队叫号系统(带源程序)
printf (”****************4、退出******************************\n");
printf ("****************************************************\n");
ﻩQ-〉front=Q->front-〉next;/*头结点向后移动一个节点*/
ﻩif(Q-〉front==NULL)
ﻩ{
ﻩﻩQ->rear=NULL;
}
ﻩﻩfree(p);/*释放头结点*/
ﻩreturn 1;
ﻩ}
}
6、释放队列函数
void Destroy(LQueue Q)/*摧毁队列*/
{
ﻩLQNode *p,*p1;
{
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;
毕业论文——银行排队叫号系统设计
本科毕业论文(设计)题目银行排队叫号系统设计学院 XXXXXXXXXXX学院专业 XXXXXXXXXX 年级 XXXXX 级学号 XXXXXXXXXXXXXXX 姓名 XXXX 指导教师 XXXXXXXX _ 成绩 ________ ____ __ __XXXX年 XX月XX日目录摘要 (1)关键字 (1)Abstract (1)Key Words (1)引言 (2)1 硬件设计 (3)1.1 主要器件 (3)1.1.1 微处理器介绍 (3)1.1.2 液晶LCD12864介绍 (5)1.1.3 语音模块介绍 (7)1.2 硬件电路 (8)1.2.1 单片机最小系统 (8)1.2.2 液晶显示电路 (10)1.2.3 声音提示电路 (10)1.3 系统硬件总电路图 (11)2 软件设计 (11)2.1 主要程序设计 (12)2.1.1 取号模块程序设计 (12)2.1.2 叫号模块程序设计 (13)2.1.3 语音模块程序设计 (14)2.2 系统源程序 (15)3 系统调试及仿真 (15)3.1 系统仿真 (15)3.2 系统调试 (17)3.3 硬件实物系统运行的效果图 (17)4 结束语 (20)参考文献 (21)致谢 (22)附录A 原理图 (23)附录B 程序 (24)·银行排队叫号系统摘要:本排队叫号系统由一个叫号系统和一个抽号系统组成,客户利用抽号系统抽取号码,客服人员通过叫号系统呼叫客户;利用液晶LCD12864显示器和WT588D语音芯片分别能及时显示出当前所呼叫号数并发出语音提示,客户就能够及时了解当前排队信息。
使用该排队叫号系统,解决了当下排队拥挤混乱状况,极大的提高了排队等侯效率,从而实现排队自动化、规范化,同时也适应科技的发展。
为实现上述功能,该系统采用AT89C51单片机进行控制,通过按键取号、叫号,利用LCD12864显示信息,再通过WT588D语音芯片提示,实现排队管理系统的模拟化,设计出一个具有控制灵活、使用方便、成本低、性价高等特点的系统。
使用C++实现银行排队叫号系统
使⽤C++实现银⾏排队叫号系统模拟20秒的输出结果--------模拟开始--------初始化⽤户:普通客户进⼊排队,编号:1000VIP客户进⼊排队, 编号:1001普通客户进⼊排队,编号:1002普通客户进⼊排队,编号:1003VIP客户进⼊排队, 编号:1004VIP客户进⼊排队, 编号:1005VIP客户进⼊排队, 编号:1006对公客户进⼊排队, 编号:1007普通客户进⼊排队,编号:1008VIP客户进⼊排队, 编号:1009普通客户编号为: 1000 请进⼊0号普通窗⼝服务普通客户编号为: 1002 请进⼊1号普通窗⼝服务普通客户编号为: 1003 请进⼊2号普通窗⼝服务VIP客户编号为: 1001 请进⼊3号VIP窗⼝服务对公客户编号为: 1007 请进⼊4号对公窗⼝服务-当前模拟时间:0s -窗⼝号:0 -正在服务- 客户类型: 普通客户编号: 1000窗⼝号:1 -正在服务- 客户类型: 普通客户编号: 1002窗⼝号:2 -正在服务- 客户类型: 普通客户编号: 1003窗⼝号:3 -正在服务- 客户类型: VIP 客户编号: 1001窗⼝号:4 -正在服务- 客户类型: 对公客户编号: 1007-当前模拟时间:1s -窗⼝号:0 -正在服务- 客户类型: 普通客户编号: 1000窗⼝号:1 -正在服务- 客户类型: 普通客户编号: 1002窗⼝号:2 -正在服务- 客户类型: 普通客户编号: 1003窗⼝号:3 -正在服务- 客户类型: VIP 客户编号: 1001窗⼝号:4 -正在服务- 客户类型: 对公客户编号: 1007-当前模拟时间:2s -窗⼝号:0 -正在服务- 客户类型: 普通客户编号: 1000窗⼝号:1 -正在服务- 客户类型: 普通客户编号: 1002窗⼝号:2 -正在服务- 客户类型: 普通客户编号: 1003窗⼝号:3 -正在服务- 客户类型: VIP 客户编号: 1001窗⼝号:4 -正在服务- 客户类型: 对公客户编号: 1007VIP客户进⼊排队, 编号:1010-当前模拟时间:3s -窗⼝号:0 -正在服务- 客户类型: 普通客户编号: 1000窗⼝号:1 -正在服务- 客户类型: 普通客户编号: 1002窗⼝号:2 -正在服务- 客户类型: 普通客户编号: 1003窗⼝号:3 -正在服务- 客户类型: VIP 客户编号: 1001窗⼝号:4 -正在服务- 客户类型: 对公客户编号: 1007对公客户进⼊排队, 编号:1011-当前模拟时间:4s -窗⼝号:0 -正在服务- 客户类型: 普通客户编号: 1000窗⼝号:1 -正在服务- 客户类型: 普通客户编号: 1002窗⼝号:2 -正在服务- 客户类型: 普通客户编号: 1003窗⼝号:3 -正在服务- 客户类型: VIP 客户编号: 1001窗⼝号:4 -正在服务- 客户类型: 对公客户编号: 1007对公客户进⼊排队, 编号:1012-当前模拟时间:5s -窗⼝号:0 -等待服务-窗⼝号:1 -等待服务-窗⼝号:2 -等待服务-窗⼝号:3 -正在服务- 客户类型: VIP 客户编号: 1001窗⼝号:4 -正在服务- 客户类型: 对公客户编号: 1007普通客户编号为: 1008 请进⼊0号普通窗⼝服务普通客户进⼊排队,编号:1013-当前模拟时间:6s -窗⼝号:0 -正在服务- 客户类型: 普通客户编号: 1008窗⼝号:1 -等待服务-窗⼝号:2 -等待服务-窗⼝号:3 -正在服务- 客户类型: VIP 客户编号: 1001窗⼝号:4 -正在服务- 客户类型: 对公客户编号: 1007普通客户编号为: 1013 请进⼊1号普通窗⼝服务普通客户进⼊排队,编号:1014-当前模拟时间:7s -窗⼝号:0 -正在服务- 客户类型: 普通客户编号: 1008窗⼝号:1 -正在服务- 客户类型: 普通客户编号: 1013窗⼝号:2 -等待服务-窗⼝号:3 -等待服务-窗⼝号:4 -正在服务- 客户类型: 对公客户编号: 1007普通客户编号为: 1014 请进⼊2号普通窗⼝服务VIP客户编号为: 1004 请进⼊3号VIP窗⼝服务普通客户进⼊排队,编号:1015-当前模拟时间:8s -窗⼝号:0 -正在服务- 客户类型: 普通客户编号: 1008窗⼝号:1 -正在服务- 客户类型: 普通客户编号: 1013窗⼝号:2 -正在服务- 客户类型: 普通客户编号: 1014窗⼝号:3 -正在服务- 客户类型: VIP 客户编号: 1004窗⼝号:4 -正在服务- 客户类型: 对公客户编号: 1007VIP客户进⼊排队, 编号:1016-当前模拟时间:9s -窗⼝号:0 -正在服务- 客户类型: 普通客户编号: 1008窗⼝号:1 -正在服务- 客户类型: 普通客户编号: 1013窗⼝号:2 -正在服务- 客户类型: 普通客户编号: 1014窗⼝号:3 -正在服务- 客户类型: VIP 客户编号: 1004窗⼝号:4 -等待服务-对公客户编号为: 1011 请进⼊4号对公窗⼝服务VIP客户进⼊排队, 编号:1017-当前模拟时间:10s -窗⼝号:0 -等待服务-窗⼝号:1 -正在服务- 客户类型: 普通客户编号: 1013窗⼝号:2 -正在服务- 客户类型: 普通客户编号: 1014窗⼝号:3 -正在服务- 客户类型: VIP 客户编号: 1004窗⼝号:4 -正在服务- 客户类型: 对公客户编号: 1011普通客户编号为: 1015 请进⼊0号普通窗⼝服务普通客户进⼊排队,编号:1018-当前模拟时间:11s -窗⼝号:0 -正在服务- 客户类型: 普通客户编号: 1015窗⼝号:1 -等待服务-窗⼝号:2 -正在服务- 客户类型: 普通客户编号: 1014窗⼝号:3 -正在服务- 客户类型: VIP 客户编号: 1004窗⼝号:4 -正在服务- 客户类型: 对公客户编号: 1011普通客户编号为: 1018 请进⼊1号普通窗⼝服务VIP客户进⼊排队, 编号:1019-当前模拟时间:12s -窗⼝号:0 -正在服务- 客户类型: 普通客户编号: 1015窗⼝号:1 -正在服务- 客户类型: 普通客户编号: 1018窗⼝号:2 -等待服务-窗⼝号:3 -正在服务- 客户类型: VIP 客户编号: 1004窗⼝号:4 -正在服务- 客户类型: 对公客户编号: 1011普通客户进⼊排队,编号:1020-当前模拟时间:13s -窗⼝号:0 -正在服务- 客户类型: 普通客户编号: 1015窗⼝号:1 -正在服务- 客户类型: 普通客户编号: 1018窗⼝号:2 -等待服务-窗⼝号:3 -正在服务- 客户类型: VIP 客户编号: 1004窗⼝号:4 -正在服务- 客户类型: 对公客户编号: 1011普通客户编号为: 1020 请进⼊2号普通窗⼝服务普通客户进⼊排队,编号:1021-当前模拟时间:14s -窗⼝号:0 -正在服务- 客户类型: 普通客户编号: 1015窗⼝号:1 -正在服务- 客户类型: 普通客户编号: 1018窗⼝号:2 -正在服务- 客户类型: 普通客户编号: 1020窗⼝号:3 -等待服务-窗⼝号:4 -正在服务- 客户类型: 对公客户编号: 1011 VIP客户编号为: 1005 请进⼊3号VIP窗⼝服务对公客户进⼊排队, 编号:1022-当前模拟时间:15s -窗⼝号:0 -等待服务-窗⼝号:1 -正在服务- 客户类型: 普通客户编号: 1018窗⼝号:2 -正在服务- 客户类型: 普通客户编号: 1020窗⼝号:3 -正在服务- 客户类型: VIP 客户编号: 1005窗⼝号:4 -正在服务- 客户类型: 对公客户编号: 1011普通客户编号为: 1021 请进⼊0号普通窗⼝服务对公客户进⼊排队, 编号:1023-当前模拟时间:16s -窗⼝号:0 -正在服务- 客户类型: 普通客户编号: 1021窗⼝号:1 -等待服务-窗⼝号:2 -正在服务- 客户类型: 普通客户编号: 1020窗⼝号:3 -正在服务- 客户类型: VIP 客户编号: 1005窗⼝号:4 -正在服务- 客户类型: 对公客户编号: 1011 VIP客户进⼊排队, 编号:1024-当前模拟时间:17s -窗⼝号:0 -正在服务- 客户类型: 普通客户编号: 1021窗⼝号:1 -等待服务-窗⼝号:2 -正在服务- 客户类型: 普通客户编号: 1020窗⼝号:3 -正在服务- 客户类型: VIP 客户编号: 1005窗⼝号:4 -正在服务- 客户类型: 对公客户编号: 1011对公客户进⼊排队, 编号:1025-当前模拟时间:18s -窗⼝号:0 -正在服务- 客户类型: 普通客户编号: 1021窗⼝号:1 -等待服务-窗⼝号:2 -等待服务-窗⼝号:3 -正在服务- 客户类型: VIP 客户编号: 1005窗⼝号:4 -等待服务-对公客户编号为: 1012 请进⼊4号对公窗⼝服务对公客户进⼊排队, 编号:1026-当前模拟时间:19s -窗⼝号:0 -正在服务- 客户类型: 普通客户编号: 1021窗⼝号:1 -等待服务-窗⼝号:2 -等待服务-窗⼝号:3 -正在服务- 客户类型: VIP 客户编号: 1005窗⼝号:4 -正在服务- 客户类型: 对公客户编号: 1012 VIP客户进⼊排队, 编号:1027-当前模拟时间:20s -窗⼝号:0 -等待服务-窗⼝号:1 -等待服务-窗⼝号:2 -等待服务-窗⼝号:3 -正在服务- 客户类型: VIP 客户编号: 1005窗⼝号:4 -正在服务- 客户类型: 对公客户编号: 1012普通客户进⼊排队,编号:1028源代码#include<iostream>#include<stdlib.h>#include<time.h>#include<queue>#include<Windows.h>using namespace std;class User{public:int userID;int type;//0为普通⽤户,1为VIP⽤户,2为对公⽤户.User() { type = 0; userID = 1000; }User(int t, int id) { userID = id, type = t; }};class BankWindow{public:int id;//0,1,2,为普通窗⼝,3为VIP窗⼝,4为对公窗⼝.bool isBusy;User client;int serviceStartTime=0;BankWindow() { isBusy = false; }BankWindow(int i) { id = i; isBusy = false; }};class Simulater{private:int serviceTime[3] = {4,6,8};int initID = 1000;BankWindow bankWindow0;BankWindow bankWindow1;BankWindow bankWindow2;BankWindow bankWindow3;BankWindow bankWindow4;queue<User> NormalUserQueue, VIPUserQueue, OfficialUserQueue;public:Simulater(){bankWindow0.id = 0;bankWindow1.id = 1;bankWindow2.id = 2;bankWindow3.id = 3;bankWindow4.id = 4;srand(unsigned(time(0)));}void enterQueue(User user){if (user.type == 0){cout << "普通客户进⼊排队,编号:" <<erID<< endl;NormalUserQueue.push(user);}else if(user.type==1){cout << "VIP客户进⼊排队, 编号:"<<erID<<endl;VIPUserQueue.push(user);}else if (user.type == 2){cout << "对公客户进⼊排队, 编号:" <<erID<< endl;OfficialUserQueue.push(user);}else{cout << "⽤户类型出错!";}}void output(User user){if (user.type == 0){cout << "普通客户 " << "编号为: " << erID;}else if (user.type == 1){cout << "VIP客户 " << " 编号为: " << erID;}else if (user.type == 2){cout << "对公客户 " << "编号为: " << erID;}else{cout << "⽤户类型错误!" << endl;}}void output2(User user){if (user.type == 0){cout << " 客户类型: " << "普通 "<< "客户编号: " << erID;}else if (user.type == 1){cout << " 客户类型: " << "VIP " << "客户编号: " << erID; }else if (user.type == 2){cout << " 客户类型: " << "对公 " << "客户编号: " << erID; }else{cout << " ⽤户类型错误!" << endl;}}void enterWindow(int time){if (bankWindow0.isBusy == false && !NormalUserQueue.empty()) {bankWindow0.client = NormalUserQueue.front();output(bankWindow0.client);cout<<" 请进⼊0号普通窗⼝服务" << endl;bankWindow0.isBusy = true;bankWindow0.serviceStartTime = time; NormalUserQueue.pop();}if (bankWindow1.isBusy == false && !NormalUserQueue.empty()) {bankWindow1.client = NormalUserQueue.front();output(bankWindow1.client);cout << " 请进⼊1号普通窗⼝服务" << endl;bankWindow1.isBusy = true;bankWindow1.serviceStartTime = time; NormalUserQueue.pop();}if (bankWindow2.isBusy == false && !NormalUserQueue.empty()) {bankWindow2.client = NormalUserQueue.front();output(bankWindow2.client);cout << " 请进⼊2号普通窗⼝服务" << endl;bankWindow2.isBusy = true;bankWindow2.serviceStartTime = time; NormalUserQueue.pop();}if (bankWindow3.isBusy == false){if (!VIPUserQueue.empty()){bankWindow3.client = VIPUserQueue.front();bankWindow3.isBusy = true;bankWindow3.serviceStartTime = time;VIPUserQueue.pop();}else if (!NormalUserQueue.empty()){bankWindow3.client = NormalUserQueue.front(); bankWindow3.isBusy = true;bankWindow3.serviceStartTime = time; NormalUserQueue.pop();}else{}output(bankWindow3.client);cout << " 请进⼊3号VIP窗⼝服务" << endl;}if (bankWindow4.isBusy == false){if (!OfficialUserQueue.empty()){bankWindow4.client = OfficialUserQueue.front(); bankWindow4.isBusy = true;bankWindow4.serviceStartTime = time; OfficialUserQueue.pop();}else if (!NormalUserQueue.empty()){bankWindow4.client = NormalUserQueue.front(); bankWindow4.isBusy = true;bankWindow4.serviceStartTime = time; NormalUserQueue.pop();}else {}output(bankWindow4.client);cout << " 请进⼊4号对公窗⼝服务" << endl;}}void display(int time){cout << "-当前模拟时间:" << time << "s -" << endl;windowCondition(bankWindow0);windowCondition(bankWindow1);windowCondition(bankWindow2);windowCondition(bankWindow3);windowCondition(bankWindow4);}void customerEnter(){int type = rand() % 12;//不同概率⽣成⽤户.if (type >= 0 && type <= 5){User u(0, initID);enterQueue(u);}if (type >= 6 && type <= 9){User u(1, initID);enterQueue(u);}if (type >= 10 && type <= 11){User u(2, initID);enterQueue(u);}initID++;}void windowCondition(BankWindow bankWindow){cout << "窗⼝号:" << bankWindow.id<<" ";if (bankWindow.isBusy == true){cout << "-正在服务-";output2(bankWindow.client);}else{cout << "-等待服务-";}cout << endl;}void isBusy(int time)//扫描⼀遍窗⼝,检测服务是否结束{if (bankWindow0.isBusy == true){if (time - bankWindow0.serviceStartTime >= serviceTime[bankWindow0.client.type]) {bankWindow0.isBusy = false;}}if (bankWindow1.isBusy == true){if (time - bankWindow1.serviceStartTime >= serviceTime[bankWindow1.client.type]) {bankWindow1.isBusy = false;}}if (bankWindow2.isBusy == true){if (time - bankWindow2.serviceStartTime >= serviceTime[bankWindow2.client.type]) {bankWindow2.isBusy = false;}}if (bankWindow3.isBusy == true){if (time - bankWindow3.serviceStartTime >= serviceTime[bankWindow3.client.type]) {bankWindow3.isBusy = false;}}if (bankWindow4.isBusy == true){if (time - bankWindow4.serviceStartTime >= serviceTime[bankWindow4.client.type]) {bankWindow4.isBusy = false;}}}void simulate(){int time = 0;cout << "--------模拟开始--------" << endl;cout << "初始化⽤户:" << endl;for (int i = 0; i < 10; i++){customerEnter();}enterWindow(time);while (1){display(time);enterWindow(time);isBusy(time);if (time/2 != 0){customerEnter();//没间隔两秒进⼊⼀位客户. }Sleep(1000);time++;if (time == 21){getchar();}}}};int main(){Simulater simulater;simulater.simulate();}。
C#__银行叫号系统课程设计
课程设计任务书课程名称:课程设计1(数据结构)设计题目:银行排队叫号系统1.问题描述:目前,在以银行营业大厅为代表的窗口行业,大量客户的拥挤排队已成为了这些企事业单位改善服务品质、提升营业形象的主要障碍。
排队(叫号)系统的使用将成为改变这种状况的有力手段。
排队系统完全模拟了人群排队全过程,通过取票进队、排队等待、叫号服务等功能,代替了人们站队的辛苦,把顾客排队等待的烦恼变成一段难得的休闲时光,使客户拥有了一个自由的空间和一份美好的心情。
排队叫号软件的具体操作流程为:●顾客取服务序号。
当顾客抵达服务大厅时,前往放置在入口处旁的取号机,并按一下其上的相应服务按钮,取号机会自动打印出一张服务单。
单上显示服务号及该服务号前面正在等待服务的人数。
●银行职员呼叫顾客,顾客的服务号就会按顺序的显示在显示屏上。
当一位顾客办事完毕后,柜台银行职员只需按呼叫器相应键,即可自动呼叫下一位顾客。
2. 功能要求:1)使用数组或链表以及C#接口和范型技术实现通用的队列功能;2)编写算法,利用队列模拟银行排队系统;3)利用多窗口分别模拟顾客取服务号、银行窗口服务顾客。
3.界面要求:用户界面设计不做统一规定,但应做到界面友好,易于操作。
4. 技术要求:要求利用面向对象的方法以及队列数据结构来完成系统的设计;在设计的过程中,建立清晰的类层次;在系统设计中要分析和定义各个类,每个类中要有各自的属性和方法;要求运用面向对象的机制来实现系统功能。
5.创新要求在基本要求达到后,可以进行创新设计(包括界面、功能、数据结构)。
6. 课程设计时间:1周(18课时)7. 课程设计的考核方式及评分方法1)考核方式⏹课程设计结束时,在机房当场验收。
⏹教师提供测试数据,检查运行结果是否正确。
⏹回答教师提出的问题。
⏹学生提交课程设计文档(A4纸打印)2)评分方法上机检查及答辩: 书面报告: 学习态度= 6 : 3 : 1,没有通过上机检查的其成绩直接记录不及格。
排队叫号系统工程设计方案.doc
排队叫号系统工程设计方案.doc排队叫号系统工程设计方案1 排队叫号系统工程设计方案目录1.需求分析(1)2.建设目标(1)3.系统设计(1)3.1系统原理图1 (2)3.2系统原理图(仅供参考)2 (3)3.3设备选型(3)1.需求分析1.1近年来,随着办证服务种类的增加及服务量的增大,排队等待以成为亟待解决的问题。
嘈杂、无序的排队,长时间站立等待,不仅使顾客的心情变的烦躁不安,同时也使服务人员的办公效率受到影响,整个营业场所变的混乱,严重损害了的服务形象。
1.2为了提高窗口的服务质量,树立良好的企业形象,经过充分市场调查、技术研究后,急需一种能有效实现完全模拟人群排队过程,通过取票进队、休息等候、叫号服务等功能,诠释了人性化的服务理念,使嘈杂混乱变的轻松有序客户心情轻松、服务效率提高的排队叫号系统。
1.3该排队叫号系统能让办理业务的群众进入大厅,在排队机上取号后,坐在座椅上等候即可,智能排队系统将通过语音自动按顺序叫号。
原来不同业务在不同窗口办理,办理业务的群众可能要排几次队,启用智能排队系统后,所有业务一站式办理,排一次队就行了。
1.4排队机、电子显示屏通过联动能随时“提醒”门外等候的市民,排队机屏幕上有本厅的各项业务的选项,前来办事者只需按自己办事的类型触摸按钮,机器的“口”里就会吐出一张排号单,机器的“眼睛”同时会显示出正在等候的人数和预计等候的时间。
1.5所建排队叫号系统应操作简单,维护方便,符合用户使用习惯。
2.建设目标充分利用计算机网络、多媒体、数据库、数字通信等先进技术构筑的排队叫号平台,实现智能排队自动化管理系统。
采用统一的网络协议和接口标准:选用当前流行的TCP/IP 协议。
3.系统设计根据大厅功能需求的具体情况,我们目前建议选用深圳来邦排队叫号系统技术。
13.1系统原理图13 3.2系统原理图(仅供参考)23.3设备选型1、排队管理机(LB-81-16)产品性能●主机支架成型制造,外形美观、大方●主机界面采用17英寸大屏幕液晶显示器●整个系统由电脑和软件控制;软件直接控制叫号系统、显示系统、语音系统及号票打印;专业开发,界面直观,操作简单●系统安装简捷,电脑和打印机内置安装●直接热敏行式打印,打印号票清晰,号票内容可以编辑●号票上有呼叫号码、办理的队列业务名称、当前等待人数、取票时间等信息,系统根据该号码代替顾客自动排成队列。
排队叫号系统带源程序)
if(rturn=='N')
return;
}
break;
case 4: /*退出*/
{
Destroy(lqueue);
return;
}
break;
default:
break;
}
}
}
封装的头文件:
typedef struct qnode
{
int data;
struct qnode * next;
{
p1=p;
p=p->next;
free(p1);/*逐个释放队列的节点*/
}
整个程序的流程图如下:
五 调试分析
1、该程序的关键就是弄清楚队列及链表的操作方法和原理。首先保证没有句法错误,其次要保证写的函数没有错误,能正常完成要求所需的功能,然后尽量完善各功能,使用户用起来更方便。
2、叫号时,输入不同的用户名,随时进行业务处理和队列信息浏览,查看相应功能是否正确。
{
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;/*队头指向入队元素*/
printf("还有%d个人的业务未处理:\n",countx);
while(p!=NULL)
