Chinaunix首页 | 论坛 | 博客
  • 博客访问: 182973
  • 博文数量: 54
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 2018
  • 用 户 组: 普通用户
  • 注册时间: 2013-03-31 23:14
文章存档

2014年(2)

2013年(52)

分类: 嵌入式

2013-05-07 20:40:28

本实验无仿真,自制实验板;相关连接见附件。
c:
NRF905收发程序 温度传送.zip
pcb图:
NRF终极版.zip
涉及芯片:NRF 905 1023BG
    三极管:S9011  C  331
    电容:100UF
    二极管:IN5819
引脚:1,VCC    2,TXE
        3,CE,       4,PWR
        5,NC        6,CD
        7,AM       8,DR
        9,MISO    10,MOSI
        11,SCK    12,CSN
        13,GND   14,GND


/*发送模块*/
#include
#include 
#include
#include
#define uint unsigned int
#define uchar unsigned char
uchar code ICE52[3] _at_ 0x003b;//char code reserve [3] _at_ 0x3b;  //仿真器避开0x3b地址


#define BIT0 0x01
#define BIT7 0x80


#define  TxRxBuf_Len 4
uchar TxRxBuf[TxRxBuf_Len];//-------发送数据缓冲区-----------//
uchar code TxAddress[4]={0xe8,0xe7,0xe7,0xe7};


uchar zm2[]="      00.0       ";


//-------------------------------18b20------------------------------------------
  sbit   dq=P2^0;
//---------------------------NRF905工作模式控制端口---------------------------------//
  sbit   TXEN=P1^0;  
  sbit     PWR=P1^1;
  sbit   TRX_CE=P1^2;
//---------------------------------NRF905 SPI数据交换端口-------------------------------------//
  sbit     MOSI=P1^4;
  sbit   MISO=P1^7;
  sbit   CSN=P1^5;
  sbit   SCK=P1^6;
  
//----------------------------------------NRF905状态端口--------------------------------------//
//   sbit   AM=P1^1;
   sbit   DR=P1^3;
//   sbit   CD=P1^2;
//-------------------------------NRF905 SPI控制指令------------------------------------------//
  #define WC 0x00
  #define RC 0x10
  #define WTP 0x20
  #define RTP 0x21
  #define WTA 0x22
  #define RTA 0x23
  #define RRP 0x24
//-----------------------------------NRF905配置寄存器的配置--------------------------------//
uchar idata RFConf[11]=
{
0x00,                             //配置命令:配置寄存器的首地址//
0x4c,                             //CH_NO,配置频段在430MHZ
0x0c,                             //输出功率为10db,不重发,节电为正常模式
0x44,                             //地址宽度设置,为4字节
0x04,0x04,                        //接收发送有效数据长度为4字节
0xcc,0xcc,0xcc,0xcc,              //接收地址
0xd8                             //CRC充许,8位CRC校验,外部时钟信号不使能,16M晶振
};
uchar readRF[11];
//---------------------NRF905延时函数-------------//
void delay(int n)
{
while(n--);
 
}
//===============================SPI读函数===================//
uchar SpiRead(void)
{
unsigned char j,DATA_BUF;
for (j=0;j<8;j++)
{
    SCK=1;
DATA_BUF=DATA_BUF<<1;
    DATA_BUF=DATA_BUF|MISO;  
    _nop_();
_nop_();
    SCK=0;
_nop_();
_nop_();
}
return DATA_BUF;
}
//================================SPI写函数=================//
void SpiWrite(uchar send)
{
unsigned char i,DATA_BUF;
DATA_BUF=send;
for (i=0;i<8;i++)
{
   SCK=0;
   _nop_();
_nop_();
if (DATA_BUF&0x80) //总是发送最高位
{
MOSI=1;
}
else
{
MOSI=0;
}
SCK=1;
DATA_BUF=DATA_BUF<<1;
   _nop_();
   _nop_();
}
SCK=0;
}
//--------------------------------------------初始化nRF905---------------------------------//
void nRF905Init(void)
{
    CSN=1; // Spi 功能失效 
SCK=0; // Spi clock line init low
DR=1; // Init DR for input
//AM=1; // Init AM for input
//CD=1; // Init CD for input
PWR=1;    // nRF905通电
TXEN=0;    // 设置无线在Rx方式下
TRX_CE=0; // 设置nRF905在准备方式下 
}
//------------------------------------------初始化寄存器--------------------------------------//
void Config905(void)
{
uchar i;
CSN=0;       // Spi enable for write a spi command
//SpiWrite(WC);       // Write config command写放配置命令
for (i=0;i<11;i++)    // Write configration words  写放配置字
{
     
  SpiWrite(RFConf[i]);
  
}
CSN=1;     // Disable Spi
}


