找回密码
 注册会员
更新自动建库工具PCB Footprint Expert 2024.04 Pro / Library Expert 破解版

用nrf2401进行无线通讯的问题

[复制链接]
admin 发表于 2012-9-2 08:41:20 | 显示全部楼层 |阅读模式

本文包含原理图、PCB、源代码、封装库、中英文PDF等资源

您需要 登录 才可以下载或查看,没有账号?注册会员

×
这个程序是我参照网上的例子写的,可是我实际运行时,还是不能成功啊,忘高手指教啊

#include <c8051f020.h> //必要的头文件
#include <intrins.h>
#define uchar unsigned char


#define n_PWR_UP_H ? P5|=(0x01 << 2) ? ? //模式控制
#define n_PWR_UP_L ? P5&=~(0x01 << 2)


#define n_CE_H ? ? ? P5|=(0x01 << 1)
#define n_CE_L ? ? ? P5&=~(0x01 << 1)

#define n_CS_H ? ? ? P5|=(0x01 << 3)
#define n_CS_L ? ? ? P5&=~(0x01 << 3)


#define n_DR1_H ? ? ?P5|=(0x01 << 4) ??
#define n_DR1_L ? ? ?P5&=~(0x01 << 4)
#define n_DR1_X ? ? ?P5&(0x01 << 4)


#define n_CLK1_H ? ? P5|=(0x01 << 5)
#define n_CLK1_L ? ? P5&=~(0x01 << 5)


#define n_DATA_H ? ? P5|=(0x01 << 6)
#define n_DATA_L ? ? P5&=~(0x01 << 6)
#define n_DATA_X ? ? P5&(0x01 << 6)


#define n_LED_H ? ? ? P5|=(0x01 << 0) ? // ?状态指示灯
#define n_LED_L ? ? ? P5&=~(0x01 << 0)




sbit sound = P2^4;


sbit Key1 = P1^3;
sbit Key2 = P1^4;
sbit Key3 = P1^7;
sbit Key4 = P1^6;
sbit Key5 = P1^5;
sbit Key6 = P1^2;?


unsigned char ? key=0; ? ? ? ? ??
unsigned char ? key_press=0;
unsigned char ? delay_key;
unsigned char ? key_bak;


uchar code n_add[4]={0x11,0x11,0x11,0x11};?
uchar ? TXData[10]={0}; ??
uchar ? RXData[10]={0};




uchar nRF2401_flag;
/************************************************************************
* 名称:PORT.c ??
* 功能:配置交叉开关和GPIO端口 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
*************************************************************************/
?void PORT_Init (void)
{
? ? P0MDOUT ? = 0x7D;
? ? P1MDOUT ? = 0x03;
? ? P2MDOUT ? = 0xFF;
? ? P3MDOUT ? = 0xFF;
P74OUT ? ?= 0x81; ? ? ?
? ? XBR0 ? ? ?= 0x24;
XBR1 ? ? ?= 0x24;
XBR2 ? ? ?= 0x40; ? ? ? ? ? ? ? ? ? ??
P7= 0x0f;
P6= 0xff;
P5= 0xff;
P4= 0xff;


}
/************************************************************************
* 名称:SYSCLK.c ??
* 功能:此程序初始化系统时钟使用16MHZ(22.1184MHz)晶体作为时钟源。 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
*************************************************************************/
void SYSCLK_Init (void)
{
OSCICN ? ?= 0x17; ? //16MHZ
}
/****************************************************************************
* 名称:speak()
* 功能:蜂鸣函数
****************************************************************************/
void speak(void)
{
sound=0;
TH1 =(65535 - 38868) >> 8; //初值高8位
TL1 =(65535 - 38868) & 0xff; //初值低8位
}


