标题: 用12C5A60S2和RF905写一个无线发射和接收程序用12自带的SPI [打印本页]

作者: xueer    时间: 2013-8-7 00:11
标题: 用12C5A60S2和RF905写一个无线发射和接收程序用12自带的SPI
发送程序  
#include <12c5a60s2.h>
#include <intrins.h>
#define FOSC 11059200L
#define BAUD (256-FOSC/32/9600)
#define uint unsigned int
#define uchar unsigned char
uchar data TxBuf[32];
uchar data RxBuf[32];
uchar bdata DATA_BUF;
/*     定义RF905                    */
#define WC  0x00 // 写配置寄存器指令
#define RC  0x10  // 读取配置寄存器命令
#define WTP 0x20  //写TX有效数据字节写操作全部从0开始
#define RTP 0x21 // 读TX有效数据字节写操作全部从0开始
#define WTA 0x22 // 写发送地址命令
#define RTA 0x23 // 读发送地址命令
#define RRP 0x24 // 读RX有效数据字节写操作全部从0开始
typedef struct RFConfig
{
uchar n;
uchar buf[10];
}RFConfig;
code RFConfig RxTxConf ={
10,
0x01, 0x0c, 0x44, 0x20, 0x20, 0xcc, 0xcc, 0xcc,0xcc, 0x58
};
//这个结构的内容是NRF905的初始化数据。
// ch_no = 1;433MHz;正常运转,没有协议;接收,发送的地址是4字节/收发有效宽度为32字节;禁用外部时钟;晶振频率= 16MHz / / 8位CRC和使/*******************************************************************************************/
/*******************************************************************************************/
void delay(uchar z)
{
uint x,y;
for(x=z;x<0;x--)
  for(y=110;y>0;y--);
}
sbit SPISS=P1^4;
sbit MOSI=P1^5;
sbit MISO=P1^6;
sbit SCK=P1^7;     //主器件启动一次数据传输时自动产生8个SCK时钟周期信号给从机
sbit CSN=P1^1;
sbit DR=P2^1;
sbit AM=P2^2;
sbit CD=P2^4;
sbit PWR_UP=P2^5;
sbit TRX_CE=P2^6;
sbit TX_EN=P2^7;
/*******************************************************************************************/
/*******************************************************************************************/
//function InitIO();
/*******************************************************************************************/
void InitIO(void)
{
CSN=1;// SPI禁用
SCK=0;// SPI初始化时钟线高
DR=1;// 初始化DR输入
AM=1;// 初始化AM输入
PWR_UP=1;// nRF905芯片上电
TRX_CE=0;// 在待机模式下设置nRF905
TX_EN=0;// 在接收模式设置无线
}
/*******************************************************************************************/
void SetTXmode()
{
TRX_CE=1;
TX_EN=1;
delay(1);
}
/***********************************
funtion :write spi date
***********************************/
void Spi_write(uchar date)
{
DATA_BUF=date;
SPDAT=DATA_BUF;
while(!SPIF);
SPSTAT=SPIF|WCOL;
}
void Config905(void)
{
uchar i;
CSN=0;
Spi_write(WC);
for(i=0;i<RxTxConf.buf[i];i++)
{
  Spi_write(RxTxConf.buf[i]);
}
CSN=1;
}
/***************************************
funtion: send 32 date
****************************************/
void TxPacket(void)
{
uchar i;
CSN=0;
Spi_write(WTP);
for(i=0;i<32;i++)
{
  Spi_write(TxBuf[i]);
}
CSN=1;
delay(5);
CSN=0;
Spi_write(WTP);
for(i=0;i<4;i++)
{
  Spi_write(TxBuf[i+5]);
}
CSN=1;
TRX_CE=1;
delay(5);
TRX_CE=0;
}
/***************************************
funtion: SPI init
****************************************/
void SPI_init(void)
{
SPCTL=0xfd;
SPSTAT=SPIF|WCOL;
SPDAT=0;
IE2|=ESPI;
EA=1;
}
/***************************************
funtion: uart init
****************************************/
void Uart_init(void)
{
TMOD=0x20;
AUXR=0x40;
TH1=TL1=BAUD;
SCON=0x50;
PCON=0X00;
TR1=1;
}
uchar RecvUart()
{
while(!RI)
RI=0;
return SBUF;
}
void SendUart(uchar dat)
{
while(!TI);
TI=0;
SBUF=dat;
}
void main()
{
InitIO();
Uart_init();
SPI_init();
Config905();
SetTXmode();
delay(500);// 延时
while(1)
{
  Scankey();
  TxPacket();
  if(DR)
   {
    beep=~beep;
    delay(1000);
   }   
}
}

作者: 13620819446    时间: 2013-10-13 22:02
真是不错的资料
作者: m182892    时间: 2013-11-27 18:35
有空买个模块照程序试下。
作者: 07700114    时间: 2014-5-26 12:05
万分感激楼主。
作者: kpdz009    时间: 2014-8-10 07:44
谢谢了

作者: czhzy888    时间: 2014-9-3 12:51
很不错就是看不懂啊
作者: 我思故我在    时间: 2014-9-18 10:20
楼主辛苦了
作者: hudehua    时间: 2014-9-21 21:12
学习了
作者: ludaijin    时间: 2015-10-19 13:15
我搞了个NRF2401的
作者: CFM0415    时间: 2016-7-1 19:27
该程序是发送部分的接收部分能给吗




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1