//-------------------------------------发送数据打包----------------------------------------//
void TxPacket(uchar *TxRxBuf)
{
uchar i; 
CSN=0;
SpiWrite(WTP); // Write payload command
for (i=0;i<4;i++)
{
    
SpiWrite(TxRxBuf[i]); // Write 32 bytes Tx data
 
 
}
CSN=1;
//read_disp(0x21,4);
delay(1); // Spi disable
CSN=0;        // Spi enable for write a spi command
SpiWrite(WTA); // Write address command
for (i=0;i<4;i++) // 写入与对方地址一样的地址
{
    
SpiWrite(TxAddress[i]);
 
 
}
CSN=1; // Spi disable
//read_disp(0x23,4);
TRX_CE=1;            // Set TRX_CE high,start Tx data transmission
//delay(1); // 
while (DR!=1);
    TRX_CE=0;
}
//--------------------------------------设置发送初始状态-------------------------------//
void SetTxMode(void)
{
TXEN=1;
TRX_CE=0;
delay(1); // nrf905_Delay for mode change(>=650us)
}


/*void read_disp(uchar com,uchar len)
{
    uchar i,temp;
CSN=0;       // Spi enable for write a spi command
SpiWrite(com);       // Write config command写放配置命令
for (i=0;i {      
  readRF[i]=SpiRead();   
}
CSN=1;     // Disable Spi
    for(i=0;i     {
  temp=readRF[i]>>4;
       P2=mazhi[temp];
  delay(60000);
  P2=mazhi[readRF[i]&0x0f];
  delay(60000); 
  
    }
} */