/****************************************************************************
* 名称:read_key()
* 功能:检测键盘,初步判断按键的键值
****************************************************************************/
unsigned char read_key(void)
{
? ? if ? (!Key1)
? ? ? return 1;
else if(!Key2)
? ? ? return 2;
else if(!Key3)
? ? ? return 3;
else if(!Key4)
? ? ? return 4;
? ? else if(!Key5)
? ? ? return 5;
? ? else if(!Key6)
? ? ? ? ? ?return 6;
? ? else
? ? ? return 0;
}
/****************************************************************************
* 名称:scan_key()
* 功能:软件消抖,确定键值,将其存入key中
****************************************************************************/
void scan_key(void)
{ ? unsigned char i;
i=read_key();
switch(key_press)
{
case 0:
if(i)
key_press=1;
delay_key=1;
key_bak=i;
break;
case 1:
if(i==key_bak)
{
if(--delay_key==0)
{
key=i;
key_press=2;
delay_key=1;
speak();
}
}
else
{
key_press=0;
}
break;
case 2:
if(i)
{
delay_key=1;
}
else
{
if(--delay_key==0)
key_press=0;
}
break;
default:
key_press=0;
break;
}
}
/****************************************************************************
* 名称:T0_Init()
* 功能:T0初始化
****************************************************************************/
void T0_Init()
{
CKCON|=0x00; //定时器使用系统时钟的12 分频
TMOD |= 0x01; //定时器模式 ?
TH0 =(65535 - 2203) >> 8; //初值高8位
TL0 =(65535 - 2203) & 0xff; //初值低8位
ET0 = 1; //开定时中断
TR0 = 1; //启动定时器
}
/****************************************************************************
* 名称:T0_isr()
* 功能:T0的中断服务程序
****************************************************************************/
void T0_isr() interrupt 1
{
TH0 =(65535 - 2203) >> 8;//重置初值高8位
TL0 =(65535 - 2203) & 0xff;//重置初值低8位
scan_key();

}
/****************************************************************************
* 名称:T1_Init()
* 功能:T1初始化,大约20ms
****************************************************************************/
void T1_Init(void)
{
CKCON|=0x00; //定时器使用系统时钟的12 分频
TMOD|=0x10; //定时器模式
TH1 =(65535 - 38868) >> 8; //初值高8位
TL1 =(65535 - 38868) & 0xff; //初值低8位
ET1 = 1; //开定时中断
TR1 = 1; //启动定时器
}
/****************************************************************************
* 名称:T1_isr()
* 功能:T1的中断服务程序
*************************************************************/
void T1_isr() interrupt 3
{
?sound=1;
?n_LED_H;
}
/************************************************************************
* 名称:delayus() ??
* 功能:延迟函数,精度us ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
*************************************************************************/
void delayus(uchar i) ? ? ?
{
for(;i!=0;i--)
{
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
}
}


/************************************************************************
* 名称:delayms() ??
* 功能:延迟函数,精度ms ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
*************************************************************************/
void delayms(uchar i) ? ? ?
{
for(;i!=0;i--)
{
delayus(200);delayus(200);delayus(200);
delayus(200);delayus(200);
}
}






/****************************************************************************
* 名称:send_nrf2401_command()
* 功能:发送命令字节函数
****************************************************************************/
void send_nrf2401_command(uchar Send_command)?
{?
?uchar i;
?for (i=0;i<8;i++)?
? ?{?
if(Send_command&(0x80>>i))
{
n_DATA_H;
}
else
{
n_DATA_L;
}
?delayus(5);
? ? ? n_CLK1_H;
?delayus(5);
? ? ? n_CLK1_L;?
? ?}?
}?


/****************************************************************************
* 名称:nrf2401_Init()
* 功能:nrf2401无线模块初始化
****************************************************************************/
void nrf2401_Init(void)
{ ?
n_CE_L;
n_CS_L;
n_PWR_UP_H;?
delayms(10);
? n_CS_H;
delayms(10); ? ? ?

send_nrf2401_command(0x50); ? //DATA2_W ,Datalength 80bit(10 byte)
send_nrf2401_command(0x50); ? //DATA1_W ,Datalength 80bit(10 byte)


send_nrf2401_command(0x00); ? //通道2的地址
send_nrf2401_command(0x12);
send_nrf2401_command(0x34);
send_nrf2401_command(0x56);
send_nrf2401_command(0x78);


send_nrf2401_command(0x00); ? //通道1的地址
send_nrf2401_command(0x11);
send_nrf2401_command(0x11);
send_nrf2401_command(0x11);
send_nrf2401_command(0x11);


send_nrf2401_command(0x83); ?
send_nrf2401_command(0x68); ?
send_nrf2401_command(0x03); ?
delayms(10);
? n_CS_L;
delayms(10);?
}




/****************************************************************************
* 名称:nRF2401_Mode()
* 功能: 模式切换(0为发送1为接受)
* 入口参数:无
* 出口参数:无
****************************************************************************/
void nRF2401_Mode(uchar i)?
{?
?n_PWR_UP_H;
?n_CE_L;
?_nop_();?
?n_CS_H;?
?delayms(10); ?
?if(i)
? {
?send_nrf2401_command(0x03);
}
?else
? {
? ?send_nrf2401_command(0x02);
? }
?n_CS_L;
?_nop_();
?n_CE_H;
?delayms(10); ?
}


