基于NF2401的LED显示屏的设计(论文)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
目录
摘要
1.系统总体方案
2.硬件设计
2.1无线发送电路
2.2无线接收电路
2.3 LED显示屏电路
3.软件设计
3.1 nRF2401收发子程序设计
3.2 LED显示子程序设计
3.3单片机主程序程序设计
4.系统测试
4.1 可靠性
4.2 实用性
4.3 扩展性
4.4 结论
5.系统典型应用
5.1 小区楼院
5.2 政府部门5.3门店超市5.4交通车站5.5 广告传媒5.6农业农村
基于nRF2401的无线广告牌的设计
摘要:
由于传统的LED 显示屏的信息输入只能通过数据线与电脑直接连接来进行,并且只能固定地显示控制器内存储的信息,如需发布新的信息只能通过电脑联机来更新信息,对LED屏位置作调整时必须进行重新布线,因此传统LED显示屏不能满足远程信息实时发布的需求。
由我们设计的无线发布系统可以有效地解决这些问题。
本系统在使用时只需将LED显示屏模块接上电源,就可以接收并显示由PC机发出的信息,并且LED显示屏位置可以在nRF2401传输能力范围内作任意调整并随时接收信息中心下发的信息。
无线LED 信息发布系统能够极大的增强LED 显示屏作为信息显示载体发布信息的灵活性和实时性,为拓展LED 显示屏的应用发挥极大的功效。
1.系统总体方案
操控的便捷性和系统的稳定性是本系统设计的关键。
以此作为指导思想,设计出如图1所示的无线LED显示系统的总体方案框图。
图1 无线LED显示系统的系统总体方案框图
2.硬件设计
2.1无线发送电路
发送端模块的核心是一片AT89S52单片机,单片机接收上位机发送的数据,并通过位于上位的nRF2401送给位于下位的nRF2401。
nRF2401的数据读写使用的是标准的SPI接口,但是单片机上没有SPI接口,在这里我们使用单片机的IO口模拟SPI接口。
nRF2401是单片射频收发芯片,工作于2.4~2.5GHz ISM频段,芯片内置频率合成器、功率放大器、晶体振荡器和调制器等功能模块,输出功率和通信频道可通过程序进行配置,内置地址解码器、先入先出堆栈区、解调处理器、时钟处理器、GFSK滤波器、低噪声放大器、频率合成器,功率放大器等功能模块,需要很少的外围元件,因此使用起来非常方便。
发送控制模块原理图如图2所示。
图2 发送控制模块原理图
2.2无线接收电路
接收控制电路的核心是一片AT89S52单片机,接收端使用的是与发送端相同型号的无线射频接收芯片,单片机的所作的操作可以说是与发送端相反的一个过程。
接收控制电路原理图可参考图2。
2.3 LED显示屏电路
LED显示模块主要是由一块16列16行的LED点阵组成。
列数据使用单片机的串口发出并通过一块4-16线译码器74hc154送给各列,行扫描信号使用单片机的IO口输出,使用两片74hc595移位寄存器进行行扫描信号、然后接上16个1K大小的上拉电阻用以增大IO口的带负载能力。
LED显示屏电路如图4所
示
图4 LED显示屏电路
3.软件设计
3.1 nRF2401收发子程序设计
#include <reg52.h>
#include "intrins.h"
sbit led = P1^7;
sbit key1 = P3^4;
sbit key2 = P3^5;
sbit PWR = P2^0;
sbit CE = P2^1;
sbit CS = P2^2;
sbit DR1 = P2^3;
sbit CLK1 = P2^4;
sbit DATA = P2^5;
code unsigned int InitData[15] = // nRF2401 控制字 15 Byte
{
// 0x01,
// 0x01,
// 0x01,
0x08, // 通道二接收数据宽度(bit)
0x08, // 通道一接收数据宽度(bit)
0x00, // 通道二地址(A24)
0x00, // 通道二地址(A23)
0x00, // 通道二地址(A22)
0x00, // 通道二地址(A21)
0x02, // 通道二地址(A20)
0x00, // 通道一地址(A14)
0x00, // 通道一地址(A13)
0x00, // 通道一地址(A12)
0x00, // 通道一地址(A11)
0x02, // 通道一地址(A10)
0xA3, // b7~b2:接收地址宽度,和发送端一致,不超过40bit;
// b1~b0:CRC模式选择
(01-8bit;11-16bit;00/10-no)
0x4f, // b15:接收通道选择(0-通道1;1-通道1和2)
// b14:收发模式(0-Direct 模式,1-ShockBurst模式)
// b13:波特率选择
(0-250Kbps;1-1Mbps)
// b12~b10:晶振选择(000-4M;001-8M;010-12M;011-16M)
// b9~b8:发射功率(11-0db)
0x04 // b7~b1:发射频率配置
// b0:收发控制(0-发送;1-接收)
};
unsigned int idata AddrBuffer[5]; // 地址寄存器unsigned int idata AddrByteCnt; // 地址Byte数
void nRF2401_ON(); // nRF2401A上电
void nRF2401_OFF(); // nRF2401A掉电
void nRF2401_Initial(); // nRF2401A初始化void nRF2401_WriteCommand(); // nRF2401A写命令字void nRF2401_WriteByte(unsigned int uiData); // 向nRF2401A写入一个Byte
void nRF2401_WriteWord(unsigned int uiData); // 向nRF2401A写入一个Word
void nRF2401_Mode(unsigned int uiMode); // 切换nRF2401A 收/发模式
void nRF2401_SendByte(unsigned int TxData);
// 将字节数据写入
nRF2401A
void nRF2401_SendWord(unsigned int TxData);
// 将字数据写入nRF2401A void nRF2401_SendBuffer_Byte(unsigned int TxData[],unsigned int DataByte);
// 将数组数据写入
nRF2401A
void nRF2401_SendBuffer_Word(unsigned int TxData[],unsigned int
DataWord);
// 将数组数据写入
nRF2401A
unsigned int nRF2401_RxStatus(); // 判断nRF2401A是否有数据接收
void nRF2401_ReceiveByte(unsigned int RxData[]);// 以Byte格式从nRF2401A读数据
void nRF2401_ReceiveWord(unsigned int RxData[]);// 以Word格式从nRF2401A读数据
void nRF2401_SetAddress(unsigned int Address[],unsigned int AddrByte);
// 设置目标nRF2401A的地址
void Delay_Us(unsigned int TimeCnt); // 延时(uS)
void flash_led ( unsigned char n ); //led闪烁程序
void delayms ( unsigned int dly ); //延时1MS 的程序
void Init_Device(void);
unsigned int Address[5] = {0x00,0x00,0x00,0x00,0x01};
// 接收端地址:00 00 00 00 01
//=============================================================== =====================
//文件名: flash_led
//功能描述: led flash
//=============================================================== =====================
void flash_led ( unsigned char n )
{
for ( ; n > 0; n-- )
{
led = !led; //控制LED闪烁N次
delayms ( 1000 );
}
}
//=============================================================== =====================
//文件名: delayms();
//功能描述: 延时程序
//延时次数:
//=============================================================== =====================
void delayms ( unsigned int dly )
{
unsigned int i;
for ( ; dly > 0; dly-- )
{
for ( i=0; i<50; i++ );
}
}
//============================================================= // 语法格式: void nRF2401_Initial(void)
// 实现功能: nRF 初始化
// 参数:无
// 返回值:无
//============================================================= void nRF2401_Initial(void)
{
/* *P_SystemClock = 0x98; // 设置系统时钟为49MHz
*P_IOB_Attrib |= (CS+DATA+PWR+CLK1+CE+DR1);
*P_IOB_Dir |= (CS+DATA+PWR+CLK1+CE);
*P_IOB_Dir&=~DR1;
*P_IOB_Buffer &=~(CS+DATA+CLK1+CE+DR1); // 初始化IO端口*/
nRF2401_ON();
Delay_Us(3000);
nRF2401_WriteCommand(); // 向nRF2401A写命令
字
Delay_Us(300);
}
//============================================================= // 语法格式: void nRF2401_ON(void)
// 实现功能: nRF 上电
// 参数:无
// 返回值:无
//============================================================= void nRF2401_ON(void)
{
/**P_IOB_Buffer |= PWR;*/
PWR = 1;
}
//============================================================= // 语法格式: void nRF2401_OFF(void)
// 实现功能: nRF 掉电
// 参数:无
// 返回值:无
//============================================================= void nRF2401_OFF(void)
{
PWR = 0; //*P_IOB_Buffer &= ~PWR;
}
//============================================================= // 语法格式: void nRF2401_WriteCommand(void)
// 实现功能: nRF 写命令字
// 参数:无
// 返回值:无
//============================================================= void nRF2401_WriteCommand(void)
{
unsigned int i;
CE= 0; //*P_IOB_Buffer &= ~CE;
CS = 1; //*P_IOB_Buffer |= CS;
//Delay_Us(1);
for(i=0; i<15; i++)
{
nRF2401_WriteByte(InitData[i]);
}
CS = 0; //*P_IOB_Buffer &= ~CS;
CE = 1; //*P_IOB_Buffer |= CE;
}
//=============================================================
// 语法格式: void nRF2401_Mode(unsigned int uiMode)
// 实现功能:设置nRF2401A的工作方式
// 参数:uiMode:0--接收;1--发送
// 返回值:无
//============================================================= void nRF2401_Mode(unsigned int uiMode)
{
CE = 0; //*P_IOB_Buffer &= ~CE;
CS = 1; //*P_IOB_Buffer |= CS;
Delay_Us(1);
if(uiMode == 0)
nRF2401_WriteByte(InitData[14] | 0x01); // 接收else
nRF2401_WriteByte(InitData[14] & 0xFE); // 发送Delay_Us(1);
CS = 0; //*P_IOB_Buffer &= ~CS;
CE = 1; //*P_IOB_Buffer |= CE;
}
//=============================================================
// 语法格式: void nRF2401_SetAddress(unsigned int
*Address,unsigned int AddrByte)
// 实现功能:设置目标nRF2401A的地址
// 参数:unsigned int *Address:地址数组
// unsigned int AddrByte:数组的长度
// 返回值:无
//============================================================= void nRF2401_SetAddress(unsigned int *Address,unsigned int AddrByte) {
unsigned int i;
for(i=0; i<AddrByte; i++)
{
AddrBuffer[i] = Address[i];
}
AddrByteCnt = AddrByte;
}
//============================================================= // 语法格式: void nRF2401_WriteByte(unsigned int uiData)
// 实现功能:向nRF2401A写入一个字节数据
// 参数:unsigned int uiData: 待写入数据
// 返回值:无
//============================================================= void nRF2401_WriteByte(unsigned int uiData)
{
unsigned int i;
for(i=0; i<8; i++)
{
CLK1 = 0; //*P_IOB_Buffer &= ~CLK1;
Delay_Us(1);
if(uiData&0x80)
DATA = 1; //*P_IOB_Buffer |= DATA;
else
DATA = 0; //*P_IOB_Buffer &= ~DATA;
Delay_Us(1);
CLK1 = 1; //*P_IOB_Buffer |= CLK1;
Delay_Us(1);
CLK1 = 0; //*P_IOB_Buffer &= ~CLK1;
uiData = uiData<<1;
}
}
//============================================================= // 语法格式: void nRF2401_WriteWord(unsigned int uiData)
// 实现功能:向nRF2401A写入一个字数据
// 参数:unsigned int uiData: 待写入数据
// 返回值:无
//============================================================= void nRF2401_WriteWord(unsigned int uiData)
{
unsigned int i;
for(i=0; i<16; i++)
{
CLK1 = 0; //*P_IOB_Buffer &= ~CLK1;
if(uiData&0x8000)
DATA = 1; //*P_IOB_Buffer |= DATA;
else
DATA = 0; //*P_IOB_Buffer &= ~DATA;
Delay_Us(1);
CLK1 = 1; //*P_IOB_Buffer |= CLK1;
Delay_Us(1);
CLK1 = 0; //*P_IOB_Buffer &=~CLK1;
uiData = uiData<<1;
}
}
//============================================================= // 语法格式: void nRF2401_SendByte(unsigned int TxData)
// 实现功能:将目标地址+字节数据写入nRF2401A
// 参数:unsigned int TxData: 待发送字节数据
// 返回值:无
//============================================================= void nRF2401_SendByte(unsigned int TxData)
{
unsigned int i;
// *P_IOB_Dir |= DATA;
CE = 1; //*P_IOB_Buffer |= CE;
Delay_Us(1); //
Delay_Us(1);
for(i=0; i<AddrByteCnt; i++)
{
nRF2401_WriteByte(AddrBuffer[i]);
}
nRF2401_WriteByte(TxData);
Delay_Us(1);
CE = 0; //*P_IOB_Buffer &= ~CE;
DATA = 0; //*P_IOB_Buffer &= ~DATA;
Delay_Us(10);
}
//============================================================= // 语法格式: void nRF2401_SendWord(unsigned int TxData)
// 实现功能:将目标地址+字数据写入nRF2401A
// 参数:unsigned int TxData: 待发送字数据
// 返回值:无
//============================================================= void nRF2401_SendWord(unsigned int TxData)
{
unsigned int i;
// *P_IOB_Dir |= DATA;
CE = 1; //*P_IOB_Buffer |= CE;
Delay_Us(10); //
for(i=0; i<AddrByteCnt; i++)
{
nRF2401_WriteByte(AddrBuffer[i]);
}
nRF2401_WriteWord(TxData);
CE = 0; //*P_IOB_Buffer &= ~CE;
DATA = 0; //*P_IOB_Buffer &= ~DATA;
Delay_Us(20);
}
//============================================================= // 语法格式: void nRF2401_SendBuffer_Byte(unsigned int
*TxData,unsigned int DataByte)
// 实现功能:向nRF2401A发送一个数组的数据(字节方式)
// 参数:unsigned int *TxData: 待发送数组
// unsigned int DataByte:数组的长度
// 返回值:无
//============================================================= void nRF2401_SendBuffer_Byte(unsigned int *TxData,unsigned int DataByte)
{
unsigned int i;
// *P_IOB_Dir |= DATA;
CE = 1; //*P_IOB_Buffer |= CE;
Delay_Us(10); //
for(i=0; i<AddrByteCnt; i++)
{
nRF2401_WriteByte(AddrBuffer[i]);
}
for(i=0; i<DataByte; i++)
{
nRF2401_WriteByte(TxData[i]);
}
CE = 0; //*P_IOB_Buffer &= ~CE;
DATA = 0; //*P_IOB_Buffer &= ~DATA;
Delay_Us(20);
}
//============================================================= // 语法格式: void nRF2401_SendBuffer_Word(unsigned int
*TxData,unsigned int DataWord)
// 实现功能:向nRF2401A发送一个数组的数据(字方式)
// 参数:unsigned int *TxData: 待发送数组
// unsigned int DataWord:数组的长度
// 返回值:无
//============================================================= void nRF2401_SendBuffer_Word(unsigned int *TxData,unsigned int DataWord)
{
unsigned int i;
// *P_IOB_Dir |= DATA;
CE = 1; //*P_IOB_Buffer |= CE;
//Delay_Us(10); //
for(i=0; i<AddrByteCnt; i++)
{
nRF2401_WriteByte(AddrBuffer[i]);
}
for(i=0; i<DataWord; i++)
{
nRF2401_WriteWord(TxData[i]);
}
CE = 0; //*P_IOB_Buffer &= ~CE;
DATA = 0; //*P_IOB_Buffer &= ~DATA;
Delay_Us(20);
}
//============================================================= // 语法格式: unsigned int nRF2401_RxStatus()
// 实现功能:判断nRF2401A的接收状态
// 参数:无
// 返回值:0: 没有接收到数据
// 1: 已经接收到数据,等待读出
//============================================================= unsigned int nRF2401_RxStatus()
{
if ( DR1 == 0 ) //if((*P_IOB_Data&DR1) == 0)
return(0);
else
return(1);
}
//============================================================= // 语法格式: void nRF2401_ReceiveByte(unsigned int *RxData)
// 实现功能:从nRF2401A读出一个字节的数据
// 参数:unsigned int *RxData:读出的数据
// 返回值:无
//============================================================= void nRF2401_ReceiveByte(unsigned int *RxData)
{
unsigned int i = 0,j = 0;
unsigned int dat = 0;
//*P_IOB_Dir &= ~DATA; // 输入while(DR1==1) //while(*P_IOB_Data&DR1)
{
dat <<= 1;
CLK1 = 0; //*P_IOB_Buffer &= ~CLK1;
if(DATA==1) //if(*P_IOB_Data&DATA)
dat |= 0x01;
i++;
CLK1 = 1; //*P_IOB_Buffer |= CLK1;
Delay_Us(1);
if(i>7)
{
i = 0;
RxData[j] = dat;
dat = 0;
j++;
}
CLK1 = 0; //*P_IOB_Buffer &= ~CLK1;
}
//*P_IOB_Dir |= DATA; // 输出
}
//============================================================= // 语法格式: void nRF2401_ReceiveWord(unsigned int *RxData)
// 实现功能:从nRF2401A读出一个字的数据
// 参数:unsigned int *RxData:读出的数据
// 返回值:无
//============================================================= void nRF2401_ReceiveWord(unsigned int *RxData)
{
unsigned int i = 0,j = 0;
unsigned int dat = 0;
DATA = 0; //*P_IOB_Dir &= ~DATA; // 输入
while(DR1 == 1) //while(*P_IOB_Data&DR1) {
dat <<= 1;
CLK1 = 0; //*P_IOB_Buffer &= ~CLK1;
if(DATA==1) //if(*P_IOB_Data&DATA)
dat |= 0x01;
i++;
CLK1 = 1; //*P_IOB_Buffer |= CLK1;
Delay_Us(1);
if(i>15)
{
i = 0;
RxData[j] = dat;
dat = 0;
j++;
}
CLK1 = 0; //*P_IOB_Buffer &= ~CLK1;
}
//*P_IOB_Dir |= DATA; // 输出
}
//============================================================= // 语法格式: void Delay_Us(unsigned int TimeCnt)
// 实现功能:延时(uS)
// 参数:unsigned int TimeCnt:延时的us数
// 返回值:无
//============================================================= void Delay_Us(unsigned int TimeCnt)
{
int i;
//*P_SystemClock = 0x98;
for(i = 0; i < TimeCnt; i++);
}
4.2 LED显示子程序设计
#include <REG51.H>
#include "display.h"
#define FOSC 12 //定义晶振频率
#define INIT_TH0 0x3C //定时器T0初始值
#define INIT_TL0 0xB0
#define TMOD_T00 0x00 //定义T0为方式0,GATE=0,C/T=0,13位计数器
#define TMOD_T01 0x01 //定义T0为方式1,GATE=0,C/T=0,16位计数器
#define TMOD_T02 0x02 //定义T0为方式2,GATE=0,C/T=0,自动装入8位计数器
#define TMOD_T03 0x03 //定义T0为方式3,GATE=0,C/T=0,定时器0分成两个8位计数器,定时器1停止计数
/*缩写定义*/
#define uchar unsigned char
#define uint unsigned int
/************位定义***************/
sbit STTP = P2^7;
/************函数声明*************/
void delay(uint c); //延时函数
void out_rxd(uchar *d); //汉字输出
/************显示函数***************/
void xianshi()
{
uchar i,j,k; //i:每个字的显示循环;j每个字的显示码除以2;k每列刷新次数
uint b=0; //显示偏移控制,char类型最多只能显示14个汉字+一个空白位字符
uchar a; //控制移动间隔时间
SCON = 0;
while(1)
{
j=0;
if(a>1) //移动间隔时间;取值0--255
{
a=0;
b+=2;
if(b>=1250) //显示到最后一个字,回头显示,判断值=字数*32
{
b=0;
}
}
for(i=16;i>0;i--)
{
P1=i;
STTP = 0;
for(k=4;k>0;k--)
{
out_rxd(&hanzi[k][j+b+1]);
out_rxd(&hanzi[k][j+b]);
}
STTP = 1;
delay(15);
j=j+2;
}
a++;
}
}
/************子函数**************/
void delay(uint c)
{
int i,j;
for(i=0;i<c;i++)
for(j=0;j<10;j++);
}
void out_rxd(uchar *d)
{
SBUF = *d; //启动串行口传送
while(TI==0); //等待串口传送结束
TI = 0; //将串口中断标志位置0 }
4.3 单片机主程序设计
发射主程序:
#include <reg52.h>
#include "intrins.h"
#include<xianshi.h>
sbit led = P1^7;
sbit key1 = P3^4;
sbit key2 = P3^5;
sbit PWR = P2^0;
sbit CE = P2^1;
sbit CS = P2^2;
sbit DR1 = P2^3;
sbit CLK1 = P2^4;
sbit DATA = P2^5;
code unsigned int InitData[15] = // nRF2401 控制字 15 Byte
{
// 0x01,
// 0x01,
// 0x01,
0x08, // 通道二接收数据宽度(bit)
0x08, // 通道一接收数据宽度(bit)
0x00, // 通道二地址(A24)
0x00, // 通道二地址(A23)
0x00, // 通道二地址(A22)
0x00, // 通道二地址(A21)
0x02, // 通道二地址(A20)
0x00, // 通道一地址(A14)
0x00, // 通道一地址(A13)
0x00, // 通道一地址(A12)
0x00, // 通道一地址(A11)
0x02, // 通道一地址(A10)
0xA3, // b7~b2:接收地址宽度,和发送端一致,不超过40bit;
// b1~b0:CRC模式选择(01-8bit;11-16bit;00/10-no)
0x4f, // b15:接收通道选择(0-通道1;1-通道1和2)
// b14:收发模式(0-Direct 模式,1-ShockBurst模式)
// b13:波特率选择
(0-250Kbps;1-1Mbps)
// b12~b10:晶振选择(000-4M;001-8M;010-12M;011-16M)
// b9~b8:发射功率(11-0db)
0x04 // b7~b1:发射频率配置
// b0:收发控制(0-发送;1-
接收)
};
void flash_led ( unsigned char n ); //led闪烁程序
void Init_Device(void);
void delayms ( unsigned int dly ); //延时1MS 的程序
unsigned int idata AddrBuffer[5]; // 地址寄存器unsigned int idata AddrByteCnt; // 地址Byte数void nRF2401_ON(); // nRF2401A上电
void nRF2401_OFF(); // nRF2401A掉电
void nRF2401_Initial(); // nRF2401A初始化void nRF2401_WriteCommand(); // nRF2401A写命令字void nRF2401_WriteByte(unsigned int uiData); // 向nRF2401A写入一个Byte
void nRF2401_WriteWord(unsigned int uiData); // 向nRF2401A写入一个Word
void nRF2401_Mode(unsigned int uiMode); // 切换nRF2401A 收/发模式
void nRF2401_SendByte(unsigned int TxData);
// 将字节数据写入
nRF2401A
void nRF2401_SendWord(unsigned int TxData);
// 将字数据写入nRF2401A void nRF2401_SendBuffer_Byte(unsigned int TxData[],unsigned int DataByte);
// 将数组数据写入
nRF2401A
void nRF2401_SendBuffer_Word(unsigned int TxData[],unsigned int DataWord);
// 将数组数据写入
nRF2401A
unsigned int nRF2401_RxStatus(); // 判断nRF2401A是否有数据接收
void nRF2401_ReceiveByte(unsigned int RxData[]);// 以Byte格式从nRF2401A读数据
void nRF2401_ReceiveWord(unsigned int RxData[]);// 以Word格式从nRF2401A读数据
void nRF2401_SetAddress(unsigned int Address[],unsigned int AddrByte);
// 设置目标nRF2401A的地址
void Delay_Us(unsigned int TimeCnt); // 延时(uS)
void main()
{
// unsigned int i;
// Init_Device() ;
nRF2401_Initial(); // 初始化nRF2401A
nRF2401_Mode(1); // 设置nRF2401A工作方式:发送nRF2401_SetAddress(Address,5); // 设置接收端地址 00 00 00 00 01
while(1)
{
if(key1==0)
{
nRF2401_SendByte(0x01); // 发送键号"1"
Delay_Us(600);
}
}
}
接收主程序:
#include <reg52.h>
#include "intrins.h"
#include<xianshi.h>
sbit led = P1^7;
sbit key1 = P3^4;
sbit key2 = P3^5;
sbit PWR = P2^0;
sbit CE = P2^1;
sbit CS = P2^2;
sbit DR1 = P2^3;
sbit CLK1 = P2^4;
sbit DATA = P2^5;
code unsigned int InitData[15] = // nRF2401 控制字 15 Byte
{
// 0x01,
// 0x01,
// 0x01,
0x08, // 通道二接收数据宽度(bit)
0x08, // 通道一接收数据宽度(bit)
0x00, // 通道二地址(A24)
0x00, // 通道二地址(A23)
0x00, // 通道二地址(A22)
0x00, // 通道二地址(A21)
0x02, // 通道二地址(A20)
0x00, // 通道一地址(A14)
0x00, // 通道一地址(A13)
0x00, // 通道一地址(A12)
0x00, // 通道一地址(A11)
0x02, // 通道一地址(A10)
0xA3, // b7~b2:接收地址宽度,和发送端一致,不超过40bit;
// b1~b0:CRC模式选择(01-8bit;11-16bit;00/10-no)
0x4f, // b15:接收通道选择(0-通道1;1-通道1和2)
// b14:收发模式(0-Direct 模式,1-ShockBurst模式)
// b13:波特率选择
(0-250Kbps;1-1Mbps)
// b12~b10:晶振选择(000-4M;001-8M;010-12M;011-16M)
// b9~b8:发射功率(11-0db)
0x04 // b7~b1:发射频率配置
// b0:收发控制(0-发送;1-接收)
};
void flash_led ( unsigned char n ); //led闪烁程序
void Init_Device(void);
void delayms ( unsigned int dly ); //延时1MS 的程序
unsigned int idata AddrBuffer[5]; // 地址寄存器unsigned int idata AddrByteCnt; // 地址Byte数void nRF2401_ON(); // nRF2401A上电
void nRF2401_OFF(); // nRF2401A掉电
void nRF2401_Initial(); // nRF2401A初始化void nRF2401_WriteCommand(); // nRF2401A写命令字void nRF2401_WriteByte(unsigned int uiData); // 向nRF2401A写入一个Byte
void nRF2401_WriteWord(unsigned int uiData); // 向nRF2401A写入一个Word
void nRF2401_Mode(unsigned int uiMode); // 切换nRF2401A 收/发模式
void nRF2401_SendByte(unsigned int TxData);
// 将字节数据写入
nRF2401A
void nRF2401_SendWord(unsigned int TxData);
// 将字数据写入nRF2401A void nRF2401_SendBuffer_Byte(unsigned int TxData[],unsigned int DataByte);
// 将数组数据写入
nRF2401A
void nRF2401_SendBuffer_Word(unsigned int TxData[],unsigned int DataWord);
// 将数组数据写入
nRF2401A
unsigned int nRF2401_RxStatus(); // 判断nRF2401A是否有数据接收
void nRF2401_ReceiveByte(unsigned int RxData[]);// 以Byte格式从nRF2401A读数据
void nRF2401_ReceiveWord(unsigned int RxData[]);// 以Word格式从nRF2401A读数据
void nRF2401_SetAddress(unsigned int Address[],unsigned int AddrByte);
// 设置目标nRF2401A的地
址
void Delay_Us(unsigned int TimeCnt); // 延时(uS)
unsigned int RxBuf[25]; // 接收缓冲,保存接收到的数据
main()
{
Init_Device() ; P1=0xfe;
nRF2401_Initial(); // nRF2401A初始化
nRF2401_Mode(0);
RxBuf[0]=0;
while(1)
{
while((nRF2401_RxStatus()) != 1)
{
Delay_Us(60);
}
if(nRF2401_ReceiveByte(RxBuf)==1); //接收数据
xianshi();
}
}
4.系统测试及结论
在系统的测试方案上我们制定了三个原则,即可靠性,扩展性和实用性。
4.1.可靠性
由于无线LED信息发布系统使用环境的特殊性,必须保证系统工作相对稳定可靠。
本系统的可靠性主要体现在三个方面:一是上位机的可靠性,包括硬件系统的可靠性,软件平台的可靠性;二是无线LED显示终端的可靠性,主要是指无线LED显示终端能够稳定可靠地工作,硬件故障率低。
三是通信机制可靠,因为无线网络通信的使用环境有其复杂性的特点,系统通信机制一定要保
障数据传输高效可靠。
4.2.实用性
整个系统的操作以方便、简洁、高效为目标,既充分体现快速反应的特点,又能便于操作人员进行信息处理和发布。
计算机操作简单便捷、无线通信系统安装调整方便、LED显示直观醒目,综合以上优点的无线LED信息发布系统具有实用价值。
采用目前成熟的系统软件平台及终端设备,不但能够无线满足LED信息无线发布需要,而且能够支持相关各个行业内部具体业务需要。
4.3.扩展性
系统要有良好的扩展性,当终端数量增加、系统功能增加时,能够平稳升级,保护投资。
对本系统的扩展主要集中在两个方面,一是LED显示屏面积的扩大,在本系统中我们使用的屏幕比较小,还不能满足某些特殊场合的需要。
我们的系统可以通过比较简单的扩展来实现这一需求,在硬件上由于单片机片内RAM不足需要增加一个外置RAM以满足更大的信息输出量。
二是LED显示终端数量的增加,当然有时使用多个LED屏来满足多位置显示的需求,我们必须增加显示终端的数量。
这时只需为每个增加的终端配备一个接收显示模块,在上位机和发射端增加一个寻址协议,即为每一个终端编制一个唯一的地址,每个终端在接收数据时先判断发送端发送的地址码是否为自身地址码,若是这接收数据并显示,否则不接受。
这样计算机便可以比较简便地控制多个终端。
4.4.结论
本系统遵循以上制定的三个原则,分别进行了测试,测试表明本系统能够长时间稳定运行,操作极易上手,扩展方法较为简单。
需要说明的是由于成本有限我们在此系统中采用的是nRF2401,但
其传输距离有限,当有远距离的传输需求时建议采用nRF24L01,
它的无线传输距离理论值为1.2公里。
5.系统典型应用
作为一种新的信息发布载体,无线LED信息发布系统具有广阔的市场和用途,可广泛用于政府、商业、交通、餐饮、建筑、旅游、体育等行业和部门。
5.1 政府部门
将无线LED显示屏安装在政府部门的办事大厅,作为政务公示栏,用来发布政府政策、公告公示、民意调查、应急通知、预警提示、气象信息、法规宣传等;无线LED显示屏可以成为气象、安全、交通、水利、消防、民政、公安、城管等行业部门信息发布与预警系统的标准终端。
5.2交通车站
将无线LED显示屏安装在车站候车室、收费站、站台中作为电子公告屏,用于发布公交信息、天气预报、各类广告、即时新闻、交通路况、票务情况、临时通知等;
5.3 广告传媒
将无线LED显示屏可嵌入到广告灯箱、户外广告、招牌门牌、路牌中用于发布即时广告和信息,可以有效提升整体广告效果,扩大广告受众率。
5.4农业农村
将无线LED显示屏安装到各村、镇重要场所,作为农村供求信息栏,用于发布农业科技、农业政策、应急广播、市场信息、供求信息、气候信息、病害防治等;。