智能车制作
标题:
NRF24L01
[打印本页]
作者:
日新
时间:
2010-9-10 17:49
标题:
NRF24L01
#include <STC12C54.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
uchar time=0;//按键次数
char shi=9,ge=9,xiaoshu=9;//各位报警温度
uchar rx_buf[]={0,0,0};//接收数据包数组
uchar flag=0;//接收数据成功标志位
uchar table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x39}; //共阴显示字库
uchar table1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};//共阴==带小数点
//uchar table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xc6}; //共阳显示字库
//uchar table1[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10}; //共阳带小数点
/**************************************************************
nrf24l01与MCUAT89S52对应引脚
**************************************************************/
sbit CE=P1^3;//芯片收发使能
sbit CSN=P1^4;//SPI使能,低电平有效
sbit SCK=P1^7;//SPI时钟
sbit MOSI=P1^5;//SPI输入,主机对从机写入数据
sbit MOSO=P1^6;//SPI输出,主机从从机读数据
sbit IRQ=P3^2;//数据传送完标志位,0表示数据发送或接收完毕
/*****************************************
nrf24l01置发送模式涉及的SPI指令与寄存器地址等
*******************************************/
#define config 0x00 //配置寄存器config地址
#define write_reg 0x20//写寄存器指令
//#define status 0x07//状态寄存器地址
#define rd_rx_pload 0x61//接收数据寄存器地址
#define wr_tx_pload 0xa0//发送数据寄存器地址
#define rx_addr_p0 0x0a//rx address通道p0地址
#define en_aa 0x01//自动重发使能地址
#define en_rxaddr 0x02//使能p0
#define setup_retr 0x04//配置自动重发次数地址
#define rf_ch 0x05//通讯频率选择寄存器
#define rf_setup 0x06//配置发射参数(低噪放大器增益、发射功率、无线速率)
#define rx_pw_p0 0x11 // 写接收数据长度寄存器
#define tx_adr_width 0x05//接收机地址长度
#define tx_pload_width 0x03//数据有效长度
#define statu 0x07 // 状态寄存器地址
#define flush_rx 0xe2
uchar tx_address[tx_adr_width]={0xE7,0xE7,0xE7,0xE7,0xE7};//接收机地址
void Com_Init(void);
void ComSend(uchar *Puchar);
void delay(uint z) //1ms延时
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
/**********************************
nrf24l01无线发送涉及函数
***********************************/
//延时130us函数
void delayus(uchar t)
{
uchar j;
while(t--)
{for(j=2;j>0;j--);}
}
//写一个字节到24l01,同时读出一个字节
uchar SPI_RW(uchar byte)
{
uchar i;
for(i=0;i<8;i++)//一个字节8位
{
MOSI=(byte&0x80);
byte=(byte<<1);
SCK=1;
byte|=MOSO;
SCK=0;
}
return byte;
}
//向寄存器reg写一个字节,同时返回一个字节
uchar SPI_RW_REG(uchar reg,uchar value)
{
uchar status;
CSN=0;
status=SPI_RW(reg);
SPI_RW(value);
CSN=1;
return status;
}
//写入butes字节的数据
uchar SPI_wbyt(uchar reg,uchar *byt,uchar bytes)
{
uchar status,i;
CSN=0;
status=SPI_RW(reg);
for(i=0;i<bytes;i++)
SPI_RW(*byt++);
CSN=1;
return status;
}
//读出bytes字节的数据
uchar SPI_rbyt(uchar reg,uchar *byt,uchar bytes)
{
uchar status,i;
CSN=0;
status=SPI_RW(reg);
for(i=0;i<bytes;i++)
byt[i]=SPI_RW(0);
CSN=1;
return status;
}
//设定nrf24l01为接收模式
void set_RX_Mode()
{
CE=0;
CSN=1;
SCK=0;
CE=0;
SPI_wbyt(write_reg + rx_addr_p0, tx_address, tx_adr_width);//写Rx节点的地址
SPI_RW_REG(write_reg +en_aa, 0x01); // 使能自动重发
SPI_RW_REG(write_reg + en_rxaddr, 0x01); // 使能通道0
SPI_RW_REG(write_reg+ rf_ch, 0x02); // 选择通讯频率 40
SPI_RW_REG(write_reg + rx_pw_p0, tx_pload_width);//选择接收数据有效长度
SPI_RW_REG(write_reg + rf_setup, 0x01);//配置发射参数(低噪放大器增益、发射功率、无线速率
SPI_RW_REG(write_reg + config, 0x0f); // 配置config进入接收模式
CE = 1;
delayus(130);
}
/***********************************************************
主函数
***********************************************************/
void main()
{
EA=1;
IT0=0;
EX0=1;
Com_Init();
set_RX_Mode();
while(1)
{
if(flag==1)
ComSend(rx_buf);
}
}
void extr0() interrupt 0
{
SPI_RW_REG(write_reg +statu,0x7e);
SPI_RW(flush_rx);
SPI_rbyt( rd_rx_pload,rx_buf,tx_pload_width);//读数据存到数组中
flag=1;
}
void Com_Init(void)
{
TMOD = 0x20;
PCON = 0x00;
SCON = 0x50;
TH1 = 0xFd;
TL1 = 0xFd;
TR1 = 1;
}
void ComSend(uchar *Puchar)
{
while(*Puchar)
{
SBUF=*Puchar;
while(!TI)
{
_nop_();
}
Puchar++;
TI = 0;
}
}
作者:
野狼明明
时间:
2010-9-14 16:18
好东西
作者:
zhu_xuekui
时间:
2012-2-23 16:45
好东西。。。
作者:
Solemn胜威
时间:
2012-3-6 15:09
zhu_xuekui 发表于 2012-2-23 16:45
好东西。。。
你调试成功了吗?nrf2401,xs128的,一起交流一下嘛,
作者:
zhu_xuekui
时间:
2012-3-6 18:36
研究中。。。。。呵呵。。。。。
作者:
松林族
时间:
2012-3-21 20:59
比较有压力
作者:
79270300
时间:
2012-6-13 21:51
你就不能给一个完整的程序啊!
欢迎光临 智能车制作 (http://dns.znczz.com/)
Powered by Discuz! X3.2