/****************************************************************************
* 名称:nrf2401_RX()
* 功能:无线发送
****************************************************************************/
void nrf2401_TX(void)
{
int i,j;
uchar temp;
n_LED_L;
TH1 =(65535 - 38868) >> 8; //初值高8位
TL1 =(65535 - 38868) & 0xff; //初值低8位
n_CE_H;
delayms(10);
for(i=0;i<4;i++)
{
temp=n_add[i];
for(j=0;j<8;j++)
{
if(temp&0x80)
{
n_DATA_H;
}
else
{
n_DATA_L;
}
delayus(10);
n_CLK1_H;
delayus(10);
n_CLK1_L;
 楼主| admin 发表于 2012-9-2 08:41:24 | 显示全部楼层
temp=temp<<1;
delayus(10);
}
}
for(i=0;i<10;i++)
{
temp=TXData;
for(j=0;j<8;j++)
{

if(temp&0x80)
{
n_DATA_H;
}
else
{
n_DATA_L;
}
delayus(10);
n_CLK1_H;
delayus(10);
n_CLK1_L;
temp=temp<<1;
delayus(10);
}

}
n_CE_L;
delayms(10);
}
/****************************************************************************
* 名称:nrf2401_RX()
* 功能:无线接收
****************************************************************************/
void nrf2401_RX(void)
{
int i,j;
uchar temp=0;
if(n_DR1_X)
{
n_LED_L;
TH1 =(65535 - 38868) >> 8; //初值高8位
TL1 =(65535 - 38868) & 0xff; //初值低8位 ??
for(i=0;i<10;i++)
{
for(j=0;j<8;j++)
{
temp=temp<<1;
n_CLK1_H;
delayus(10);
if(n_DATA_X)
{
temp|=0x01;
}
n_CLK1_L;
delayus(10);
}
RXData=temp;
}
nRF2401_flag|=0x01;
}
else
{
nRF2401_flag&=0xfe;
}
}


void keytest(void) ?//按键测试程序?
{?


? switch(key)
? {
? case 1: ?
? ?{?
? ?nRF2401_flag|=0x02;?
? ?TXData[0]++;
? ?key=0;?
? ?}?
? ?break;




? ?case 2:?
? ?{?
? ?nRF2401_flag|=0x02;?
? ?TXData[0]--;
? ?key=0;?
? ?}?
? ?break;






? ?case 3: ?
? ?{?
? ?nRF2401_flag|=0x02;?
? ?TXData[0]=0x00;
? ?key=0;?
? ?}?
? ?break;


? ? case 4: ?
? ?{?
? ?nRF2401_flag|=0x02;?
? ?TXData[0]=0xff;
? ?key=0; ??
? ?}?
? break;
? }


? if((nRF2401_flag&0x02)==0x02)?
? ?{?
? ?P6=~TXData[0];?

? ?nRF2401_Mode(0);
? ? nrf2401_TX();
nRF2401_Mode(1);?


? ?nRF2401_flag&=0xfd; ?
? } ? ?
}?
/****************************************************************************
* 名称:nrf2401()
* 功能:无线接收/发送函数
****************************************************************************/
void nrf2401(void)
{
?
? ?nrf2401_RX();
? ?if(nRF2401_flag&0x01==0x01)
? ? {
P6=~RXData[0];
}

? keytest(); ?
}


/****************************主函数**************************************
* 名称:void main (void) ??
* 功能:主函数 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
*************************************************************************/
void main (void)?


{
? ? WDTCN = 0xde; //关看门狗
? ? WDTCN = 0xad; ? ?
SP = 0x80;

? ? PORT_Init ();
SYSCLK_Init();
T0_Init();
T1_Init();
nrf2401_Init();


EA=1;
delayms(100);


nRF2401_Mode(0);
? ? nrf2401_TX(); //发送数据?
nRF2401_Mode(1);


speak();
while(1)
? ? {
nrf2401();


? }
}

*滑块验证:
您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

QQ|手机版|MCU资讯论坛 ( 京ICP备18035221号-2 )|网站地图

GMT+8, 2024-11-24 10:24 , Processed in 0.061738 second(s), 10 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表