××××××××× 本科生毕业论文(设计)
基于51单片机的排队机叫号系统设计 ×× 工程系 电气工程及其自动化 08电气3班 ××××× ×××
2012年 6月 10日
目 录
摘 要 ....................................................................................................................................................................I ABSTRACT .......................................................................................................................................................... II 第一章 绪论 ........................................................................................................................................................... 1 1.1引言 ............................................................................................................................................................... 1 1.2 排队系统的功能简介 .................................................................................................................................. 1 1.2.1 系统的流程图 .................................................................. 1 1.2.2 取号 .......................................................................... 2 1.2.3 排队 .......................................................................... 2 1.2.4 叫号 .......................................................................... 3 第二章 排队机叫号系统的硬件电路设计 ........................................................................................................... 4 2.1 取号机硬件电路设计 .................................................................................................................................. 4 2.1.1取号输入装置电路设计 .......................................................... 4 2.1.2 MCU电路设计 .................................................................. 4 2.1.3 M-150II针式打印机电路设计 .................................................... 6 2.1.4 LCD液晶显示电路设计 .......................................................... 7 2.2 窗口叫号系统硬件电路设计 ...................................................................................................................... 8 2.2.1叫号输入装置电路的设计 ........................................................ 8 2.2.2 MCU 电路的设计 ................................................................ 8 2.2.3窗口LED显示屏电路 ............................................................ 9 2.3 主控电路硬件电路设计 ............................................................................................................................ 11 2.4 语音及大厅显示硬件电路设计 ................................................................................................................ 12 2.4.1 语音部分电路设计 ............................................................. 13 2.4.2 LCD 显示部分电路设计 ......................................................... 14 2.4.3 MCU 电路设计 ................................................................. 14 2.4 无线通信部分硬件电路设计 .................................................................................................................... 15 第三章 排队机叫号系统的软件设计 ................................................................................................................. 18 3.1 取号机软件设计 ........................................................................................................................................ 18 3.1.1 设计流程图 ................................................................... 18 3.1.2 M-150II打印机部分 ........................................................... 18 3.1.3 LCD12864驱动部分 ............................................................ 23 3.2 窗口叫号系统软件设计 ............................................................................................................................ 29 3.2.1 设计流程图 ................................................................... 29 3.2.2 LED显示部分 ................................................................. 29 3.2.4 MCU主控部分 ................................................................. 31 3.3 大厅语音及LCD显示部分 ...................................................................................................................... 32 3.3.1 设计流程图 ................................................................... 32 3.3.2 语音系统部分 ................................................................. 33 3.3.3 主控系统软件设计 ............................................................. 38 第四章 系统设计总结分析 ................................................................................................................................. 42
4.1 设计的实用性 ............................................................................................................................................ 42 4.2 排队机叫号系统的应用前景 .................................................................................................................... 42 参考文献 ............................................................................................................................................................... 44 致谢 ....................................................................................................................................................................... 45 附录1 .................................................................................................................................................................... 46 附录2 .................................................................................................................................................................... 51
青岛农业大学海都学院工程系电气本科毕业设计
基于51单片机的排队机叫号系统设计
摘 要
随着经济的迅速发展,业务数量也迅速增多扩展,以营业大厅为代表的窗口行业,大量客户的拥挤排队已成为了这些网点改善服务品质、提升自身形象的障碍,避免一些不必要的麻烦和冲突。日常研究调查统计发现,没有任何组织管理的排队是最能影响客户心情的因素。有关统计发现,客户等待10分钟以上,开始出现浮躁;大于20分钟后会出现烦感;如果要是超出40分钟,很大部分人会因为生气而离开。但排队又是不可避免的,如果让等待的时间变为一段难得的休闲时间,则可在一定程度上有效地降低客户的焦虑情绪。
本文分析了国内外对于排队解决方案的利弊,通过总结最终提出自己的见解。而后论述了基于51单片机的排队机叫号系统的实现原理,并针对整个系统的硬件结构和软件设计作出了现实可行的方案,并完成了实际模型的制作。
该系统的设计通过取号实现了公平的先后顺序排队,避免了因插队、抢队引起的摩擦;
关键字:单片机、打印机、无线通信、语音系统
I
青岛农业大学海都学院工程系电气本科毕业设计
Queue number calling system design Based on 51MCU
Abstract
With the rapid development of the economy, business volume also increased rapidly extended to the business hall, as the representative of the window industry, a large number of customers queuing has become crowded these outlets to improve service quality, enhance their image barriers, effectively reduce and avoid the employees and customers of the conflict. Behavioral scientists found, jumping the queue is the impact of customer service is one of the main reasons. The results show that, for more than 10 minutes, emotional impatient to start; more than 20 minutes then begins to annoy; more than 40 minutes, often angry and leave. But queueing is inevitable, if the waiting time is a rare leisure time, are in a certain extent can effectively reduce the client's anxiety.
This paper analyzes the external address queue on the issue of the status quo, analysis of the advantages and disadvantages of various methods, and proposes own opinion. Then discusses the51 based on the queue number calling system for the realization of the principle, and the hardware structure of the system and the design of software to make feasible solution, and completed the actual model making.
The design of the system by taking the number of the fair order line, avoids the queue, grab the team caused by friction;
Keywords: single chip microcomputer, printer, wireless communication, voice system
II
青岛农业大学海都学院工程系电气本科毕业设计
第一章 绪论
1.1引言
近几年,伴随着科学技术的飞速发展和人们消费水平的提高,各行各业尤其是以企业的营业厅的服务质量竞争越来越大。越来越多的企业将营业厅的服务态度和服务质量当作一个企业的整体的形象,并且这一做法也深受消费者的喜爱和认可,而营业厅的服务窗口正是作为企业形象的主要表现形式之一。
经济增长无疑会增加企业的服务增加,营业厅的排队问题也更加的突出。长时间以来,人们在医院、银行、移动、国企、个企等服务窗口拥挤、混乱地排队等待,有时需要等候好几个小时,这似乎已经成为很常见的事情,极大地影响了消费者的心情。对于营业厅的服务质量差,越来越多的人感觉到不满意,因此提高营业厅的服务质量、解决因排队带来的疲劳、烦感、创造更加高效、人性化服务环境已成为当前急需解决的现实问题。设计智能轻松的排队服务系统,解决因排队引起的种种问题,显得尤为重要,因此本文针对以上问题设计了一套基于51单片机的排队机叫号系统。
本系统可以真正模拟人们的排队过程,通过叫号的顺序给出相应的业务号码,通过叫号的形式来一次接受服务,而在这期间人们可以在等候室等候,等候室提供座椅和报纸期刊,舒缓顾客等待的急噪情绪,使人们人们能够舒适的等候排队,真正做到了高科技化服务体系。
本文基于51单片机的排队叫号系统,由取号机、客户服务窗口、大厅显示叫号和主机部分组成,有LCD大屏幕,可以显示客户被呼叫的信息,让客户知道什么时候被叫到去办理业务,另外还有语音提示客户,简单方便的实现了排队机叫号系统。
1.2 排队系统的功能简介
1.2.1 系统的流程图
下图为排队叫号系统的整个流程如图1-2-1:
1
青岛农业大学海都学院工程系电气本科毕业设计
图1-2-1排队叫号系统的整个流程
整个过程井然有序,大大提高了工作的效率,真正的做到了科技的人性化。 1.2.2 取号
取票过程是指客户进入营业厅之后,从取号机上获取自己相应的排队小票的过程。 本系统中采用按键输入信息,客户在确定自己的业务类型之后,通过按键输入自己的业务类型,MCU接收到输入的信息后,会在对应的业务类型所排队的人数上面自动加1,并将最终的号码、前面还有多少人在排队、日期、时间等信息发送至M-150II打印机,进行小票的打印,最后打印完毕,客户拿到小票到等候室等候呼叫自己的号码。
在此期间取票机会通过NRF24L01无线通信的方式将客户刚刚打印的小票信息发送到主机,主机收到数据后并作出应答,此时取票机准备下一次的取号。因为此部分的MCU采用1T的单片机作为核心,所以整个过程什么的迅速,更加的提高了工作效率。
客户拿到的小票上面显示当前日期、时间、排队号码、以及前面有多少人在排对等信息。 1.2.3 排队
客户在领取自己的排队小票之后,进入等候室等候叫号。为了更加人性化的服务于客户,企业可以在等候区设置座椅,提供报纸、书刊,放置公司的相关业务介绍,增加客户等候时的趣味性的同时,还可以让客户更加的了解本公司的业务类型,可谓一举两得。
2
青岛农业大学海都学院工程系电气本科毕业设计
1.2.4 叫号
叫号是指通知客户到相应的窗口进行服务的过程。
叫号有两种变现形式,一种通过语音呼叫客户到相应的窗口进行服务;另一种方式是通过大厅的LCD显示屏显示“请xxx号到xx窗口”,与此同时窗口也会显示相应客户“xxx”号码,客户可以直观的找到自己相应的办理窗口。此过程有效地避免了因拥挤带来的一系列问题。
3
青岛农业大学海都学院工程系电气本科毕业设计
第二章 排队机叫号系统的硬件电路设计
2.1 取号机硬件电路设计
取号机硬件电路包括打印机、LCD液晶、无线通信、按键、MCU五部分组成。 2.1.1取号输入装置电路设计
按键输入电路如图2-1-1:
图 2-1-1按键电路
本文的设计中提供了3个按键,分别对应3中不同的业务类型,客户在选择服务类型的时候,只需要按一下对应的按键即可完成取号过程的所有操作,简单易懂。 2.1.2 MCU电路设计
取号机部分采用宏晶公司出款的STC12C5410AD 1T单片机作为主控芯片,是高速/低功耗/超强抗干扰的新一代8051单片机,兼容传统的8051数据指令代码,但提高了8-10倍的速度。内部使用了MAX810专用复位电路。程序存储空间10K,片上集成512字节RAM。
STC12C5410AD系列单片机的内部结构如图2-1-2所示,包含中央处理器(CPU)、程序存储器(Flash)、数据存储器(SRAM)、定时计数器、UART串口、I/O接口、高速AD转换、SPI接口、PCA、看门狗及片内R/C震荡器和外部晶振体振荡电路等模块。
4
青岛农业大学海都学院工程系电气本科毕业设计
图2-1-2 STC12C5410AD系列单片机的内部结构图
STC12C5410AD数据存储器EEPROM。单片机内集成了EEPROM是独立的,与程序空间是互相独立的,利用ISP/IAP技术可将内部Flash存储器用作EEPROM,可以重复读写10万次以上,EEPROM拥有很多独立的扇区,每一个有512字节,在使用时,放在同一个扇区内的数据必须一块擦写,可以不用满,整体是按一个扇区一个扇区的擦出的。
本设计中用EEPROM来存储一些在应用过程中需要修改且掉电不丢失的参数数据,在程序中可以对EEPROM进行字节的读写操作。
MCU外围电路设计如图2-1-3:
图2-1-3 单片机最小系统
5
青岛农业大学海都学院工程系电气本科毕业设计
2.1.3 M-150II针式打印机电路设计
本设计中使用EPSON的M-150II针式微型打印机。
针式微型打印机是市面上通用的微型打印机,我国很早之前就已经有用EPSON打印头研发生产产品。微型打印机构造很简单简单、使用的历史也长、性价比高、能耗比较少。最进几年经济快速的发展,也很大的提高了微型打印机的性能,并且越来越专业化,现在的很多工业等仪表均采用微型打印机。它扮演的角色也愈加的重要。微型打印机的使用,使人们可以很方便的保存要使用的数据,而不易于丢失。凭借着价格低廉的优势,微型打印机占据的市场也日益扩大开来。拥有很好的前景。
EPSON M-150II微型打印机机芯主要由直流电机(Motor)、测速感应线圈(Timing Detector)、干簧管复位开关(Reset Detector)、电磁打印针(Print Solenoid)ABCD、色带、与电机连接的滑槽轮以及蜗杆等部分组成。终端分配如图2-1-4所示:
图2-1-4 M-150II打印机终端分配
M-150II 打印机一行可打印96个点,若英文字符采用5乘7点阵的话,则一行可打印16个字符,打印速度为1行/秒,它采用45MM宽的普通打印纸打印,日常维护和更换较方便。它的可靠使用寿命为500000行,体积很小,为73.4mm乘42.6mm乘12.8mm,重量只有60g,非常适用于安装在取号机内部。
6
青岛农业大学海都学院工程系电气本科毕业设计
打印机驱动电路原理如图2-1-5所示:
图2-1-5 打印机驱动电路
2.1.4 LCD液晶显示电路设计
为了更加人性化的设计取号机,本设计中此部分加入了LCD12864液晶显示,主要用于显示客户小票上的信息和一下必要的设置菜单。
具体的驱动电路如图2-1-6所示:
图2-1-6 12864液晶驱动电路
7
青岛农业大学海都学院工程系电气本科毕业设计
2.2 窗口叫号系统硬件电路设计
窗口叫号系统由输入装置、LED显示屏、无线通信、MCU部分。本系统主要负责完成由营业员操作,通过按键可以来选择呼叫下一位客户或者重复呼叫当前的客户。于此同时无线通信模块会将呼叫的客户信息及时的发送到主控端,进行数据处理。客户听到语音呼叫或者大屏幕上显示的号码之后就会前来办理业务。 十分的简单方便。
2.2.1叫号输入装置电路的设计
按键输入装置电路为两个按键,一个负责呼叫下一位客户,一个负责重复呼叫,身份的简单可靠。电路如图2-2-1所示:
图2-2-1 按键输入电路
2.2.2 MCU 电路的设计
此部分电路的MCU采用了和取号机部分相同的STC12C5410AD单片机,使得代码的编写和移植更为的方便。具体的关于MCU单片机的详细内容请参考2.1.2章节的内容,此处不作详细介绍,电路原理图如下图2-2-2所示:
8
青岛农业大学海都学院工程系电气本科毕业设计
图2-2-2 窗口叫号系统MCU电路
2.2.3窗口LED显示屏电路
市面上已有的相关的产品的显示屏多采用3英寸点阵显示屏或3英寸数码管显示屏,各有利弊,点阵式显示屏可以显示汉字、字幕、数字,比较随意灵活,但是亮度不是很高,对于亮度要求很高的场合不太适合;数码管显示屏,只能显示数字或字幕,不能显示汉字,但是数码管亮度高,颜色饱满红润,看上去比较舒服。总之各有利弊。
本设计中采用了数码管显示屏,应为其电路简单,易于操控,更加的节约成本。采用了0.56英寸共阴极高亮红色4位8段数码管。采用动态扫描的方式显示客户的号码。数码管的驱动电路采用了74HC573来增加电流,驱动数码管的段。对于位选直接用单片机的IO来驱动,达到稳定显示的目的下,几乎用了最简单的方法来驱动电路。 数码管基本参数如图2-2-3所示,数码管驱动电路如图2-2-4所示。
9
青岛农业大学海都学院工程系电气本科毕业设计
图2-2-3 数码管基本参数
图2-2-4 窗口LED显示驱动电路
10
青岛农业大学海都学院工程系电气本科毕业设计
2.3 主控电路硬件电路设计
主控MCU在整个的系统中充当着最重要的角色,他在整个系统中起到了系统宏观调节的作用,首先主控电路要通过曲线通信接收来自取号机的数据,将客户的取号存入系统之中,同时主控电路还要实时接收来自服务窗口的数据,本系统中设有3个服务窗口,分别对应3种不同的业务。对于来自窗口的请求数据,主控芯片接收后立即处理,判断之后将对应的客户号码发送到服务窗口和大厅的显示屏及语音系统。
强大的通信及数据处理就要求主控MCU要有强大的处理能力,才能时刻保持整个系统的运行畅通,不会出现数据丢失或发生错误等现象。所以本系统中主控电路采用的是STC公司出款的STC12C5A60S2 1T单片机。
STC12C5A60S2 1T单片机,是STC出款的单时钟/机器周期(1T)的单片机,是高速/低功耗/高抗干扰的新型8051单片机,兼容传统全部的8051的指令代码,但提高了8-10倍的速度。内部拥有MAX810专用的复位电路,2路PWM。程序存储空间60K;片上集成1280字节RAM;且具有双串口可同时通信。
STC12C5A60S2系列单片机的内部结构如图2-1-2所示,包含中央处理器(CPU)、程序存储器(Flash)、数据存储器(SRAM)、定时计数器、UART串口、I/O接口、高速AD转换、SPI接口、PCA、看门狗及片内R/C震荡器和外部晶振体振荡电路等模块。内部结构图如图2-3-1所示。
系统时钟源采用外部晶振22.1184MHZ,极大地提高了系统的数据处理速度,使得系统的处理速度更加快速,能够快速收发无线通信,并能够快速处理数据信息。是系统变得更加敏捷迅速。
强大的硬件支持,是系统的整个运行流畅完美。
11
青岛农业大学海都学院工程系电气本科毕业设计
图2-3-1 STC12C5A60S2单片机内部结构图
STC12C5A60S2外围电路如图2-3-2所示:
图2-3-2 STC12C5A60S2 外围电路
2.4 语音及大厅显示硬件电路设计
语音模块采用的是ISD公司的ISD4004芯片。
ISD4004语音芯片由美国ISD公司推出,芯片内部高度的集成化,振荡器、滤波器、除噪音、防大功率等均集于一体,仅仅需要几个外围电路就可以构成一个很强大的语音
12
青岛农业大学海都学院工程系电气本科毕业设计
录制播放的系统。通信方式采用SPI串行接口输入。采样频率可分为8、6.4、5.3、4KHZ,与所能录制的时间成反比,与音质成正比。芯片存储器内的数据更是可以保存100年在短点的情况下,而且可以录制10次左右而不损坏。市场上很多的电子产品均在采用此款芯片。
显示部分采用的是LCD 12864液晶显示,因为距离客户距离很进,这样可以更加直观形象的将信息传递给每一个客户。
LCD12864液晶可以显示汉字、字母、数字符号等,这样就可以利用液晶同时显示4个客户的信息,分别占据一行,这儿样客户就可以提前看到自己被呼叫的相关信息。 2.4.1 语音部分电路设计
语音电路部分包括话筒输入部分、放音部分,还有语音芯片。
语音输入部分采用的是咪头话筒,该话筒体积小便于调试安装,内部电路如图2-4-1所示:
图2-4-1咪头话筒内部电路
咪头话筒技术参数资料如下图2-4-2所示:
图2-4-2 咪头话筒技术参数
ISD4004系列语音芯片ISD4004-08、ISD4004-10、ISD4004-12、ISD4004-16共4
13
青岛农业大学海都学院工程系电气本科毕业设计
款不同的芯片,每种芯片的具体参数如下图2-4-3所示:
图2-4-3 ISD4004系列芯片参数
本设计中采用的是ISD4004-08芯片,8分钟即可满足设计的需求,ISD4004-08芯片可以分为2400段存储空间,即最多可以录制2400段录音,也可以连续的录音,读取每一段的其实地址即可放音。驱动电路见下图2-4-4所示电路:
图2-4-4 ISD4004驱动电路
电路中对于ISD4004语音输入的MIC接口电路做了去耦滤波的处理,使得输入的声音信号更加清新平稳,尽量减噪音的影响。放音电路采用了LM386芯片放大声音信号,使得输出的电压信号可以驱动较大点的喇叭,省的声音更大更清晰,效果更好。 2.4.2 LCD 显示部分电路设计
此部分的电路设计与取号机部分的显示电路相同,具体电路及内容请参考2.1.4章节的内容。此处不作重复声明。 2.4.3 MCU 电路设计
此部分的MCU为主控电路的MCU所控制,详情见主控电路MCU的具体参数说明及其
14
青岛农业大学海都学院工程系电气本科毕业设计
电路。
2.4 无线通信部分硬件电路设计
此节的无线通信部分为取号机、窗口、主控电路部分共同所有。
本文设计的无线通信系统采用的是NRF24L01无线通信模块。极低的电流消耗:如果工作在正常模式下,发射的功率会为-6dBm的时候,电流会为9mA,接收的时候有12.3mA。工作在掉电模式与待机模式的时候会更低。
基本参考数据如图2-4-5所示:
图2-4-5 NRF24L01基本参数
NRF24L01模块拥有6个独立的通道,在接收状态下,NRF24L01能够收到6个通道的信号,见图2-4-6所示,每一个信号通道必须使用互不相同的地址,可以公用相同的数据频道,相当于6个发送的模块对应一个接收的模块可以实现。只有通道0拥有可以设置为40位自身地址通道。1~5信号通道仅仅拥有8位自身和32位公用地址,但所有的数据通道都可以通过软件设置为增强型。
NRF24L01在收到某个通道的数据后会记录地址,紧接着会以此地址为应答地址发送应答信号。发送数据端,信号通道0会被用作接收应答信号,所以,接受不发生错误,通道0要与发送端的地址相同,这样才能保证正常的运行。
15
青岛农业大学海都学院工程系电气本科毕业设计
图2-4-6 NRF24L01接收发送对应关系
NRF24L01的外围驱动电路如下图2-4-7所示:
图2-4-7 NRF24L01电路
NRF24L01芯片的工作电压为1.9-3.6V,IO可以直接输入5V电压,所以IO口可以直接与单片机的IO口相连,对于工作电压,本文设计中使用的是通用的3.3V工作电压,
16
青岛农业大学海都学院工程系电气本科毕业设计
采用的是AMS1117-3.3V稳压芯片,具体的稳压转换电路如下图2-4-8所示:
图2-4-8 AMS1117稳压电路
最后整个系统的5V电源均由5V开关电源提供,电流为2A,方便使用和移动。
17
青岛农业大学海都学院工程系电气本科毕业设计
第三章 排队机叫号系统的软件设计
软件部分的代码编写本设计中采用了C语言,简单明了,而且移植很方便,采用的编程软件为keil4,一共分为4个大的部分:取号机部分代码、窗口叫号部分代码、主控+语音液晶显示部分代码、无线通信部分代码。
3.1 取号机软件设计
取号机代码的编写可以分为三个部分:打印机驱动部分、液晶显示驱动部分、无线通信部分,无线通信部分详情见附录1。 3.1.1 设计流程图
本文在设计之前,对此部分做了流程图规划,具体内容如下图3-1-1:
图3-1-1 取号机软件设及流程
3.1.2 M-150II打印机部分
打印5×7点阵字符的时序图如图3-1-2所示,首先由脉冲宽度为定时信号Tn—Tn+1的打印脉冲Pn激励打印针A工作,然后由脉冲宽度为定时信号Tn+1—Tn+2的打印脉冲Pn+1激励打印针B工作,同样的打印针C被打印脉冲Pn+2激励工作,打印针D被打印脉冲Pn+3激励工作,接着打印针A再次被打印脉冲Pn+4所激励。按照这样的规律,打印针A、B、C、D依次被连续的打印脉冲所激励,直到完成打印任务。
18
青岛农业大学海都学院工程系电气本科毕业设计
图3-1-2 打印机时序图
驱动程序及注释如下:
#include #define uchar unsigned char #define uint unsigned int #define ASCSTART 0X20 #define HEAD 4 #define LET_PER_HEAD 4 #define VOL_PER_LET 6 #define LINE 9 uchar print _at_ 0x7fff; uchar LetBuf[HEAD][LET_PER_HEAD]; uchar PrtBuf[HEAD][LET_PER_HEAD]; /*------------------------------------------------------------------------- 源文件 / 文字 : !\\\"#$%&\\'()*+,-./0123456789:;<=>? @ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\\\] ^_`abcdefghijklmnopqrstuvwxyz{|}u 宽×高(像素): 570×8 字模格式/大小 : 单色点阵液晶字模,纵向取模,字节倒序/570字节 数据转换日期 : 02-8-13 9:44:55 19 青岛农业大学海都学院工程系电气本科毕业设计 --------------------------------------------------------------------------*/ uchar code ASCTable[][VOL_PER_LET] = { 0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x06,0x5F,0x06,0x00, 0x00,0x07,0x03,0x00,0x07,0x03, 0x00,0x24,0x7E,0x24,0x7E,0x24, 0x00,0x24,0x2B,0x6A,0x12,0x00, 0x00,0x63,0x13,0x08,0x64,0x63, 0x00,0x36,0x49,0x56,0x20,0x50, 0x00,0x00,0x07,0x03,0x00,0x00, 0x00,0x00,0x3E,0x41,0x00,0x00, 0x00,0x00,0x41,0x3E,0x00,0x00, 0x00,0x08,0x3E,0x1C,0x3E,0x08, 0x00,0x08,0x08,0x3E,0x08,0x08, 0x00,0x00,0xE0,0x60,0x00,0x00, 0x00,0x08,0x08,0x08,0x08,0x08, 0x00,0x00,0x60,0x60,0x00,0x00, 0x00,0x20,0x10,0x08,0x04,0x02, 0x00,0x3E,0x51,0x49,0x45,0x3E, 0x00,0x00,0x42,0x7F,0x40,0x00, 0x00,0x62,0x51,0x49,0x49,0x46, 0x00,0x22,0x49,0x49,0x49,0x36, 0x00,0x18,0x14,0x12,0x7F,0x10, 0x00,0x2F,0x49,0x49,0x49,0x31, 0x00,0x3C,0x4A,0x49,0x49,0x30, 0x00,0x01,0x71,0x09,0x05,0x03, 0x00,0x36,0x49,0x49,0x49,0x36, 0x00,0x06,0x49,0x49,0x29,0x1E, 0x00,0x00,0x6C,0x6C,0x00,0x00, 0x00,0x00,0xEC,0x6C,0x00,0x00, 0x00,0x08,0x14,0x22,0x41,0x00, 20 青岛农业大学海都学院工程系电气本科毕业设计 0x00,0x24,0x24,0x24,0x24,0x24, 0x00,0x00,0x41,0x22,0x14,0x08, 0x00,0x02,0x01,0x59,0x09,0x06, 0x00,0x3E,0x41,0x5D,0x55,0x1E, 0x00,0x7E,0x11,0x11,0x11,0x7E, 0x00,0x7F,0x49,0x49,0x49,0x36, 0x00,0x3E,0x41,0x41,0x41,0x22, }; void BuildPrtBuf(uchar line) { uchar head, let, vol; uchar t1; uchar t2; for (head=0; head for (vol=0; vol PrtBuf[head][let] = t2; } } void PrintLetLine() //打印一个字符行 { uchar head, vol, line, let; 21 青岛农业大学海都学院工程系电气本科毕业设计 for (line = 0; line < LINE; line++) { BuildPrtBuf(line); while (!P3_3) ; for (let = 0; let < LET_PER_HEAD; let++) { for (vol = 0; vol < VOL_PER_LET; vol++) { for (head = 0; head < HEAD; head++) { while (!P3_2) ; print = 0x10; print = (0x10 | ( (PrtBuf[head][let] & 0x01) << head)); Delay_us(23); PrtBuf[head][let] >>= 1; } } } Delay_us(20); print = 0x10; } } void Print() { uchar head, let, i; print = 0x00; P1_1 = 0; Delay_us(0xc8*0x64); print = 0x10; 22 青岛农业大学海都学院工程系电气本科毕业设计 for (i = 0; i< 5; i++) { sprintf(LetBuf, \\\"%d Hello World!\\\ PrintLetLine(); } print = 0x00; P1_1 = 1; Delay_us(1); print = 0x00; } 3.1.3 LCD12864驱动部分 LCD12864液晶的时序图如图3-1-3所示: 图3-1-3 12864液晶串行口时序图 12864液晶初始化的流程图如图3-1-4所示: 23 青岛农业大学海都学院工程系电气本科毕业设计 图3-1-4 12864液晶初始化的流程图 程序及注释如下: #include sbit LCD_CS = P2^3; sbit LCD_SID= P2^2; sbit LCD_CLK= P2^1; sbit LCD_RST= P2^0; uchar code Bit_num[]=\"0123456789ABCDEF\"; /************************************************************/ void LCD12864_Write(uchar Com_Dat,uchar Byte) { uchar a,b,Temp; uchar P[3]; if(Com_Dat == 0) else P[0] = 0XF8; //写指令 P[0] = 0XFA; //写数据 24 青岛农业大学海都学院工程系电气本科毕业设计 } /*********************************************************/ void LCD12864_init() //初始化 { P[1] = 0XF0 & Byte; P[2] = (0X0F & Byte)<<4; LCD_SID= 0; LCD_CLK= 0; LCD_CS = 1; for(a=0;a<3;a++) { } LCD_CS = 0; //拉低CS结束写入数据 Temp = P[a]; for(b=0;b<8;b++) { } if(Temp & 0X80) else LCD_SID = 0; LCD_SID = 1; LCD_CLK= 1; LCD_CLK= 0; Temp <<= 1; LCD_RST = 0; Delay_ms(40); LCD_RST = 1; LCD12864_Write(Com,0X30); Delay_ms(1); LCD12864_Write(Com,0X30); 25 青岛农业大学海都学院工程系电气本科毕业设计 } /*********************************************************/ void LCD12864_Writebits(uchar x,uchar y,uchar *s) //指定位置写入指定字符串 { Delay_ms(1); LCD12864_Write(Com,0X0C); Delay_ms(1); LCD12864_Write(Com,0X01); Delay_ms(1); LCD12864_Write(Com,0X06); Delay_ms(1); //清除屏幕 LCD12864_Writebits(0,0,Character1); //写入初始化汉字 uchar i,Pos; switch(x) { } Pos = x + y; LCD12864_Write(Com,0X30); LCD12864_Write(Com,Pos); //设定显示位置 case 0: x = 0X80; break; case 1: x = 0X90; break; case 2: x = 0X88; break; case 3: x = 0X98; break; while(s[i] != '\\0') { } LCD12864_Write(Dat,s[i]); i++; 26 青岛农业大学海都学院工程系电气本科毕业设计 } /*********************************************************/ void LCD12864_Writenum(uchar x,uchar *Data) { } void LCD12864_ClearTXT() //清除文本 { uchar i; LCD12864_Write(Com,0x30); LCD12864_Write(Com,0x80); for(i=0;i<64;i++) LCD12864_Write(Dat,0x20); } void LCD12864_bmp(uchar *puts) { switch(x) { } LCD12864_Write(Com,x+1); //设定显示位置 LCD12864_Write(Dat,Bit_num[(Data[0]&0xf0)>>4]); LCD12864_Write(Dat,Bit_num[Data[0]&0x0f]); LCD12864_Write(Dat,Bit_num[(Data[1]&0xf0)>>4]); LCD12864_Write(Dat,Bit_num[Data[1]&0x0f]); case 0: x = 0X80; break; case 1: x = 0X90; break; case 2: x = 0X88; break; case 3: x = 0X98; break; //绘图函数 uint x=0; uchar i,j; 27 青岛农业大学海都学院工程系电气本科毕业设计 } void LCD12864_clearBMP() //清除图形函数 { uchar i,j; LCD12864_Write(Com,0x34); LCD12864_Write(Com,0x36); for(i=0;i<32;i++) { LCD12864_Write(Com,0x80|i); //行位置 LCD12864_Write(Com,0x80); //列位置 for(j=0;j<32;j++) LCD12864_Write(Dat,0); for(i=0;i<32;i++) { LCD12864_Write(Com,0x80|i); LCD12864_Write(Com,0x80); for(j=0;j<16;j++) //16*8=256 } for(i=0;i<32;i++) { } LCD12864_Write(Com,0x80|i); LCD12864_Write(Com,0x88); //下半屏 for(j=0;j<16;j++) LCD12864_Write(Dat,puts[x++]); LCD12864_Write(Dat,puts[x++]); LCD12864_Write(Com,0x34); //扩展指令 LCD12864_Write(Com,0x36); //打开绘图 } 28 青岛农业大学海都学院工程系电气本科毕业设计 } void LCD12864_ClearScans() //清屏 { } LCD12864_Write(Com,0X30); LCD12864_Write(Com,0X01); //清除屏幕 3.2 窗口叫号系统软件设计 窗口叫号系统主要分为LED显示、无线通信、主控MCU三部分的驱动程序,其中无线通信部分详见附录1。 3.2.1 设计流程图 图3-2-1 窗口叫号软件设及流程 3.2.2 LED显示部分 74HC573为八进制3态非反转透明锁存器,器件的输入是和标准的CMOS输出兼容的;加上上拉电阻,他们能和LS/ALSTTL输出兼容。 29 青岛农业大学海都学院工程系电气本科毕业设计 图3-2-2 74HC573 控制时序 程序代码及注释如下: #include \"ALL.h\" sbit Byte1=P2^0; sbit Byte2=P2^1; sbit Byte3=P2^6; sbit Byte4=P2^7; ucharcodeduan[]={0X3F,0X06,0X5B,0X4F,0X66,0X0D,0X7D,0X07,0X7F,0X6F,0X77,0X7C,0X39,0X5E,0X79,0X71}; // 0 1 2 3 4 5 6 7 8 9 A B C D E F void LED_Display(uchar *Display_data) //共阴极数码管显示函数 { uchar a,b,c,d; a = (Display_data[0]&0XF0)>>4; b = Display_data[0]&0X0F; c = (Display_data[1]&0XF0)>>4; d = Display_data[1]&0X0F; P1 = duan[a]; Byte1 = 0; Delay_ms(1); Byte1 = 1; 30 青岛农业大学海都学院工程系电气本科毕业设计 } P1 = duan[b]; Byte2 = 0; Delay_ms(1); Byte2 = 1; P1 = duan[c]; Byte3 = 0; Delay_ms(1); Byte3 = 1; P1 = duan[d]; Byte4 = 0; Delay_ms(1); Byte4 = 1; 3.2.4 MCU主控部分 这里MCU主要完成的功能是采集按键输入的信息,然后做出判断处理之后,控制LED显示相应的号码,及控制无线模块发送数据到主控芯片。完成数据的传送。 具体的程序编写如下: #include \"reg52.h\" uchar code TX_data0[] = uchar code TX_data1[] = void main() { {0X3D,0X01}; {0X3D,0X02}; // 重复呼叫 // 呼叫下一个 Init_Interrupt(); NRF24L01Int(); while(1) { //初始化中断 //初始化无线通信 if(EX0_flag == 1) //外部中断0标志位 31 青岛农业大学海都学院工程系电气本科毕业设计 } } { } else if(EX1_flag == 1) //外部中断1标志位 { } NRFRevDate(); //接收数据 EX1_flag = 0; NRFSetTxMode(TX_data1); //呼叫下一个 while(CheckACK()); //等待发送成功 NRFSetRXMode(); //设置为接收模式 EX0_flag = 0; NRFSetTxMode(TX_data0); //重复呼叫 while(CheckACK()); //等待发送成功 NRFSetRXMode(); //设置为接收模式 3.3 大厅语音及LCD显示部分 此部分系统包括:语音驱动代码、LCD驱动代码、无线通信代码及主控MCU代码。其中LCD液晶部分与3.1.3章节重复,此处不再作重复介绍,无线通信部分详见附录1。 3.3.1 设计流程图 本文对此部分的程序编写之前,写进行了流程图的设计,设计如图3-3-1所示: 图3-3-1 流程图 32 青岛农业大学海都学院工程系电气本科毕业设计 3.3.2 语音系统部分 ISD4004的时序如下图3-3-2所示: 图3-3-2 ISD4004时序图 ISD4004 8位命令格式如下图3-3-3所示: 图3-3-3 ISD4004 8位命令格式 ISD4004 24位命令格式如下图3-3-4所示: 图3-3-4 ISD4004 24位命令格式 33 青岛农业大学海都学院工程系电气本科毕业设计 ISD4004录音、停止时序如下图3-3-5所示: 图3-3-5 ISD4004录音、停止时序 ISD4004在使用之前需要将播放的声音录制到芯片内,本文的设计中,因为需要播放的声音信号种类不多,提前将“请、号、到、窗口、0、1、2、3、4、5、6、7、8、9、A、B、C”分别单独录制到芯片即可,因为每一段录音都拥有自己独立的地址,所以在播放录音时可以通过地址直接调用任何一段录音。比如在本设计中如需要播放“请A123号到1号窗口”,当大屏幕上显示此信息时,就会听到此信息的声音信号,具体的完成过程是将每一个字的声音信号单独从芯片的存储器中调用,然后将其连续的播放即可实现一段语音的连续播放。 ISD4004录音、放音、停止的程序及注释如下: #include <60S2.h> uint code CallNum[]={0X0000,0X0006,0X000C,0X0013,0X001A,0X001F,0X0027, 0X002E,0X0034,0X003B,0X0049,0X004F,0X0056,0X005D}; //语音0~D sbit SCLK = P1^0; sbit SS = P1^1; sbit MOSI = P1^2; sbit RAC=P1^3; sbit ISD_INT= P3^3; //中断 34 青岛农业大学海都学院工程系电气本科毕业设计 //************************************ //ISD4004 SPI 串行发送子程序,8 位数据 //************************************ void SPI_send(uchar Data) { uchar i; SCLK=0; for(i=0;i<8;i++) { if ((Data&0x01)==1) MOSI=1; else MOSI=0; SCLK=0; Delay_us(2); SCLK=1; Data=Data>>1; } } void ISD_stop() { Delay_us(10); SS=0; SPI_send(ISD_STOP); SS=1; } //******************************* //发送 上电指令 //******************************* void ISD_up() 35 青岛农业大学海都学院工程系电气本科毕业设计 { Delay_us(10); SS=0; SPI_send(ISD_POWER_UP); SS=1; } //******************************* //发送 掉电指令 //******************************* void ISD_down() { Delay_us(10); SS=0; SPI_send(ISD_POWER_DOWN); SS=1; } //******************************* void ISD_play() { SS=0; SPI_send(PLAY_NOW); SS=1; } //******************************* void ISD_setplay(uint address) { SS=0; SPI_send(address&0xff); Delay_us(2); SPI_send((address&0xff00)>>8); Delay_us(2); SPI_send(PLAY_SET); 36 青岛农业大学海都学院工程系电气本科毕业设计 } //////////////////////////////////////////////////////////// void CallTheNum(uchar *Num,uchar Bite) //呼叫相应的号码 SS=1; { uchar a,b,c,d,e,f; a = (Num[0]&0XF0)>>4; b = Num[0]&0X0F; c = (Num[1]&0XF0)>>4; d = Num[1]&0X0F; e = (Bite&0XF0)>>4; f = Bite&0X0F; ISD_up(); //上电 Delay_ms(50); ISD_setplay(0x0043); //请 ISD_play(); Delay_ms(1100); ISD_setplay(CallNum[a]); ISD_play(); Delay_ms(1100); ISD_setplay(CallNum[b]); ISD_play(); Delay_ms(1100); ISD_setplay(CallNum[c]); ISD_play(); Delay_ms(1100); 37 青岛农业大学海都学院工程系电气本科毕业设计 } 3.3.3 主控系统软件设计 本文设计中主控电路部分采用的是STC12C5A60S2单片机,具体的程序代码如下: #include <60S2.h> 38 ISD_setplay(CallNum[d]); ISD_play(); Delay_ms(1100); ISD_setplay(0x006A); //号 ISD_play(); Delay_ms(1100); ISD_setplay(0x0063); //到 ISD_play(); Delay_ms(1200); ISD_setplay(CallNum[e]); //窗口号码 ISD_play(); Delay_ms(1100); ISD_setplay(CallNum[f]); ISD_play(); Delay_ms(1100); ISD_setplay(0x0071); //窗口 ISD_play(); Delay_ms(2000); ISD_stop(); //停止 ISD_down(); //下电 青岛农业大学海都学院工程系电气本科毕业设计 uint Print_num; uchar xdata Print_Data[1000]; void main() { uchar i; LCD12864_init(); //12864初始化 if(NRF_RX_flag0==1) { } if(NRF_RX_flag1==1) { NRF_RX_flag1=0; if(RX_Date1[0]==0X3D&&RX_Date1[1]==0X02) //窗口01呼叫下一位数据 { RX_Date1[0]=0; RX_Date1[1]=0; TX_Date1[0]=0xa1; TX_Date1[1]=0x11; NRF_RX_flag0 = 0; Print_Data[Print_num] = RX_Date0[0]; Print_Data[Print_num+1]= RX_Date0[1]; TX_Date0[0]=0X3D; TX_Date0[0]=(Print_num/2); //计算排队人数 NRFSetTxMode(0,TX_Date0); Print_num += 2; //向打印机发送排队人数 //总数组赋值位置后移2位 Delay_ms(1000); NRFSetTxMode(1,TX_Date1); while(CheckACK()); //向窗口 01 发送打印机数据 //检测应答信号,用于发射 39 青岛农业大学海都学院工程系电气本科毕业设计 } } NRFSetRXMode(); //设置为接收模式 LCD12864_Writenum(0,TX_Date1); //液晶显示窗口 01 呼叫的号码 CallTheNum(TX_Date1,0X01); //将TX_Date1数据语音播放 if(Print_num>0) { } for(i=0;i Print_Data[i]=Print_Data[i+2]; i++; else if(RX_Date1[0]==0X3D&&RX_Date1[1]==0X01) { } RX_Date1[0]=0; RX_Date1[1]=0; CallTheNum(TX_Date1,0X01); //将TX_Date1数据语音播放 if(NRF_RX_flag2==1) { NRF_RX_flag2=0; if(RX_Date2[0]==0X3D&&RX_Date2[1]==0X02) { RX_Date2[0]=0; RX_Date2[1]=0; TX_Date2[0]=0xa1; TX_Date2[1]=0x11; Delay_ms(1000); 40 青岛农业大学海都学院工程系电气本科毕业设计 } } { } NRFRevDate(); } else if(RX_Date2[0]==0X3D&&RX_Date2[1]==0X01) { } while(1) RX_Date2[0]=0; RX_Date2[1]=0; NRFSetTxMode(2,TX_Date1); while(CheckACK()); //向窗口 01 发送打印机数据 NRFSetRXMode(); LCD12864_Writenum(3,TX_Date2); CallTheNum(TX_Date2,0X02); //将TX_Date1数据语音播放 if(Print_num>0) { } for(i=0;i Print_Data[i]=Print_Data[i+2]; i++; CallTheNum(TX_Date2,0X02); //将TX_Date2数据语音播放 NRF_Data_Count(); 41 青岛农业大学海都学院工程系电气本科毕业设计 第四章 系统设计总结分析 4.1 设计的实用性 本文再设计排队机叫号系统之前对现有的营业厅做了调查,不同的企业的营业厅,采取了不同的排队系统来完成自己的正常营业,在亲身尝试之后,从中我感受到了系统的实用性,不仅仅可以为用户提供人性化的服务,而且避免了因拥挤带来的不必要麻烦。分析了其中的利弊之后,我认真总结了其中的优缺点之后,我深入其中,将本设计认真的完成。 在实物完成之后,通过测试我发现效果很好,能够真实地实现营业厅的真实效果,而且将很多不必要的功能给取消了,使功能更加人性化,简单化,更加的能够符合客户的心理需求。 取号过程中只需要按一个按键,就可以立刻获得自己需要的业务排队号码,之后客户只需要在等候厅等候自己被叫到即可,在此期间客户还可以浏览杂志、报纸等资料,使客户不用再为焦急的排队而烦恼。 经过多次试验,我感觉本文设计的系统具有非常好的实用性,能够更好地利用知识和技术实现更高层次的人性化。 4.2 排队机叫号系统的应用前景 近几年,伴随着科学技术的飞速发展和人们消费水平的提高,各行各业尤其是以企业的营业厅的服务质量竞争越来越大。越来越多的企业将营业厅的服务态度和服务质量当作一个企业的整体的形象,并且这一做法也深受消费者的喜爱和认可,而营业厅的服务窗口正是作为企业形象的主要表现形式之一。 经济增长无疑会增加企业的服务增加,营业厅的排队问题也更加的突出。长时间以来,人们在医院、银行、移动、国企、个企等服务窗口拥挤、混乱地排队等待,有时需要等候好几个小时,这似乎已经成为很常见的事情,极大地影响了消费者的心情。对于营业厅的服务质量差,越来越多的人感觉到不满意,因此提高营业厅的服务质量、解决因排队带来的疲劳、烦感、创造更加高效、人性化服务环境已成为当前急需解决的现实问题。设计智能轻松的排队服务系统,解决因排队引起的种种问题,显得尤为重要,因此本文针对以上问题设计了一套基于51单片机的排队机叫号系统。 本文设计的排队系统完全模拟人群排队过程,通过叫号的顺序给出相应的业务号码,通过叫号的形式来一次接受服务,而在这期间人们可以在等候室等候,等候室提供 42 青岛农业大学海都学院工程系电气本科毕业设计 座椅和报纸期刊,舒缓顾客等待的急噪情绪,使人们在等候服务的过程中拥有一个相对自由的空间,是科技以人为本的真正体现。 因此我认为在这个科技决定脚步的年代,本文设计的排队机叫号系统拥有很大的市场前景,和广阔的发展空间。 43 青岛农业大学海都学院工程系电气本科毕业设计 参考文献 [1] 张忠安 齐俊传. 门诊排队叫号系统设计. 医疗卫生装备·2006年第27卷第10 [2] 马骏.车站售票大厅智能排队叫号系统的设计和开发. 科技情报开发与经济. 2010 年第20卷第19期 [3] 欧志旋. 一种基于单片机开发的排队叫号系统设计. 计算机光盘软件与应用2010 年第6 期 [4] 杨彦、王霖、张凤荔、刘丽萍. 基于RS485 和单片机的排队机控制系统设计. 中 文核心期刊《微计算机信息》(测控自动化)2008 年第24 卷第1-1 期 [5] 唐海波 于宏图 李继平. 单片机在服务叫号管理系统中的应用. 《微型机与应用》 2002年第5期 [6] 杨连国 史小军 堵国梁 朱为.LED显示屏在医院排队叫号系统中的应用。现代显示 2006.6 [7] 黄璟. 基于89C51单片机的排队系统主显示屏的设计.科技风2009.19期 [8] 张毅刚。MCS-51单片机应用设计。哈尔滨:哈尔滨工业大学出版社 [9] 闫玉德 俞虹。MCS-51单片机原理与应用(C语言版)。机械工业出版社。2003 [10] 谭浩强.C程序设计[M]. 北京:清华大学出版社,1999,102-118 44 青岛农业大学海都学院工程系电气本科毕业设计 致谢 四年的大学生活伴随着论文的完成,也要结束了。时间在此刻显得是那么的短暂,但是这四年大学生活却让我经历了人生重要一个历程。虽然有时候想想学习会有些枯燥,但工作中真正用了之后才发现它的意义所在。激烈的社会竞争中,我想我终于走上了一个自己喜欢的发展方向,使我更加坚信了自己的未来。 首先,感谢我的指导老师白浩然老师对我的鼓励和帮助,使我能能够顺利地完成论文。其次我还要感谢我的代课老师蒋秋鹏、张清鹏老师,使他们将我慢慢引入到技术这条路上来,让我最终找到了自己真正喜欢的,从他们的身上我不仅仅学到了知识,而且学到了宝贵的经验,还带领我们参加过《山东省大学生机电创新大赛》,让我在人生的道路上更加自信,这些将使我受益终生。感谢学院的其他老师,造就了现在的我。电气专业的同学,谢谢你们的帮助。谢谢有你们在的每一天的大学生活。感谢学院给我们专业提供的实验室,在这里我利用实验室的资源对本专业学习有了一定的提高。最后,感谢我的家人,谢谢您们给我拥有的一切 祝愿所有帮助过我的人幸福快乐! 45 青岛农业大学海都学院工程系电气本科毕业设计 附录1 NRF24L01无线通信部分程序如下: #include \"60S2.h\" sbit NRF_CSN = P1^4; sbit NRF_CE = P1^5; sbit NRF_MOSI= P1^6; sbit NRF_SCLK= P1^7; sbit NRF_MISO= P2^6; sbit NRF_IRQ = P2^7; uchar RX_Date0[2]; uchar RX_Date1[2]; uchar RX_Date2[2]; uchar code Address0[] = {0x34,0x43,0x10,0x10,0x00}; //通道0接收、发送地址 uchar code Address1[] = {0x34,0x43,0x11,0x11,0x01}; //通道1接收、发送地址 uchar code Address2[] = {0x34,0x43,0x12,0x12,0x02}; //通道2接收、发送地址 /*****************状态标志*****************************************/ uchar bdata sta; //状态标志 sbit RX_DR = sta^6; sbit TX_DS = sta^5; sbit MAX_RT= sta^4; uchar NRF_RX_flag0; //通道0接受标志位 uchar NRF_RX_flag1; //通道1接受标志位 uchar NRF_RX_flag2; //通道2接受标志位 /***********************SPI时序函数*****************************/ uchar NRFSPI(uchar date) { uchar i; for(i=0;i<8;i++) // 循环8次 { if(date&0x80) NRF_MOSI=1; else NRF_MOSI=0; // byte最高位输出到MOSI date<<=1; // 低一位移位到最高位 NRF_SCLK=1; if(NRF_MISO) date|=0x01; // 读MISO到byte最低位 NRF_SCLK=0; // SCK置低 } return(date); } 46 青岛农业大学海都学院工程系电气本科毕业设计 /**********************NRF24L01初始化函数***********************/ void NRF24L01Int() { Delay_ms(2); NRF_CE=0; NRF_CSN=1; NRF_SCLK=0; NRF_IRQ=1; NRFSetRXMode(); } /*****************SPI读寄存器一字节函数**************************/ uchar NRFReadReg(uchar RegAddr) { uchar BackDate; NRF_CSN=0; NRFSPI(RegAddr); BackDate=NRFSPI(0x00); NRF_CSN=1; return(BackDate); } /*****************SPI写寄存器一字节函数***************************/ uchar NRFWriteReg(uchar RegAddr,uchar date) { uchar BackDate; NRF_CSN=0; BackDate=NRFSPI(RegAddr); NRFSPI(date); NRF_CSN=1; return(BackDate); } /*****************SPI读取RXFIFO寄存器的值**************************/ uchar NRFReadRxDate(uchar RegAddr,uchar *RxDate,uchar DateLen) { uchar BackDate,i; NRF_CSN=0; BackDate=NRFSPI(RegAddr); for(i=0;i /*****************SPI写入TXFIFO寄存器的值************************/ uchar NRFWriteTxDate(uchar RegAddr,uchar *TxDate,uchar DateLen) 47 青岛农业大学海都学院工程系电气本科毕业设计 { uchar BackDate,i; NRF_CSN=0; BackDate=NRFSPI(RegAddr); for(i=0;i /*****************NRF设置为发送模式并发送数据*********************/ void NRFSetTxMode(uchar TD,uchar *TxDate) //TD:通道,发送数据 { NRF_CE=0; switch(TD) { case0:NRFWriteTxDate(W_REGISTER+TX_ADDR,Address0,TX_ADDR_WITDH); NRFWriteTxDate(W_REGISTER+RX_ADDR_P0,Address0,TX_ADDR_WITDH); break; case1:NRFWriteTxDate(W_REGISTER+TX_ADDR,Address1,TX_ADDR_WITDH); NRFWriteTxDate(W_REGISTER+RX_ADDR_P1,Address1,TX_ADDR_WITDH); break; case2:NRFWriteTxDate(W_REGISTER+TX_ADDR,Address2,TX_ADDR_WITDH); NRFWriteTxDate(W_REGISTER+RX_ADDR_P2,Address2,TX_ADDR_WITDH); break; default: break; } NRFWriteTxDate(W_TX_PAYLOAD,TxDate,TX_DATA_WITDH); /******************下面有关寄存器配置***********************/ NRFWriteReg(W_REGISTER+EN_AA,0x07); NRFWriteReg(W_REGISTER+EN_RXADDR,0x07); NRFWriteReg(W_REGISTER+SETUP_RETR,0x0a); NRFWriteReg(W_REGISTER+RF_CH,0x40); NRFWriteReg(W_REGISTER+RF_SETUP,0x07); NRFWriteReg(W_REGISTER+CONFIG,0x0e); NRF_CE=1; Delay_ms(1); //保持10us秒以上 } /*************************检测应答信号***************************/ uchar CheckACK() { sta=NRFReadReg(R_REGISTER+STATUS); if(TX_DS||MAX_RT) { 48 青岛农业大学海都学院工程系电气本科毕业设计 NRFWriteReg(W_REGISTER+STATUS,0xff); NRF_CSN=0; NRFSPI(FLUSH_TX);//用于清空FIFO !!关键!! NRF_CSN=1; return(0); } else return(1); } /*****************NRF设置为接收模式***************************/ void NRFSetRXMode() { NRF_CE=0; NRFWriteTxDate(W_REGISTER+RX_ADDR_P0,Address0,TX_ADDR_WITDH); NRFWriteTxDate(W_REGISTER+RX_ADDR_P1,Address1,TX_ADDR_WITDH); NRFWriteTxDate(W_REGISTER+RX_ADDR_P2,Address2,TX_ADDR_WITDH); NRFWriteReg(W_REGISTER+EN_AA,0x07); NRFWriteReg(W_REGISTER+EN_RXADDR,0x07); NRFWriteReg(W_REGISTER+RX_PW_P0,TX_DATA_WITDH); NRFWriteReg(W_REGISTER+RX_PW_P1,TX_DATA_WITDH); NRFWriteReg(W_REGISTER+RX_PW_P2,TX_DATA_WITDH); NRFWriteReg(W_REGISTER+RF_CH,0x40); NRFWriteReg(W_REGISTER+RF_SETUP,0x07); NRFWriteReg(W_REGISTER+CONFIG,0x0f); NRF_CE = 1; Delay_ms(1); } /*************************接收数据********************************/ void NRFRevDate() { uchar RX_P_NO; sta=NRFReadReg(R_REGISTER+STATUS); if(RX_DR) { RX_P_NO=sta&0x0e; //获取通道号 NRF_CE=0; //待机 switch(RX_P_NO) { case 0x01: NRFReadRxDate(R_RX_PAYLOAD,RX_Date0,RX_DATA_WITDH); NRF_RX_flag0=1; break; case 0x02:NRFReadRxDate(R_RX_PAYLOAD,RX_Date1,RX_DATA_WITDH); NRF_RX_flag1=1; break; case 0x04:NRFReadRxDate(R_RX_PAYLOAD,RX_Date2,RX_DATA_WITDH); NRF_RX_flag2=1; 49 青岛农业大学海都学院工程系电气本科毕业设计 } } break; default: break; } NRFWriteReg(W_REGISTER+STATUS,0xff); NRF_CSN=0; NRFSPI(FLUSH_RX); //用于清空FIFO !!关键!! NRF_CSN=1; 50 青岛农业大学海都学院工程系电气本科毕业设计 附录2 主控系统电路电路图如下: 51 因篇幅问题不能全部显示,请点此查看更多更全内容