1、目 录1 硬件部分设计11.1 硬件结构设计11.2 硬件电路设计21.2.1 硬件模块选择21.2.2 硬件模块设计32 软件部分设计62.1 开发环境62.2 主体程序设计62.2.1 主程序设计62.2.2 nRF24L01发送模块程序设计72.2.3 nRF24L01接收模块程序设计83 系统测试103.1 软件测试103.2 硬件测试10结 论12参考文献13附录 A14附录 B24附录 C26摘 要本课题通过对单片机STC89C52和无线通信模块nRF24L01分析与研究,设计了一个基于单片机铁道口报警系统的模拟过程。此系统主要研究如何通过无线通信模块与单片机来实现铁道口的报警过程
2、;详细的阐述了无线通信收发模块nRF24L01的通信特性,单片机通过接受到nRF24L01的信号来控制蜂鸣器和发光二极管的工作状态,从而达到铁道口报警目的。通过使用2.4G 无线射频收发芯片nRF24L01通信的信号,单片机将无线接收模块的信号进行处理,再进行报警。nRF24L01的整体性能很好而且使用较方便;其中跳频功能的应用很好的解决了无线传输存在的干扰问题,适合工业控制场合;无线射频模块可软件设地址,只有收到本机地址是才会输出数据提供中断提示,可直接连接各种系列的单片机使用,软件编程方便。由于采用无线传输手段,系统隐蔽性好,生存能力强,避免了有线报警系统安装时需要穿墙架线,因而造成破坏已
3、有合理结构的弊端,故具有极好的应用前景。关键词:单片机;nRF42L01;报警;无线通信AbstractThrough analysis and research of SCM(Single Chip Micyoco)and wireless communication module railway mouth alarm system is designed, which is based on single chip microcomputer. The system mainly studies alarm process, how to use railway wireless com
4、municati0n module and SCM. Detailed elaborated the wireless transceiver module nRF24L01 communication features.By using the 2.4 G wireless transceiver chip nRF24L01 transmission data, SCM receive signal and processing, by accepting to nRF24L01 received signal, SCM to control the working state of the
5、 buzzer and LED, so as to achieve the railway port alarm purposes. NRF24L01 is very good and its convenient to use at the overall performance. In the actual application testing effect is also very good. The wireless module transmission distance can reach 10 meters. Its suitable for industrial contro
6、l occasions, nRF24L01 can be connected to a variety of series of SCM and is used directly, software programming is convenient. Because of use wireless transmission mode, so concealment of the system is good and the survival ability is also well. The system of alarm have very good application prospec
7、t.Keywords: STC89C52; nRF24L01; alarm; wireless communicationIV 沈阳工学院学士报告1 硬件部分设计本铁道口报警系统的硬件部分主要分为以下几个模块:供电模块,单片机最小系统STC89C52,nRF24L01无线发送模块和nRF24L01无线接受模块,报警模块,开关和指示灯等模块组成。系统主机硬件结构框图和从机结构框图,如图1.1所示。图1.1系统硬件结构框图1.1 硬件结构设计硬件系统工作过程为,闭合开关使供电模块对整个系统电路供电,无线射频发送模块nRF24L01和无线射频接收模块nRF24L01进行数据的接收;将接收到的信号传送
8、给单片机,单片机对接收到的数据进行处理,检测是否为主机发射的信号;确认完毕单片机对从机接收报警模块做出回应是否进行报警,若接收的确是主机的数据则蜂鸣器和红色二极管都进行报警,否则单片机继续检测是否有报警信号的到来;报警30S结束后蜂鸣器和红色二极管停止报警,绿色二极管亮。1.2 硬件电路设计当主从无线射频模块nRF24L01供电后,这两个模块会时时进行数据的传送,主机会一直向从机进行发送信号,直到从机接收到信号为止,然后在进行下次通信。用nRF24L01芯片的原因是此nRF24L01能够接受到信号距离小于10m,所以当两个模块距离在10m内时从机nRF24L01就会接收到主机传送信号;单片机对
9、接收到的信号进行检测,满足主从接收机的配对时就会进行报警响应。本课题使用STC89C52单片机的最小系统电路图,主要控制电路如图1.2所示。图1.2 STC89C52单片机最小系统1.2.1 硬件模块选择电源模块:的作用就是将输入的5V电压转换为可供STC89C52单片机和nRF24L01模块使用的3.3V电压,此模块使用了一个ASM1117 3.3V芯片,此芯片既是将输出的电压稳定在3.3V。为STC89C52和nRF24L01提供稳定的工作电压,是系统能稳定的工作,而不会烧坏单片机和无线收发模块电路。nRF24L01无线射频收发模块:(1)发射数据时,首先将nRF24L01配置为发射模式:
10、接着把接收节点地址TX_ADDR和有效数据TX_PLD按照时序由SPI口写入nRF24L01缓存区,TX_PLD必须在CSN为低时连续写入,而TX_ADDR在发射时写入一次即可,然后CE置为高电平并保持至少10s,延迟130s后发射数据;若自动应答开启,那么nRF24L01在发射数据后立即进入接收模式,接收应答信号(自动应答接收地址应该与接收节点地址TX_ADDR一致)。如果收到应答,则认为此次通信成功,TX_DS置高,同时TX_PLD从TX FIFO中清除;若未收到应答,则自动重新发射该数据(自动重发已开启),若重发次数(ARC)达到上限,MAX_RT置高,TX_ FIFO中数据保留以便再次
11、重发;MAX_RT或TX_DS置高时,使IRQ变低,产生中断,通知MCU。最后发射成功时,若CE为低则nRF24L01进入空闲模式1;若发送堆栈中有数据且CE为高,则进入下一次发射;若发送堆栈中无数据且CE为高,则进入空闲模式2由文献2可知。(2)接收数据时,首先将nRF24L01配置为接收模式,接着延迟130s进入接收状态等待数据的到来。当接收方检测到有效的地址和CRC时,就将数据包存储在RX FIFO中,同时中断标志位RX_DR置高,IRQ变低,产生中断,通知MCU去取数据。若此时自动应答开启,接收方则同时进入发射状态回传应答信号。最后接收成功时,若CE变低,则nRF24L01进入空闲模式
12、1由文献2可知。nRF24L01主要特性如下:GFSK调制;硬件集成OSI链路层,具有自动应答和自动再发射功能;片内自动生成报头和CRC校验码;数据传输率为l Mb/s或2Mb/s;SPI速率为0 Mb/s10 Mb/s;125个频道;与其他nRF24系列射频器件相兼容;QFN20引脚4 mm4 mm封装;供电电压为1.9 V3.6 V。声光报警模块:通过单片机接收到nRF24L01信号对声光报警做出响应,使蜂鸣器和发光二极管工作进行报警,达到提醒道口通行路人正确行走的目的。信号指示灯模块:通过电路板上绿色发光二极管的亮灭,来说明是发送接收模块,系统是否处于工作状态,便于提示工作人员检查收发模
13、块电路是否处于工作状态,能直观的检查发送模块。1.2.2 硬件模块设计电源模块设计:所使用的AMS1117是一个低漏失电压调整器,它的稳压调整管是由一个PNP驱动的NPN管组成的,AMS1117有固定和可调两个版本可用,输出电压有多种可以是:1.2V,1.5V,1.8V,2.5V,2.85V,3.0V,3.3V和5.0V。本课题硬件电源模块输出的电压固定为3.3V;为了确保AMS1117的稳定性,对可调电压版本,输出需要连接一个至少22F的钽电容。对于固定电压版本,可采用更小的电容,具体可以根据实际应用确定。所以本课题电路是使用2个10F的电容来达到3.3V的输出电压,给单片机和无线模块供电,
14、电路图如图1.2所示。图1.2 电源模块电路组成nRF24L01 是一款新型单片射频收发器件,工作于2.4 GHz2.5 GHz ISM频段。 内置频率合成器、功率放大器、晶体振荡器、调制器等功能模块,并融合了增强型 ShockBurst 技术,其中输出功率和通信频道可通过程序进行配置。nRF24L01功耗低,在以-6dBm的功率发射时,工作电流也只有9mA;接收时,工作电流只有12.3mA,多种低功率工作模式(掉电模式和空闲模式)使节能设计更方便 4 。nRF24L01模块接入电路的引脚图如图1.3所示;nRF24L01内部电路组成图如图1.4所示。图1.3 nRF24L01模块引脚图图1.
15、4 nRF24L01 内部电路组成图声光报警模块设计:通过从机单片机对主机发送模块送来的信号进行判定是否为报警信号,来控制P2.6输出的高低电平决定是否进行报警。当单片机判定为报警信号P2.6输出低电平,声光电路均导通工作,不是报警信号P2.6口输出高电平,声光电路均截止。报警电路如图1.5所示。图1.5 报警模块电路图信号指示灯模块设计:有信号时P2.6口会输出低电平,此时二极管发光,说明此时有信号的发射说明无线射频发送是正常工作,图1.6为信号指示灯模块电路。图1.6 信号指示灯模块电路图2 软件部分设计本系统使用STC89C52作为控制的单片机芯片,软件设计主要分为系统初始化、设置nRF
16、24L01的主从模式、检测信号、报警等几个部分,每个功能模块功能的设计对于整体都是不可或缺的,单片机STC89C52通过软件程序才能很好的对外部的信息进行采集、分析和决策。整个系统电路的程序流程图在第一章节内已经画出。STC89C52是STC公司生产的一种低功耗、高性能CMOS8位微控制器具有 8K 在系统可编程Flash存储器。STC89C52使用经典的MCS-51内核,具有传统51单片机不具备的功能。在单芯片上,拥有灵巧的8 位CPU 和在系统可编程Flash,使得STC89C52为众多嵌入式控制应用系统提供高灵活、有效的解决方案。工作电压:5.5V3.3V(5V单片机)和3.8V2.0V
17、(3V 单片机)。本设计使用的是后者3.8V2.0V(3V 单片机)。2.1 开发环境本设计采用开发环境为Keil Vision4版本,Keil是集成开发环境进行编程的软件。Keil 公司是一家业界领先的微控制器(MCU)软件开发工具的独立供应商。Keil 公司由两家私人公司联合运营,分别是德国慕尼黑的Keil Elektronik GmbH 和美国德克萨斯的Keil Software Inc5,2324,具有可视化操作窗口和灵活的Windows管理窗口。Keil软件不但给使用者提供了大量的库函数,还提供强大功能的开发及测试工具;支持多种语言的编程,像C语言、汇编语言等;而且能完成从编辑、编译
18、、连接、测试、仿真等整个程序开发到仿真调试的过程,给使用者提供非常便捷的工作流程;除此之外,程序进行编译之后,即可生成相应的汇编语言文件被保存起来;因此使得编程工作更为高效。本文采用Keil Vision4进行软件部分的程序设计,采用C语言编程。重点编写通过无线芯片发送和接收无线信号的接口程序,编译并通过,验证了程序的正确性,由文献5可知。2.2 主体程序设计2.2.1 主程序设计系统要完成nRF24L01接收模块从nRF24L01发射模块端接收过来的数据,在经过单片机的处理之后判断是否进行报警;如果单片机接收是主机的信号,从机电路部分的声光报警就会工作,蜂鸣器开始响起,红色二极管也将亮起,直
19、至设定的报警30S后才会结束;随即绿色二极管亮起报警结束。单片机的主程序流程为:完整各部分模块的初始化之后,接着进行数据的发送接收和告警的判断以及数据显示;按照主程序进行逐步的调试,主程序流程图如图2.1所示。图2.1 主程序流程图2.2.2 nRF24L01发送模块程序设计通过对nRF24L01的认识和学习,对各个管脚进行研究后,结合课题要实现的功能进行程序的编写。收发模块都要进行检测是否配,每隔1s就会发送一次信号,单片机进行检测,若是传送数据,否则继续跳到下个频率进行信号的发送,直至频点配对成功,图2.2为nRF24L01发送模块程序流程图。图2.2 nRF24L01发送模块工作流程图2
20、.2.3 nRF24L01接收模块程序设计nRF24L01接收模块程序是发送的相对过程,在现实生活中由于有许多信号的干扰,在信号识别时要尤其注意,因此对收发模块都要进行检测是否配对成功;否则道口会出现较混乱的情况。程序中若ucStatus的返回的值不为0 则为已接收到数据,Rx_Buf1=14的话,说明接收到的是主机发来的数据防止与其它无线模块造成数据混乱,图2.3为nRF24L01接收模块程序流程图。图2.3 nRF24L01接收模块工作流程图3 系统测试将硬件部分组装好,在单片机中烧入程序,进行调试检测电路实现的功能,经过检测。经过检测实物实现的功能已经可以达到预期设计的效果。3.1 软件
21、测试设计的主要两个模块的编程都已经形成C语言文件如附录C。在软件测试时将编好的程序在Keil软件内进行编译,检查是否有错误,对错误部分进行修改再次编译,直到无错误为止。3.2 硬件测试检查电路的连接是否正确,无误后将6块1.5V的干电池分别装到两个模块的电池盒内;先将设定为主机部分的模块电路上电,再给接收报警模块的电路上电。当两个模块的距离小于10m时,从机的报警部分将进行报警这是蜂鸣器就会响起同事红色的二极管也将点亮,此状态会呈现30S,之后蜂鸣器和红色二极管停止工作截至此时报警结束,说明此时会有火车通过,提醒路人现在是红灯请等一等。接下来绿色的二极管就会点亮,说明报警结束。以后会循环以上的
22、工作。若将主机关闭再打开关,若从机接收到信号就会报警否则将不会报警。发送模块在闭合开关上电后电源指示灯就会亮起说明可以正常供电,信号指示等也会亮起但是此发光二极管会间断的亮灭,发送模块在间歇的进行数据的发送,时间间隔1S,如图3.1所示。图3.1 发送模块图 接收模块在供电后电源指示灯也会点亮,此时绿色二极管是发光的说明此时道口的接收模块还没有接收到信号,还没有车子过来如图3.2的左边部分所示;当单片机接收到主机发来的数据时,进行数据的处理,确定判断时,蜂鸣器就会响起同时二极管也会亮起,报警30S后绿色二极管再次亮起报警结束,如图3.3右边部分。图3.2 接收模块图结 论通过软件和硬件的调试结
23、果可以看出本课题通过单片机控制的无线收发系统基本实现自动报警功能,当载有发送模块的车子在距离道口十米左右是就会进行报警,达到提醒路人的作用。 硬件部分主要使用的芯片有AMS1117、nRF24L01、STC89C52单片机等芯片,电路包括电源供电电路、单片机电路、开关电路、报警电路、信号指示电路等,这些都是比较简单的电路容易设计易于控制而且器件的性价比比较高。系统软件汇编语言使用的是C语言编程,程序包括程序初始化、延时、中断、信号发送接收及检测、报警部分,容易读,也便于对实现功能的修改。 但是还是存在不足之处,由于nRF24L01无线收发模块只能粗略的知道车子的距离的范围不能判定扯车子的方向,
24、在道口的左右各加一个按键,当车子驶过是按键被按下这时无线射频收发模块开始工作,通过单片机设定的道口距离这样就可以知道车子现在距道口的确切距离;而通过左右按键按下的顺序也可以知道车子的方向。参考文献1 周航慈单片机应用程序设计技术M北京航空航天大学出版社,1991:9-142 nRF24L01无线模块 EB/OL3 李文忠,段朝玉短距离无线数据通信M北京航空航天大学出版社,20064 时志云,盖建平,王代华等新型高速无线射频器件nRF24L01 及其应用J国外电子元器件,2007:85-975 Keil Software. Gettint Started With Vision2 and the
25、 C51 Microcontroller Development tools,2009 (1) 2324.附录 AA.1 主机发射main函数程序代码#include /调用单片机头文件#define uchar unsigned char /无符号字符型 宏定义变量范围0255#define uint unsigned int /无符号整型 宏定义变量范围065535#include nrf24l01.Hsbit led = P26;/*1ms延时函数*/void delay_1ms(uint q)uint i,j;for(i=0;iq;i+)for(j=0;j120;j+);/*主程序*/
26、 void main()CE=0; /2.4G无线模块IO口初始化SCK=0;CSN=1;TX_Mode();delay_1ms(650);while(1)led = 0;Tx_Buf0 = 13; Tx_Buf1 = 14; Transmit(Tx_Buf);delay_1ms(100);sta=SPI_Read(READ_REG + STATUS);if(TX_DS) /当前STATUS状态 发送中断应使bit5 = 1 SPI_RW_Reg(WRITE_REG + STATUS,sta); if(MAX_RT) /如果是发送超时 SPI_RW_Reg(WRITE_REG + STATUS
27、,sta);led = 1;delay_1ms(1000); /1秒钟发送一次信号出去A.2 从机接收main函数程序代码#include #define uchar unsigned char#define uint unsigned int #include nrf24l01.H#define DELAY_S 30 /报警时间,这里定义了30Ssbit beep = P37; /蜂鸣器IO口定义sbit led = P26;bit flag_300ms ;static uchar value = 0;/*1ms延时函数*/void delay_1ms(uint q)uint i,j;for
28、(i=0;iq;i+)for(j=0;j120;j+);/*定时器0初始化程序*/void time_init() EA = 1; /开总中断TMOD = 0X01; /定时器0、定时器1工作方式1ET0 = 1; /开定时器0中断 TR0 = 1; /允许定时器0定时void Check(void) /检查有无收到数据函数,有收到则报警提示bit bPlatformFlag = 0; /公交站台标志位char i;static unsigned char ucStatus = 0;static unsigned char Num = 0;static unsigned char BeepNu
29、m = 0;if(flag_300ms = 1) / if(+Num = 7)Num = 0;ucStatus = nRF24L01_RxPacket(Rx_Buf); /返回的值不为0 则为已接收到数据else ucStatus = 0;if( ucStatus & (Rx_Buf1=14) ) /Rx_Buf1=14的话,说明接收到的是主机发来的数据,防止与其它无线模块造成数据混乱 ucStatus = 0;if(+BeepNum%2 = 0)BeepNum = 0;led = 1;beep = 0;for(i=0;iDELAY_S;i+)delay_1ms(1000); /要报警30sN
30、um = 0; else beep = 1;flag_300ms = 0;void main()time_init(); /初始化定时器 delay_1ms(650);CE=0;SCK=0;CSN=1;RX_Mode(); /从机设置为接收模式led = 0;while(1)led = 0;Check();/*定时器0中断服务程序*/void time0_int() interrupt 1TH0 = 0x3c;TL0 = 0xb0; / 50msif(+value = 6)flag_300ms = 1; /300msvalue = 0;A.3 nRF24L01#ifndef _NRF24L01
31、_H_#define _NRF24L01_H_/*IO端口定义*sbit MISO = P20;sbit SCK = P21;sbit CE = P22;sbit CSN = P23;sbit MOSI = P24;sbit IRQ = P25;/*uchar bdata sta; /状态标志sbit RX_DR =sta6;sbit TX_DS =sta5;sbit MAX_RT =sta4;/*NRF24L01*#define TX_ADR_WIDTH 5 / 5 uints TX address width#define RX_ADR_WIDTH 5 / 5 uints RX addre
32、ss width#define TX_PLOAD_WIDTH 32 / 32 uints TX payload#define RX_PLOAD_WIDTH 32 / 32 uints TX payloaduchar code TX_ADDRESSTX_ADR_WIDTH= 0x34,0x43,0x10,0x10,0x01; /本地地址uchar code RX_ADDRESSRX_ADR_WIDTH= 0x34,0x43,0x10,0x10,0x01; /接收地址uchar Tx_BufTX_PLOAD_WIDTH=0x01,0x02,0x03,0x22,0x33,0xaa,0xbb,0x11
33、,0x22,0x33,0xaa,0xbb,0x11,0x22,0x33,0xaa,0xbb,0x11,0x22,0x33,0xaa,0xbb,0x11,0x22,0x33,0xaa,0xbb,0x11,0x22,0x33,0xee,0xff; /发送数据uchar Rx_BufRX_PLOAD_WIDTH; /接收数据/*NRF24L01寄存器指令*#define READ_REG 0x00 / 读寄存器指令#define WRITE_REG 0x20 / 写寄存器指令#define RD_RX_PLOAD 0x61 / 读取接收数据指令#define WR_TX_PLOAD 0xA0 / 写
34、待发数据指令#define FLUSH_TX 0xE1 / 冲洗发送 FIFO指令#define FLUSH_RX 0xE2 / 冲洗接收 FIFO指令#define REUSE_TX_PL 0xE3 / 定义重复装载数据指令#define NOP 0xFF / 保留/*SPI(nRF24L01)寄存器地址*#define CONFIG 0x00 / 配置收发状态,CRC校验模式以及收发状态响应方式#define EN_AA 0x01 / 自动应答功能设置#define EN_RXADDR 0x02 / 可用信道设置#define SETUP_AW 0x03 / 收发地址宽度设置#define
35、 SETUP_RETR 0x04 / 自动重发功能设置#define RF_CH 0x05 / 工作频率设置#define RF_SETUP 0x06 / 发射速率、功耗功能设置#define STATUS 0x07 / 状态寄存器#define OBSERVE_TX 0x08 / 发送监测功能#define CD 0x09 / 地址检测 #define RX_ADDR_P0 0x0A / 频道0接收数据地址#define RX_ADDR_P1 0x0B / 频道1接收数据地址#define RX_ADDR_P2 0x0C / 频道2接收数据地址#define RX_ADDR_P3 0x0D
36、/ 频道3接收数据地址#define RX_ADDR_P4 0x0E / 频道4接收数据地址#define RX_ADDR_P5 0x0F / 频道5接收数据地址#define TX_ADDR 0x10 / 发送地址寄存器#define RX_PW_P0 0x11 / 接收频道0接收数据长度#define RX_PW_P1 0x12 / 接收频道0接收数据长度#define RX_PW_P2 0x13 / 接收频道0接收数据长度#define RX_PW_P3 0x14 / 接收频道0接收数据长度#define RX_PW_P4 0x15 / 接收频道0接收数据长度#define RX_PW_
37、P5 0x16 / 接收频道0接收数据长度#define FIFO_STATUS 0x17 / FIFO栈入栈出状态寄存器设置/*延时函数*/短延时void delay_ms(unsigned int x)unsigned int i,j;for (i=0;ix;i+)j=108;while (j-);/*IO 口模拟SPI总线代码*/uchar SPI_RW(uchar byte)uchar i;for(i=0;i8;i+)MOSI=(byte&0x80);byte=(byte1);SCK=1;byte|=MISO;/led=MISO;Delay(150);SCK=0;return(byte
38、);uchar SPI_RW_Reg(uchar reg,uchar value) /向寄存器REG写一个字节,同时返回状态字节 uchar status;CSN=0;status=SPI_RW(reg);SPI_RW(value);CSN=1;return(status);uchar SPI_Read (uchar reg ) uchar reg_val;CSN=0;SPI_RW(reg);reg_val=SPI_RW(0);CSN=1;return(reg_val);uchar SPI_Write_Buf(uchar reg, uchar *pBuf, uchar bytes)uchar
39、status,byte_ctr;CSN = 0; / Set CSN low, init SPI tranactionstatus = SPI_RW(reg); / 选择寄存器写入和读取状态字节for(byte_ctr=0; byte_ctrbytes; byte_ctr+) / 然后写所有字节在缓冲区(* pBuf)SPI_RW(*pBuf+);CSN = 1; / Set CSN high againreturn(status); / nRF24L01返回状态字节/*发送模式代码*/void TX_Mode(void)CE=0;SPI_RW_Reg(FLUSH_TX,0x00);SPI_W
40、rite_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH); / tx地址来nRF24L01写道SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); / RX_Addr0 tx adr一样为自动ackSPI_RW_Reg(WRITE_REG + EN_AA, 0x01); / Enable Auto.Ack:Pipe0SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01); / Enable Pipe0SPI_RW_Reg(WRITE_REG
41、+ SETUP_RETR, 0x1a); / 500us + 86us, 10 重发1aSPI_RW_Reg(WRITE_REG + RF_CH, 40); / 选择RF信道40 SPI_RW_Reg(WRITE_REG+RF_SETUP, 0x07); / TX_PWR:0dBm, Datarate:1Mbps, LNA:HCURRSPI_RW_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH); /设置接收数据长度,本次设置为2字节SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e);CE=1;delay_ms(100);void Transmit(unsigned char * tx_buf) /传输CE=0; /StandBy I模式 SPI_Write_Buf(WRIT