打印

请教 nRF905无线收发模块的编程

[复制链接]
1744|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
许世霞|  楼主 | 2007-12-24 18:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
编程应该注意哪些?这是无线收发模块的接收程序!我有点看不明白.能不能给我讲一讲这个接收的过程。尤其是StartUART();time0sym();这两个程序的作用不太清楚!好心人给我讲讲吧!十分感谢
#include <reg52.h>
#include <ABSACC.h>
#include <intrins.h>
#include <stdio.h>
#define uint unsigned int                     //0 ~ 255
#define uchar unsigned char
/////////////////
#define BYTE_BIT0    0x01
#define BYTE_BIT1    0x02
#define BYTE_BIT2    0x04
#define BYTE_BIT3    0x08
#define BYTE_BIT4    0x10
#define BYTE_BIT5    0x20
#define BYTE_BIT6    0x40
#define BYTE_BIT7    0x80
////////////////
#define WC        0x00
#define RC        0x10
#define WTP        0x20
#define RTP        0x21
#define WTA        0x22
#define RTA        0x23
#define RRP        0x24
bdata unsigned  char DATA_BUF;
#define DATA7    ((DATA_BUF&BYTE_BIT7) != 0)
#define DATA0   ((DATA_BUF&BYTE_BIT0) != 0)
sbit    flag    =DATA_BUF^7;
sbit    flag1    =DATA_BUF^0;
#define TxRxBuf_Len 4
unsigned char TxRxBuffer[TxRxBuf_Len];
char temp[4];
uint    count=1;
sbit    TXEN=P1^0;
sbit    TRX_CE=P3^2;
sbit    PWR=P1^1;
sbit    MISO=P1^6;
sbit    MOSI=P1^5;
sbit    SCK=P1^7;
sbit    CSN=P1^3;
/////////////////////////////////////////////////////
sbit    AM=P1^4;
sbit    DR=P3^3;
sbit    CD=P1^2;
///////////////////////////////////////////////////////

/////////////////////////////////////////////
sbit    led1=P2^1;
sbit    led0=P2^0;
sbit    led2=P2^2;
sbit    led3=P2^3;
/////////////////////////////////////////////////////
uchar seg[10]={0xC0,0xCF,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};         //0~~9段码
//uchar seg1[10]={0x02,0xf2,0x24,0x0c,0x98,0x48,0x40,0x1e,0x00,0x08};         //0~~9段码
//RF寄存器配置//
unsigned char idata RFConf[11]=
{
  0x00,                             //配置命令//
  0x4c,0x0c,0x44,0x04,0x04,0xcc,0xcc,0xcc,0xcc,0x58,                            //CRC充许,8位CRC校验,外部时钟信号不使能,16M晶振
};
bit lcdbit;
///////////80us延时/////////////////
void Delay(uchar n)
{
    uint k;
    while(n--)
    for(k=0;k<8;k++);
}
void delay1(uint i)
{
    for(;i>0;i--);   
}
///////////////
unsigned char SpiRead(void)
{
    unsigned char j;
    for (j=0;j<8;j++)
    {
        DATA_BUF=DATA_BUF<<1;
        SCK=1;
        if (MISO)    //读取最高位,保存至最末尾,通过左移位完成整个字节
        {
            DATA_BUF|=BYTE_BIT0;
        }
        else
        {
            DATA_BUF&=~BYTE_BIT0;
        }
        SCK=0;
     }
     return DATA_BUF;
}

void SpiWrite(unsigned char send)
{
    unsigned char i;
    DATA_BUF=send;
    for (i=0;i<8;i++)
    {
        if (DATA7)    //总是发送最高位
        {
            MOSI=1;
        }
        else
        {
            MOSI=0;
        }
        SCK=1;
        DATA_BUF=DATA_BUF<<1;
        SCK=0;
    }
}
////////////////初始化nRF905///////////////////
void nRF905Init(void)
{
    CSN=1;                        // Spi     disable
    SCK=0;                        // Spi clock line init low
    DR=0;                        // Init DR for input
    AM=0;                        // Init AM for input
    CD=0;                        // Init CD for input
    PWR=1;                    // nRF905 power on
    TRX_CE=0;                    // Set nRF905 in standby mode
    TXEN=0;                    // set radio in Rx mode
}
////////初始化寄存器
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);
    }
    CSN=1;                    // Disable Spi
}
void SetRxMode(void)
{
    TXEN=0;
    TRX_CE=1;
    Delay(1);                     // delay for mode change(>=650us)
}

