//此程序没有加接收反回指令
//
#include <reg52.h>
#include <intrins.h>
#include <my_nRF905.h>
/************timer0定时中断***********/
void timer0(void) interrupt 1 using 0
{
TH0=timer0h;
TL0=timer0l;
delay_flag = 1;
TF0 = 0;
}
/********每单位时间延时50 us *******/
void delay(unsigned char n)
{
while(n>0)
{
TR0=ON; //启动T0定时
ET0=1;
TH0=timer0h; //T0定时15MS
TL0=timer0l;
delay_flag=False;
while(!delay_flag);
TR0=OFF; //启动T0定时
ET0=0;
n--;
}
}
/**********延时650子程序************/
void delay650(void)
{
unsigned char delay_num; //延时650us要运行的次数
delay_num = 180;
while(delay_num)
{
delay_num--;
_nop_();
}
}
/**********SPI发送一个字节*********/
void SpiWrite(unsigned char val)
{
unsigned char i, j;
for (i = 8; i > 0; i --)
{
j = val & 0x80;
if(j == 0x80)
{
MOSI = 1;
}
else
{
MOSI = 0;
}
SCK = ON;//上升沿打入数据
val <<= 1;
_nop_();
SCK = 0;//下降沿读入数据(首次为假动作)
_nop_();
}
}
/**********SPI读取一个字节*********/
unsigned char SpiRead(void)
{
unsigned char i,val = 0;
for (i = 8; i > 0; i--)
{
val <<= 1;
if(MISO)
{
val |= 0x01;
}
SCK = 1; //上升沿打入数据
_nop_();
SCK = 0; //下降沿读入数据(首次为假动作)
_nop_();
}
return val;
}
/****** Spi 写RF发送的数据*************/
void SpiWrite_some(unsigned char *m1,unsigned char m2)
{
unsigned char b;
SCK=0;
CSN=0;
SpiWrite(WTP);
SpiWrite(m2);
SpiWrite(0xFA);
SpiWrite(0XAF);
while(m2)
{
b=*m1;
SpiWrite(b);
m1++;
m2--;
}
CSN=1;
}
/*************配置nRF905函数 **********/
void Config905(void) using 0//配置nRF905
{
CSN = OFF; // Spi enable for write a spi command
SpiWrite(WC); // Write config command
for(count_p=0;count_p<10;count_p++)
{
SpiWrite(configbuf[count_p]);
}
CSN = ON; // Disable Spi
}
/*****RF写发送地址**********/
void Spi_tx_addr(void)
{
CSN=0;
SpiWrite(WTA);
SpiWrite(0x29); //0x28
SpiWrite(0x88); //0x55
SpiWrite(0x0c); //0x5a
SpiWrite(0x0c); //0xa5
CSN=1;
}
/************RF发送子程序*****************/
void RF_send (void)
{
TX_EN = ON;
TRX_CE = ON;
delay650();
delay650();
delay650();
delay650();
delay650();
while(!DR);
TRX_CE =0;
}
/********mRF905的初始化***********/
void InitnRF905(void)
{
CSN = ON;
SCK = OFF;
PWR_UP = ON;
TRX_CE = OFF;
TX_EN = OFF;
DR = OFF;
AM = OFF;
for(count_p=0;count_p<10;count_p++)
{
configbuf[count_p]=config_tab[count_p];
}
configbuf[0]=FreqBill[frequency];
if(frequency>=8)
{
configbuf[1]++;
}
}
/*****************/
void Sysinit(void)
{
P1=0xff;
P2=0xff;
P3=0xff;
IP=0x10; //打开INT0及Serial优先级,INT0的优先级大于Serial的优先级。
TMOD=0x21; //T0.T1工作于方式1 ,T1工作于方式2
TH1=250; //T1波特率 9600--22M
TL1=250;
TR1=ON; //启动T1定时
PCON=0x00; //波特率选择
SCON=0x50; //设置串口工作模式1,并打开允许接收.并收发中断,RI,TI = 0;
EA=1; //打开总中断使能
ES = 1; //关闭串口中断使能
EX0=0; //关闭INT0计数器的使能
EX1=0; //关闭INT1计数器的使能
TI = 0; //无发送中断标志
RI = 0; //无接收中断标志
IT0=1; //设置INT0的电平触发方式,负边沿触发
IT1=0; //设置INT0的电平触发方式,电平触发
}
/*********INT0中断子程序*************
表示RF中的数据接收完毕***********/
void intr0_int(void) interrupt 0 using 1
{
if(!write_flag)
{
write_flag=True;
TRX_CE=OFF;
TX_EN =OFF;
delay650();
if(!RFrec_flag)
{
CSN=0;
SpiWrite(RRP);
RFrec0_num = SpiRead();
for(count_p=0;count_p<RFrec0_num + 2;count_p++)
{
rxpack0_buf[count_p]=SpiRead();
}
CSN=1;
RFrec0_flag = 1;
}
else
{
CSN=0;
SpiWrite(RRP);
RFrec1_num = SpiRead();
for(count_p=0;count_p<RFrec1_num + 2;count_p++)
{
rxpack1_buf[count_p]=SpiRead();
}
CSN=1;
RFrec1_flag = 1;
}
}
}
/*********INT1中断子程序*************
RF中的数据地址正确**********/
void intr1_int(void) interrupt 2 using 3
{
AMflag=False;
if(!write_flag)
{
AMflag=True;
}
}
/**********串口接收中断*************/
void serial_int() interrupt 4 using 3
{
if(RI)
{
RI=0;
rec_ok = 0;
if(!rec_flag1)
{
recv0_data = SBUF;
recv0_buf[recv0_num] = recv0_data;
recv0_num++;
recv0_flag = 1;
}
else
{
recv1_data = SBUF;
recv1_buf[recv1_num] = recv1_data;
recv1_num++;
recv1_flag = 1;
}
rec_ok = 1; //表示串口现在接收完了。
}
_nop_();
}
/*************串口发送一个字节子程序******/
void SendByte(unsigned char x)
{
SBUF=x;
while(!TI);
TI=0;
}
/***********RF接收状态**********/
void SetRxStatus(void)
{
TRX_CE =1;
TX_EN =0;
delay650();
delay650();
TR0=ON; //启动T0定时
ET0=1;
delay(50);
write_flag=False;
}
/*********RF发送打包子程序***********/
void TxPack(void)
{
unsigned char *a1,*a2;
unsigned char b1,b2;
while(write_flag);
RERFOK = 0; //发送指示灯亮
write_flag=1;
TX_EN = OFF;
TRX_CE = OFF;
delay650();
Spi_tx_addr();
_nop_();
if(recv0_flag)
{
_nop_();
if(deal0_flag)
{
a1 = &recv0_buf[0];
b1 = recv0_num;
SpiWrite_some(a1, b1);
_nop_();
RF_send ();
_nop_();
}
}
if(recv1_flag)
{
_nop_();
if(deal1_flag)
{
a2 = &recv1_buf[0];
b2 = recv1_num;
SpiWrite_some(a2, b2);
_nop_();
RF_send ();
_nop_();
}
}
RERFOK = 1; //发送指示灯亮
write_flag = 0;
}
/**************RF接收包**********/
/*******主程序*******/
void main(void)
{
P1=0xff;
P2=0xff;
P3=0xff;
Sysinit(); //系统初始化
frequency=0; //设置频点
frequency=(P2^0x0f)&0x0f;
delay(30);
InitnRF905();
DR=OFF;
AM=OFF;
delay(60);
/*******全局变量标志位初值*********/
deal0_flag = 0; //处理串口数组0的标志位
deal1_flag = 0; //处理串口数组1的标志位
rec_flag1 = 0; //串口接收数组分类的标志位
recv0_flag = 0; //串口接收数组0是否有数据
recv1_flag = 0; //串口接收数组1是否有数据
rec_ok = 0; //串口单个字节接收是否完成的标志位
RFrec_flag = 0; //RF接收数组分类标志位
RFrec0_flag = 0; //RF接收数组0是否有数据的标志位
RFrec1_flag = 0; //RF接收数组1是否有数据的标志位
AMflag = 0;
count_p = 0;
count_r = 0;
write_flag = 0;; //是否正在读取的标志位
delay_flag = 0; //延时中断标志位
recv0_num = 0; //串口接收数组0的字节个数
recv1_num = 0; //串口接收数组1的字节个数
RFrec0_num = 0; //RF接收数组0的字节个数
RFrec1_num = 0; //RF接收数组1的字节个数
PWR_UP=ON; //给nRF905上电,并设置
TRX_CE=OFF;
TX_EN=OFF;
Config905();
delay(60);
IE0 = 0;
EX0 = 1;
delay650();
SetRxStatus();
while(1)
{
_nop_();
/********检测串口接收数组0是否有数据发送**********/
if (rec_ok)
{
_nop_();
if (recv0_flag)
{
rec_flag1 = 1;
deal0_flag = 1;
rec_ok = 0;
TxPack();
_nop_();
delay650();
delay650();
// TI = 0;
// for(count_r=0;count_r < recv0_num ;count_r++)
// {
// SendByte(recv0_buf[count_r]);
// }
recv0_num = 0;
recv0_flag = 0;
rec_flag1 = 0;
deal0_flag =0;
}
}
/**********下面是RF接收数据**********/
if(RFrec0_flag)
{
RFrec_flag = 1;
RFrec0_flag = 0;
RERFOK = 0;
delay650();
if ((rxpack0_buf[0] == 0xFA) && (rxpack0_buf[1] == 0xAF))
{
TI = 0;
for(count_r=2;count_r < RFrec0_num + 2 ;count_r++)
{
SendByte(rxpack