⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 send.c

📁 用NRF905芯片实现数据的无线传输
💻 C
字号:
#include <AT89X52.h>
#include <ABSACC.h>
#include <intrins.h>
#include <stdio.h>
#define uint  unsigned int
#define uchar unsigned char
//配置口定义//
sbit TXEN    =    P1^7;
sbit TRX_CE  =    P1^6;
sbit PWR     =    P1^5;
sbit UPCLK	 =    P1^4;
//SPI口定义//
sbit MISO    =    P1^0;
sbit MOSI    =    P3^7;
sbit SCK     =    P3^3;
sbit CSN     =    P3^4;
//sbit P2_0  = P2^0;
//状态输出口//
sbit CD      =    P1^3;
sbit AM   	 =    P1^2;
sbit nrfDR   =    P1^1;

sbit LED     =    P3^5;		  //指示灯
sbit RE_DE   =    P3^2;		  //485串口接收发送控制端

//RF寄存器配置//
unsigned char idata RFConf[11]=
{
    0x00,        //配置命令//
    0x6C,        //CH_NO,配置频段在433.2MHZ
    0x0E,        //输出功率为10db,不重发,节电为正常模式
    0x44,        //地址宽度设置,为4字节
    0x03,0x03,    //接收发送有效数据长度为32字节
    0x00,0x00,0x00,0x03,    //接收地址
    0xde,        //CRC充许,16位CRC校验16M晶振
};
uchar TxRxBuffer[32];
bit lcdbit;
///////////延时/////////////////
void Delay(uint x)
{
    uint i;
    for(i=0;i<x;i++)
	  {
        _nop_();
       }
}

////////////用SPI口写数据至NRF905内//////////
void SpiWrite(unsigned char Data)
{
	char i;
	for(i=0;i<8;i++)
	{
		 SCK=0;
		 if(( Data & 0x80 ) == 0x80)
		 	 MOSI=1;
		 else
		 	 MOSI=0;
		 Delay(10);
		 Data<<=1;
		 SCK=1;
		 Delay(10);
	}
	SCK=0;
}
///////////////from 905 read data////////////////
unsigned char SpiRead(void)
{
	 uchar i;
	 uchar temp = 0;
	 SCK=0;
	 _nop_();
	 _nop_();
	 for(i=0;i<8;i++)
	 {
	 	 SCK=1;
	 	 temp<<=1;
	 	 Delay(10);
	 	 if(MISO==1)  //获得端口状态
	 	    temp |= 0x01;
	 	 Delay(10);
	 	 SCK=0;
	 	 Delay(10);
	 }
	 return temp;
}
///////////////接收数据包/////////////////
void RxPacket(void)
{
    uchar i;
    i=0;
    while(nrfDR)
    {
       TxRxBuffer[i] = SpiRead();
        i++;
    }
}

/*
;写发射数据命令:20H
;读发射数据命令:21H
;写发射地址命令:22H
;读发射地址命令:23H
;读接收数据命令:24H
*/
TxPacket(void)
{
  char i;
  PWR=1;
  TRX_CE=0;
  TXEN=1;
  CSN=0;
  SpiWrite(0x22);     //写发送地址,后面跟4字节地址//
  SpiWrite(0xE7);
  SpiWrite(0xE7);
  SpiWrite(0xE7);
  SpiWrite(0xE7);
  CSN=1;
  _nop_();
  _nop_();
  CSN=0;
  SpiWrite(0x20);     //写发送数据命令,后面跟字节数据//
  for(i=0;i<32;i++)
  SpiWrite(i+1);	 //发送i的值  1-32
  CSN=1;
  _nop_();
  _nop_(); 
  Delay(300);             //使能发射模式//
  TRX_CE=1;
  TXEN=1;
}
TxPacket2(void)
{
  char i;
  PWR=1;
  TRX_CE=0;
  TXEN=1;
  CSN=0;
  SpiWrite(0x22);     //写发送地址,后面跟4字节地址//
  SpiWrite(0xE7);
  SpiWrite(0xE7);
  SpiWrite(0xE7);
  SpiWrite(0xE8);
  CSN=1;
  _nop_();
  _nop_();
  CSN=0;
  SpiWrite(0x20);     //写发送数据命令,后面跟字节数据//
  for(i=0;i<32;i++)
  SpiWrite(i+33);	 //发送i的值  1-32
  CSN=1;
  _nop_();
  _nop_(); 
  Delay(300);             //使能发射模式//
  TRX_CE=1;
  TXEN=1;
}
////////////////等待接收数据包///////////////////
uchar temp;
void Wait_Rec_Packet(void)
{   
    PWR=1;
    TRX_CE=1; 
	TXEN=0;
	Delay(650);  //650US
    while(1)
    { 
        if(nrfDR)
        { 
            TRX_CE=0;            //如果数据准备好,则进入待机模式,以便SPI口操作
            CSN=0;
            SpiWrite(0x24);
            RxPacket();
            CSN=1;
            temp=TxRxBuffer[0]+TxRxBuffer[1]+TxRxBuffer[2];
            if(temp==0x06)
			{        
                lcdbit=!lcdbit;
                LED=lcdbit;     
            }
            break;
        }
    }
}
void ReadConfig(char wr_data)
{
	uchar i;
	PWR=1;TRX_CE=0;TXEN=0;
	Delay(100);
	CSN=0;
	SpiWrite(wr_data);
	Delay(10);
	for(i=0;i<10;i++)
	{
		 TxRxBuffer[i] = SpiRead();
	}
	CSN=1;;
  Delay(100);
}
////////////初始化配置寄存器////////////////
void Ini_System(void)
{
    LED=1;
    Delay(60000);
    LED=0;
    lcdbit=1;
    CSN=1;
    SCK=0;
    PWR=1;TRX_CE=0;	TXEN=0;				 //PWR=1;TRX_CE=0;TXEN=0;处于待机状态,不能接受和发送,只能写配置字
	Delay(500);
    CSN=0;
    SpiWrite( 0x00);        //配置命令//
    SpiWrite( 0x6B);        //CH_NO,配置频段在433.2MHZ
    SpiWrite( 0x0C);        //输出功率为10db,不重发,节电为正常模式
    SpiWrite( 0x44);        //地址宽度设置,为4字节
    SpiWrite( 0x20);SpiWrite( 0x20);    //接收发送有效数据长度为32字节
    SpiWrite( 0x00);SpiWrite( 0x00);SpiWrite( 0x00);SpiWrite( 0x03);    //接收地址
	
    SpiWrite( 0xdb); 
    CSN=1;
    PWR=1;
    TRX_CE=1;
    TXEN=0;		  //PWR=1;TRX_CE=1;TXEN=0;处于等待接收状态
    Delay(650);
}