/*----------------------------------------------------------
         DS18B20温度采集模块
-----------------------------------------------------------*/
void DS18_delay(int useconds)//延时函数
 {
 int s;
 for (s=0; s }
uint reset()  
{      uchar flag;
        dq=0;  //复位程序
   DS18_delay(29); 
        dq=1;
   DS18_delay(3); 
flag=dq;
DS18_delay(25); 
return(flag);

uchar read() //读操作低位在前
{  uchar dat=0,i;
   for(i=0;i<8;i++)
       { dq=1;  
DS18_delay(1);    
     dq=0;
dat>>=1;
dq=1;
   if(dq)
dat|=0x80;
DS18_delay(4);
}
  return(dat);
}  
void write(uchar dat)  //写低位在前
{ uchar i;
    for(i=0;i<8;i++) 
{  dq=0;
  dq=dat&0x01; // 充当1us_nop_();
  DS18_delay(5);
  dq=1;
  dat>>=1;   
}
DS18_delay(4);
}
void disp(uchar lsb,uchar msb)
{   uchar result,sign,point; //p小数 s正负号,flag器件存在标志,i循环变量
    sign=(msb>>3)&0x01;  //取符号
lsb>>=4;
    msb<<=4;
result=lsb|msb;
point=(int)((float)(((~(lsb-=1))&0x0f)*0.625));
    if(sign==1)
{ result-=1;
 result=~result;
 result=result&0x7f; }
if(result>=0x64)
{zm2[5]=result/100+0x30;}  else zm2[5]=' ';
if(result>=0x0a)
{zm2[6]=(result/10)%10+0x30;} else zm2[6]=' ';
zm2[7]=result%10+0x30;
zm2[9]=point%10+0x30;
if(sign) zm2[4]='-';  else zm2[4]=' ';



void DS18B20()
{  uchar flag;
   flag=reset();
   if(!flag)
 { write(0xcc);    
write(0x44);
DS18_delay(125);
reset();
write(0xcc);
write(0xbe);
disp(read(),read());
 }
}


void main()
{
        nRF905Init();
      Config905(); 
//read_disp(0x10,10); 
        while(1)
{
   DS18B20();
    TxRxBuf[0]=zm2[6];
            TxRxBuf[1]=zm2[7];
            TxRxBuf[2]='.';
            TxRxBuf[3]=zm2[9];
   SetTxMode();
   TxPacket(TxRxBuf);        // 发送命令数据
        }
}


 //---------------接收模块-----------------//
 #include
 #include
 #include 
 #define uint unsigned int
 #define uchar unsigned char


 #define TxRxBuf_Len 4
 //---------发送数据缓冲区--------------//
 unsigned char Buf[TxRxBuf_Len];
 uchar code TxAddress[4]={0xcc,0xcc,0xcc,0xcc};
//---------------------------NRF905工作模式控制端口---------------------------------//
  sbit   TXEN=P1^0;
  sbit     PWR=P1^1;
  sbit   TRX_CE=P1^2;
  
//---------------------------------NRF905 SPI数据交换端口-------------------------------------//
  sbit     MOSI=P1^4;
  sbit   MISO=P1^5;
  sbit   CSN=P1^6;
  sbit   SCK=P1^7;
  
//----------------------------------------NRF905状态端口--------------------------------------//
   sbit   AM=P2^1;
   sbit   DR=P1^3;
   sbit   CD=P2^0;
//----------------------------------------NRF905控制指令---------------------------------
 #define  WC 0x00
 #define  RC 0x10
 #define  WTP 0x20
 #define  RTP 0x21
 #define  WTA 0x22
 #define  RTA 0x23
 #define  RRP 0x24
//------------------------------------------------NRF905寄存器配置----------------------
unsigned char idata RFConf[11]=
{
0x00,                             //配置命令:配置寄存器的首地址//
0x4c,                             //CH_NO,配置频段在430MHZ
0x0c,                            //输出功率为10db,不重发,节电为正常模式
0x44,                             //地址宽度设置,为4字节
0x04,0x04,                        //接收发送有效数据长度为4字节
0xe8,0xe7,0xe7,0xe7,              //接收地址
0xd8                              //CRC充许,8位CRC校验,外部时钟信号不使能,16M晶振
};


//---------------------NRF905延时函数-------------//
void delay(int n)
{
while(n--);
 
}
//===============================SPI读函数===================//
unsigned char SpiRead(void)
{
unsigned char j,DATA_BUF;
for (j=0;j<8;j++)
{
    SCK=1;
DATA_BUF=DATA_BUF<<1;
    DATA_BUF=DATA_BUF|MISO;  
    _nop_();
_nop_();
    SCK=0;
_nop_();
_nop_();
}
return DATA_BUF;
}
//================================SPI写函数=================//
void SpiWrite(unsigned char send)
{
unsigned char i,DATA_BUF;
DATA_BUF=send;
for (i=0;i<8;i++)
{
   SCK=0;
   _nop_();
_nop_();
if (DATA_BUF&0x80) //总是发送最高位
{
MOSI=1;
}
else
{
MOSI=0;
}
SCK=1;
DATA_BUF=DATA_BUF<<1;
   _nop_();
   _nop_();
}
SCK=0;
}
//------------------------------------------------------初始化NRF905----------------------------
void nRF905Init()
{
    CSN=1; // Spi disable
SCK=0; // Spi clock line init low
DR=1; // Init DR for input
AM=1; // Init AM for input
CD=1; // Init CD for input
PWR=1;    // nRF905 power on
TXEN=0;    // set radio in Rx mode
TRX_CE=0; // Set nRF905 in standby mode
}
//-----------------------------------------------------初始化配置寄存器-------------------------
void Config905()
{
uchar i;
CSN=0; // Spi enable for write a spi command
//SpiWrite(WC);    // Write config command写放配置命令
for (i=0;i<11;i++)    // Write configration words  写放配置字
{   
  SpiWrite(RFConf[i]);      
}
CSN=1; // Disable Spi
}


//----------------------------------------------------读NRF905接收数据-----------------------
void RxPacket()
{
uchar i;
TRX_CE=0; //待机模式
     CSN=0; // Spi enable for write a spi command
SpiWrite(RRP); //写读配置命令
     for (i=0;i<4;i++)

  
         Buf[i]=SpiRead(); // Read data and save to buffer       
    
 }
 CSN=1;
      delay(1);
}


//-----------------------------------------------设置接收初始化----------------------------
void SetRxMode()
{
TXEN=0;
TRX_CE=1;
delay(100); // nrf905_Delay for mode change(>=650us)
}


//--------------------------------------------------------数据接收---------------------------------
//1602液晶显示修改程序
sbit RS=P2^4;
sbit RW=P2^5;
sbit EN=P2^6;
uchar VOL[]="welcome to me!";
uchar table2[]="00.0v";
void delay_50us(uint t)
{
unsigned int j;
for(;t>0;t--)
for(j=19;j>0;j--);
}
void write_com(uchar com)
{
EN=0;
RS=0;
RW=0;
P0=com;
delay_50us(10);
EN=1;
delay_50us(20);
EN=0;
}
void write_data(uchar dat)
{
EN=0;
RS=1;
RW=0;
P0=dat;
delay_50us(10);
EN=1;
delay_50us(20);
EN=0;
}
void init_1602(void)
{
delay_50us(300);
write_com(0x38);
delay_50us(100);
write_com(0x38);
delay_50us(100);
write_com(0x38);
write_com(0x08);
write_com(0x01);
write_com(0x06);
write_com(0x0c);
}
/*void read_disp(uchar com,uchar len)
{
    uchar i,temp;
uchar readRF[10];
CSN=0;       // Spi enable for write a spi command
SpiWrite(com);       // Write config command写放配置命令
for (i=0;i {      
  readRF[i]=SpiRead();   
}
CSN=1;     // Disable Spi
write_com(0x80); 
    for(i=0;i     {
  temp=readRF[i]>>4;
  write_data(ascii[temp]); 
  write_data(ascii[readRF[i]&0x0f]);   
  
    }
} */
 
void main()
{  
    uchar m;
init_1602();
nRF905Init();
Config905();
//read_disp(0x10,10);
write_com(0x80);
  for(m=0;m<14;m++)
  {
      write_data(VOL[m]);                   
  }
        while(1)
{      
   SetRxMode();
while(!CD);
while(!AM); 
while(!DR);
RxPacket();
table2[0]=Buf[0];
                table2[1]=Buf[1];
                table2[2]=Buf[2];
                table2[3]=Buf[3];
//-------------------------------1602液晶显示--------------------------------------------------- 
               write_com(0x80+0x40);
  for(m=0;m<5;m++)
  {
      write_data(table2[m]);                   
  }
 }
 }












阅读(2300) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~