unsigned char CheckDR(void)        //检查是否有新数据传入 Data Ready
{
    if (DR=1&&TRX_CE==1 && TXEN==0)
    {
       // Delay(50)  ;
        return 1;
    }
    else
    {
        return 0;
    }
}
void RxPacket(void)                            //读数据
{
    uchar i;
    Delay(1);
//    TRX_CE=0;                    // Set nRF905 in standby mode
    Delay(100);
    TRX_CE=0;
    CSN=0;                        // Spi enable for write a spi command
    Delay(1);
    SpiWrite(RRP);
  // Delay(10000);
   // Delay(10000);            // Read payload command
    for (i = 0 ;i < 4 ;i++)
    {      // Delay(10000);
          //   Delay(10000);
          //   Delay(10000);
         //    Delay(10000); 
        TxRxBuffer=SpiRead();        // Read data and save to buffer
           // Delay(10000);
            //    Delay(10000);
            //    Delay(10000);         
    }
    CSN=1;
          Delay(10);
        // Delay(10);
    TRX_CE=1;                            
}
////////////////
void  RX(void)
{
          SetRxMode();            // Set nRF905 in Rx mode
          //Delay(10000);
          while (CheckDR()==0);
         //Delay(10000);
        Delay(10);
            RxPacket();
         //Delay(10000);            // Recive data by nRF905
         Delay(10);
}
void StartUART( void )
{                              //波特率4800
     SCON = 0x50;
     TMOD = 0x20;
     TH1 = 0xFA;
     TL1 = 0xFA;
     PCON = 0x00;
     TR1 = 1;
}
void R_S_Byte(uchar R_Byte)
{    
     SBUF = R_Byte;  
     while( TI == 0 );                //查询法
       TI = 0;
     
}

void    time0sym()
{
        
        TH0=0xE2 ;                  //重载计数初始值
        TL0=0x00 ;
        TR0=1;
        ET0=1;
        EA=1;
        TF0=0 ;                    //清中断 

}
void time0_int()    interrupt 1
{

    if(TF0==1)                                 //10ms中断
    {
        TF0=0 ;                    //清中断 
        TH0=0xE2 ;                  //重载计数初始值
        TL0=0x00 ;
        count=count+1 ;
    if(count==100)                          //1s
        {    
        count=0;                        //每1秒清count ,重新开始等待1秒    
        }
    }
}
void main(void)
{
           //char i;
        StartUART();
        time0sym();
        nRF905Init();
         Config905();
    P0=0x00;
    while(1)
    {
        RX();
        Delay(10);
        CSN=0;     
if(TxRxBuffer[0])
{    
        if(TxRxBuffer[0]==0x29)
        {
    //    R_S_Byte(TxRxBuffer[0]);     
    P0=seg[1];
            led0=1;led1=1;led2=1;led3=0;
            delay1(50);
            //led0=1;led1=1;led2=1;led3=1;
        }
    
          if(TxRxBuffer[0]==0x30)
         {
    //         P0=0x00;
         //    R_S_Byte(TxRxBuffer[0]);   
                P0=seg[2];
            led0=1;led1=1;led2=0;led3=1;
            delay1(50);
        //    led0=1;led1=1;led2=1;led3=1;
                }
}
}
        CSN=1;
        Delay(1);
}

相关帖子

沙发
许世霞|  楼主 | 2007-12-26 21:21 | 只看该作者

前辈给我留下点痕迹吧!谢谢了

使用特权

评论回复
板凳
gaobc| | 2007-12-27 16:55 | 只看该作者

StartUART配置串口,time0sym配置定时器

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

439

主题

3781

帖子

4

粉丝