#define max_len_string 8
#define INBUF_LEN 4   //数据长度
char checksum,countlong;
char inbuf1[max_len_string];
bit  read_flag=0;
void delay();

void send_char_com(char ch)
{
    SBUF=ch;
    while(TI==0);
    TI=0;
}

void send_string_com( char *str,int strlen)//发送数据帧格式:02-数据-校验和-03
{   
    int k=0; 
	RE_DE=0;
	Delay(20);
    do
    {  
        send_char_com(*(str + k));
        k++;
    } while(k < strlen);
	RE_DE=1;
}

 SERIAL() interrupt 4 using 1
{
    if(RI==1)
    {
      char ch;
      RI = 0;
      ch=SBUF;
      if(ch==0x02)
        {
             countlong=0;
			 read_flag=0;
             inbuf1[countlong]=ch;
			 LED=1;
			 return;
        }
      else
        {
		     if(read_flag==0)
             {
			   countlong++;
               inbuf1[countlong]=ch;
               if(ch==0x0D)
               { LED=0;
			     send_string_com("Recevie_OK:",11);
				 TxPacket();
                 read_flag=1; 
                         
				}
             }  
        }
    }  return;
}

void init_serial()
{

PCON = 0x80;					 //pcon(smod,  ,  ,  ,  ,  ,  ,  )
SCON = 0x50; //串口方式1,允许接收  //scon(sm0,sm1,sm2,ren,tb8,tb8,ti,ri)   T1做时钟信号  工作方式1,10位异步接收
TMOD = 0x20; //定时器1定时方式2	 // tmod(gate1,c/t,m1,m0,gate0,c/t,m1,m0)
TCON = 0x40; //设定时器1开始计数 //tcon(tf1,tr1,tf0,tr0,ie1,it1,ie0,it0)     波特率是:2400
TH1  = 0xF4; //11.0592MHz 4800波特率
TL1  = 0xF4;
IE=0;					   //ie(ea,  ,    ,es,et1,ex1,et0,ex0)
ES=1;
EA=1; 
TR1  = 1; //启动定时器}	
}

        
void main(void)
{
    init_serial();
    Ini_System();
    PWR=1;
    P1=0xFF;
	P3=0xFF;
	LED=0;
	RE_DE=1;
	Ini_System();
    send_string_com("Sendstart_OK:",13);
	Delay(1000);
       while(1)
       { 
	     RE_DE=1;
		// ReadConfig(0x10);	   //读配置字
		 //send_string_com(TxRxBuffer,10);   //把读到的配置字从串口发出,
      		   
         Delay(20000);
	  	 LED=1;
         TxPacket(); 				 //发送程序
	     //Wait_Rec_Packet();        //等待接收完成
	     //send_string_com(TxRxBuffer,32);
		 Delay(10000);
		 TxPacket2(); 				 //发送程序
		 
	     Delay(20000);
	     LED=0;

       }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -