摘 要: 针对无线呼叫系统中呼叫先后排序、多呼叫同时显示等问题,提出采用队列为核心思想的低成本嵌入式无线呼叫系统。该系统硬件电路功能完善,创新程序设计,按呼叫顺序存储每个呼叫的号码形成队列,不漏过一个请求,依次序响应呼叫,以体现人性化及提高服务质量。
关键词: 无线;嵌入式;队列;人性化
无线呼叫系统广泛应用于服务行业中(如宾馆、饭店、酒吧、咖啡厅、医院等),服务人员可以同时为众多个房间、服务对象提供服务。但如何解决先后呼叫的响应,按呼叫时间的先后显示多个呼叫号码,提高工作效率方面还有待提高。本文介绍的呼叫系统,为了尽量降低成本,只有收、发和提示等模块,但设计电路功能完备,程序设计独特,充分考虑呼叫的先后顺序,在收端存下接收的号码形成一个有序的队列,显示时按先后顺序显示,让服务人员依次响应,以提升服务水平与服务对象满意度。
1 系统总体设计
无线呼叫系统由发射、接收、提示三部分组成,系统框图如图1所示。
1.1 发射与接收
发射与接收选用CC1100模块。发射部分因整体较小,单片机采用体积小、价格低的AT89C2051。接收部分采用性能可靠、价格低、程序设计成熟的MCS51单片机[1]。用于存储号码的外部数据存储器RAM选用6264,它是一个很稳定的存储器。显示芯片选用CH451,既方便又可以大量节约单片机资源,级联使用来驱动五排数码管。
发射部分由用户自己设定地址(同时也是呼叫的号码),可设为1~255(即最多255个呼叫器),不设0号,0号在程序中作为比较号码用。
1.2 无线传输
由于有众多呼叫号码,为避免碰撞,采用时分复用作为通信方式。此通信方式可靠性高、速度快,用在本系统中可方便快捷地传输数据。只需要把255个呼叫数据放入255个时隙中,CC1100模块就能轻松地实现无线传输。
2 硬件电路原理
硬件电路图分别如图2、图3所示。
发射部分的拨码开关用来设定地址(即呼叫号码),从1~255;按键起呼叫作用,当接收部分接收到呼叫的号码时,会返回确认信息,使LED灯亮。
接收部分的MCS51单片机用于控制,从CC1100接收到的号码按顺序存储在6264存储器中,从地址00H~FEH,依次存放成循环队列。因为程序中有比较呼叫号码是否相同的设计,所以呼叫号码会与原来存储的号码相比较,发现是重号时将其丢弃,这样,号码不会多存,而存下来的号码都是按呼叫的先后顺序存放的,显示时也按队列先后顺序显示,使服务人员能及时有序地依次为服务对象提供服务。
5个CH451显示芯片级联使用,驱动五排数码管,顺序显示先后呼叫的号码。MCS51单片机的P1.0脚连确认按键,当有按键按下时,第一排数码管的号码被清除,再将存在外部数据存储器中的号码清0,剩下的4排号码前移,再从6264存储器中读一个号码来显示,当没有号码时则不显示;再有按键按下时再清除一个号码,如此循环。
MCS51的P3.7口连蜂鸣器,当接收到呼叫时,如果不是重号就鸣响提示。74LS373为地址锁存器。
3 程序设计
由于程序流程较复杂,程序设计参考了参考文献[2]中的某些观点。
3.1 程序流程
主程序流程图如图4所示。主程序开始后先判断是否有应答按键,如果有,则转入显示与移位子程序,没有就检查是否有呼叫,若没有就跳回到判断是否应答,如此循环;当有呼叫时,先比较呼叫号码是否为0号(因为在系统中0是做比较判断的号码),是0号就要丢弃,如果不是0号,则蜂鸣提示,再与外部数据存储器所存的号码比较,判断呼叫的号码是否与存放的号码相同,若相同则丢弃,不同则存在队尾,如此循环构成队列。
当呼叫的号码不是重号,则送显示。由于最多显示5个号码,所以设R1为显示计数器,当显示的号码多于5个时不再显示。
显示与移位子程序流程图如图5所示。调用显示与移位子程序时先屏蔽呼叫中断,以防止在子程序中有呼叫而改变R1的值产生混乱。判断R1是否为0可以判断外部数据存储器是否还有号码,没有就不需显示移位;若有号码,就清除第一排显示的号码,同时将相应外部数据存储器地址中存储的号码清0。然后把下面的号码上移,在显示上移时,如果发现读取的存储号码为0,表明已到队尾,则停止读号码,但需把显示定位器R2减1,回到上一地址,同时R1减1,以便有新号码时直接显示;如果读取的存储号码不为0,则循环5次,这样就按呼叫顺序显示了号码。
3.2 队列的采用
队列说明如图6所示。图6(a)中间的箭头表示数据的存储和循环方向,呼叫号码就从地址00H开始存放,依地址顺序循环存储;左边箭头表示队尾指针R0的循环;右边箭头表示队头指针(同时也是显示定位指针)R2的循环。图6(b)表示当存下一个号码后队尾指针R0将指向下一个地址,可见队尾指针并不是指向队尾,而是队尾的下一位。图6(c)表示当有按键按下响应时,将队头指针R2原来指向的地址数据清0,再指向队头,此时,显示的号码从这里开始显示。FFH处先置0可防止死循环。
3.3 主要程序编写
比较是否重号:设新呼叫的号码存入30H。
MOV 31H,R0;保存R0
LOOP:DEC R0;地址减1
MOVX A,@R0;读外部RAM数值
CJNE A,30H,NOTEQ1;新旧号码比较
EQUAT1:CLR A;重号,丢弃
LJMP START1;返回到开始
NOTEQ1:DEC R0;指向下一地址
MOVX A,@R0;读外部RAM数值
CJNE A,#00H,NOTEQ2;与0比较
EQUAT2:MOV R0,31H;已到队头,返回R0值
MOV A,30H;把新呼叫的号码给A
MOVX @R0,A; 存到外部RAM
AJMP NEXT; 进行下一步
NOTEQ2:AJMP LOOP; 未到队头,继续比较
NEXT:……
本文提出的队列方法结合嵌入式微控制器应用于呼叫系统中,很好地解决了多呼叫顺序响应、多号码排序显示的问题。若要提升系统性能,可选用更好的嵌入式处理器。本设计经过适当修改可应用于类似系统中,具有较高的实用价值。
参考文献
[1] HYDE R著.汇编语言编程艺术[M].陈曙晖,译.北京:清华大学出版社,2005.
[2] 王志英.嵌入式系统原理与设计[M].北京:高等教育出版社,2007.