用89C51驱动nRf905收发C源代码

发布者:RadiantEyes最新更新时间:2015-05-15 来源: 51hei关键字:89C51  nRf905  收发 手机看文章 扫描二维码
随时随地手机看文章
#include    
#include    
   
#define uchar unsigned char    
#define uint  unsigned int   
   
#define WC      0x00            // Write configuration register command   
#define RC      0x10            // Read  configuration register command   
#define WTP     0x20            // Write TX Payload  command   
#define RTP     0x21            // Read  TX Payload  command   
#define WTA     0x22            // Write TX Address  command   
#define RTA     0x23            // Read  TX Address  command   
#define RRP     0x24            // Read  RX Payload  command   
/*******************************************************************************************/   
typedef struct RFConfig   
{   
    uchar n;   
    uchar buf[10];   
}RFConfig;   
   
code RFConfig RxTxConf =   
{   
    10,   
    0x01, 0x0c, 0x44, 0x20, 0x20, 0xcc, 0xcc, 0xcc,0xcc, 0x58      
};   
// The content of this struct is nRF905's initialize data.   
// CH_NO=1;433MHZ;Normal Opration,No Retrans;RX,TX Address is 4 Bytes   
// RX TX Payload Width is 32 Bytes;Disable Extern Clock;Fosc=16MHZ   
// 8 Bits CRC And enable   
/*******************************************************************************************/   
uchar data TxBuf[32];   
uchar data RxBuf[32];   
/*******************************************************************************************/   
uchar bdata DATA_BUF;   
sbit    flag    =DATA_BUF^7;   
sbit    flag1   =DATA_BUF^0;   
/*******************************************************************************************/   
sbit    TX_EN   =P2^6;   
sbit    TRX_CE  =P2^5;   
sbit    PWR_UP  =P2^4;   
sbit    MISO    =P2^3;   
sbit    MOSI    =P2^2;   
sbit    SCK     =P2^1;   
sbit    CSN     =P2^0;   
   
sbit    AM      =P3^2;   
sbit    DR      =P3^3;   
sbit    CD      =P3^5;   
   
/*******************************************************************************************/   
void InitIO(void);              // Initialize IO port   
void Inituart(void);            // initialize 232 uart   
void Config905(void);           // Config nRF905 module   
void SetTxMode(void);           // Set nRF905 in Tx mode   
void SetRxMode(void);           // Set nRF905 in Rx mode   
void TxPacket(void);            // Send data by nRF905   
void RxPacket(void);            // Recive data by nRF905   
void SpiWrite(uchar);           // Write data to nRF905   
uchar SpiRead(void);            // Read data to nRF905   
void Delay(uchar n);            // Delay 100us   
void Scankey(void);             // Scan key   
void TxData (uchar x);          // Send key_value to CRT display   
/*******************************************************************************************/   
//function main();   
/*******************************************************************************************/   
void main(void)   
{      
    InitIO();                   // Initialize IO port   
    Inituart();                 // initialize 232 uart   
    Config905();                // Config nRF905 module   
    SetTxMode();                // Set Tx Mode   
    TxPacket();                 // Transmit Tx buffer data   
    Delay(500);                 // delay for led light     
    P0=0xff;                    // led close   
    SetRxMode();                // Set nRF905 in Rx mode   
    while(1)                    // circulation   
    {      
        Scankey();              // Scan key   
        if (DR)                 // If recive data ready...    
            RxPacket();         // ... recive data   
    }      
}   
/*******************************************************************************************/   
//function InitIO();   
/*******************************************************************************************/   
void InitIO(void)   
{   
    P0=0x0f;                    // led light   
    CSN=1;                      // Spi  disable                        
    SCK=0;                      // Spi clock line init high   
    DR=1;                       // Init DR for input   
    AM=1;                       // Init AM for input   
    PWR_UP=1;                   // nRF905 power on   
    TRX_CE=0;                   // Set nRF905 in standby mode   
    TX_EN=0;                    // set radio in Rx mode    
}   
/*******************************************************************************************/   
//function Inituart();   
/*******************************************************************************************/   
void Inituart(void)   
{   
    TMOD = 0x20;                //timer1 working mode 1   
    TL1 = 0xfd;                 //f7=9600 for 16mhz Fosc,and ...    
    TH1 = 0xfd;                 //...fd=19200 for 11.0592mhz Fosc   
    SCON = 0xd8;                //uart mode 3,ren==1   
    PCON = 0x80;                //smod=0   
    TR1 = 1;                    //start timer1   
}   
/*******************************************************************************************/   
//function Config905();   
/*******************************************************************************************/   
void Config905(void)   
{   
    uchar i;                       
    CSN=0;                      // Spi enable for write a spi command   
    SpiWrite(WC);               // Write config command   
    for (i=0;i     {   
        SpiWrite(RxTxConf.buf[i]);   
    }   
    CSN=1;                      // Disable Spi   
}   
/*******************************************************************************************/   
//function Delay100us();Delay 100us   
/*******************************************************************************************/   
void Delay(uchar n)   
{   
    uint i;   
    while(n--)   
    for(i=0;i<80;i++);      
}   [page]
/*******************************************************************************************/   
//function SpiWrite();   
/*******************************************************************************************/   
void SpiWrite(uchar  byte)   
{   
    uchar i;       
    DATA_BUF=byte;              // Put function's parameter into a bdata variable          
    for (i=0;i<8;i++)            // Setup byte circulation bits   
    {      
           
        if (flag)               // Put DATA_BUF.7 on data line   
            MOSI=1;   
        else   
            MOSI=0;   
        SCK=1;                  // Set clock line high   
        DATA_BUF=DATA_BUF<<1; // Shift DATA_BUF   
        SCK=0;                  // Set clock line low    
    }      
}   
/*******************************************************************************************/   
//function SpiRead();   
/*******************************************************************************************/   
uchar SpiRead(void)   
{   
    uchar i;       
    for (i=0;i<8;i++)            // Setup byte circulation bits   
    {      
        DATA_BUF=DATA_BUF<<1; // Right shift DATA_BUF   
        SCK=1;                  // Set clock line high   
        if (MISO)   
            flag1=1;            // Read data   
        else   
            flag1=0;   
                               
           
        SCK=0;                  // Set clock line low   
    }   
    return DATA_BUF;            // Return function parameter   
}   
/*******************************************************************************************/   
//function TxPacket();   
/*******************************************************************************************/   
void TxPacket(void)   
{   
    uchar i;   
    //Config905();                 
    CSN=0;                      // Spi enable for write a spi command      
    SpiWrite(WTP);              // Write payload command   
    for (i=0;i<32;i++)   
    {   
        SpiWrite(TxBuf[i]);     // Write 32 bytes Tx data   
    }   
    CSN=1;                      // Spi disable                         
    Delay(1);   
    CSN=0;                      // Spi enable for write a spi command      
    SpiWrite(WTA);              // Write address command   
    for (i=0;i<4;i++)            // Write 4 bytes address   
    {   
        SpiWrite(RxTxConf.buf[i+5]);   
    }      
    CSN=1;                      // Spi disable   
    TRX_CE=1;                   // Set TRX_CE high,start Tx data transmission   
    Delay(1);                   // while (DR!=1);   
    TRX_CE=0;                   // Set TRX_CE low   
}   
/*******************************************************************************************/   
//function RxPacket();   
/*******************************************************************************************/   
void RxPacket(void)   
{   
    uchar i,xx;    
    TRX_CE=0;                   // Set nRF905 in standby mode      
    CSN=0;                      // Spi enable for write a spi command   
    SpiWrite(RRP);              // Read payload command    
    for (i=0;i<32;i++)   
    {   
        RxBuf[i]=SpiRead();     // Read data and save to buffer        
    }   
    CSN=1;                      // Disable spi   
    while(DR||AM);     
    P0= RxBuf[0];               // Buffer[0] output from P0 port...   
    TRX_CE=1;   
    xx=(RxBuf[0]>>4)&0x0f;   
    TxData(xx);   
    Delay(500);                 // ...light led   
    P0=0xff;                    // Close led                                   
}   
/*******************************************************************************************/   
//function SetTxMode();   
/*******************************************************************************************/   
void SetTxMode(void)                   
{      
    TX_EN=1;   
    TRX_CE=0;   
    Delay(1);                   // delay for mode change(>=650us)   
}                  
/*******************************************************************************************/   
//function SetRxMode();   
/*******************************************************************************************/   
void SetRxMode(void)   
{   
    TX_EN=0;   
    TRX_CE=1;   
    Delay(1);                   // delay for mode change(>=650us)                   
}   
/*******************************************************************************************/   
//Functon Scankey();   
/*******************************************************************************************/      
void Scankey()   
{   
    uchar Temp,xx;   
    P0=0xff;   
    Temp=P0&0x0f;               // Read key value from port P0   
    if (Temp!=0x0f)   
    {   Delay(10);   
        Temp=P0&0x0f;               // Read key value from port P0   
        if (Temp!=0x0f)   
        {   
            xx=Temp;       
            Temp=Temp<<4;     // Left shift 4 bits       
            TxBuf[0]=Temp;      // Turn On the LED   
            P0=Temp;            // Save to Tx buffer[0]   
            SetTxMode();        // Set Tx Mode   
            TxPacket();         // Transmit Tx buffer data   
            TxData (xx);   
            Delay(500);         // Delay for LED light             
            P0=0xff;            // Close LED display   
            SetRxMode();        // Set Rx Mode   
               
            while((P0&0x0f)!=0x0f);   
         }   
    }   
}   
/*******************************************************************************************/   
//Function TxData ();   
/*******************************************************************************************/   
void TxData (uchar x)   
{   
    SBUF=x;    
    while(TI==0);   
        TI=0;   
   
}   
/*******************************************************************************************/  
关键字:89C51  nRf905  收发 引用地址:用89C51驱动nRf905收发C源代码

上一篇:51单片机驱动ads774汇编程序
下一篇:基于stc51单片机的PS\2键盘通信程序

推荐阅读最新更新时间:2024-03-16 14:02

ADI公司的多功能50 Mbps RS-485收发器系列在恶劣环境下保护通信
中国,北京 — Analog Devices, Inc.(ADI)今天宣布推出两款50 Mbps RS-485/RS-422收发器,适合在各种恶劣环境下使用,包括工业自动化、电机控制和航空电子行业。ADM3065E和ADM3066E收发器将IEC61000-4-2第4级静电放电(ESD)保护和高速数据通信结合在一起,支持1.8 VIO逻辑 (ADM3066E),可在工业温度范围内工作,并采用节省空间的封装。这些特性提供了设计灵活性,同时简化了标准RS-485通信链路的实施,改进了性能。与HBM(人体模型)静电放电相比,系统级IEC静电放电具有很高的放电水平,其峰值电流和电压远高于前者。ADM306xE的IEC静电放电水平保护为在工
[网络通信]
ADI公司的多功能50 Mbps RS-485<font color='red'>收发</font>器系列在恶劣环境下保护通信
单片机串口收发程序分享
/* ,把发送的数据接收后用P1口的LED灯以二进制的形式显示 并且蜂鸣器发出提示音,再把接收的数据加1并发出。 使用STC ISP软件界面上的串口助手,选择对应的串口号, 设置波特率为9600,选择HEX模式发送和接收 */ #include reg52.h #define uchar unsigned char #define uint unsigned int sbit beep = P2^3;//蜂鸣器接口 uchar num;//发送暂存变量 void delay(uint z) { uint x,y; for(x = z; x 0; x--) for(y = 114; y
[单片机]
利用电荷泵为高速CAN收发器供电
在过去的数十年中,从汽车工业的发展趋势看,汽车制造对于舒适度、效率、环境友好性的要求不断提升,对于性能和汽车安全性的期望值也不断提高。在这一趋势的带动下,汽车中的电子子系统以及连接这些子系统的配线的数量大幅增加。线缆的增多导致汽车重量增加,当然也增加了成本。不过,在八十年代初期,Bosch公司推出了CAN总线网络,这种总线网络有效降低了线路连接的复杂度,减轻了线缆重量并节省了成本,因而被广泛用于汽车工业。   汽车制造从集中控制系统到分布式控制系统的转变有助于汽车厂商达到降低汽车重量和成本的目标。集中控制系统通过大量线缆将所有执行装置、传感器以及开关连接到控制系统,而分布式管理系统将电子控制单元(ECU)放置在需要控制的位置,
[电源管理]
利用电荷泵为高速CAN<font color='red'>收发</font>器供电
三星携手环球卫星公司 共同演示8K卫星广播收发
三星电子携手环球卫星公司,于15日(当地时间)在卢森堡成功进行欧洲首次8K卫星广播收发演示,享受8K节目的时代已经不远。 据韩媒《fnnews》报导,该演示通过环球卫星公司网络传送8K影像,并通过三星的QLED 8K电视接收并播放。值得注意的是,这次的演示并没有额外安装8K广播设备。三星对此解释,运用原本的卫星发送装置、收信号的碟型天线以及QLED 8K电视内建的接收器进行演示,格外具有意义。 三星QLED 8K电视内建的接收器是支持HD、4K UHD广播放送的DVB-S2规格。三星电子认为,未来正式建立8K广播设备时,这样的方式能够大幅减少建设费用。 另一方面,三星电子和环球卫星为能传送8K影像,以高
[手机便携]
浅谈WiFi收发器的电源和接地设计的原则
1 电源布线和电源旁路的基本原则 设计RF电路时,电源电路的设计和电路板布局常常被留到高频信号通路的设计完成之后。对于没有经过深思熟虑的设计,电路周围的电源电压很容易产生错误的输出和噪声,从而对RF电路的系统性能产生负面影响。合理分配PCB的板层、采用星形拓扑的VCC引线,并在VCC引脚加上适当的去耦电容,将有助于改善系统的性能,获得最佳指标。合理的PCB层分配便于简化后续的布线处理,对于一个四层PCB(WLAN中常用的电路板),在大多数应用中用电路板的顶层放置元器件和RF引线,第二层作为系统地,电源部分放置在第三层,任何信号线都可以分布在第四层。第二层采用不受干扰的地平面布局对于建立阻抗受控的RF信号通路非常必要,还便于获得尽可能
[电源管理]
浅谈WiFi<font color='red'>收发</font>器的电源和接地设计的原则
MICRF005无线收发器的原理和应用
摘要:MICRF005芯片是Micrel公司生产的一种高速无线UHF收发器是一款单芯片OOK收发器,可用于远距离低功率无线设备中单向和双向无线连接。MICRF005采用“天线输入,数据输出”工作方式,所有RF和IF调谐均可在集成电路内自动完成,因此具有很高的可靠性和极低的功耗。文中介绍了MICRF005的主要特点、结构原理和引脚功能,最后给出了它的应用电路。 关键词:MICRF005;无线收发器;UHF下变频器;OOK解调器 1 MICRF005的主要特点 MICRF005芯片是Micrel公司生产的一种无线收发器,该收发器带有一个发送/接收开关和一个用于占空比操作的关断模式可广泛应用于低功率设备的单向和双向无线连接。
[网络通信]
车规级SIT1043Q低功耗CAN收发器特点及典型应用
一SIT1043Q车载CAN收发器特点 SIT1043Q属于芯力特公司的第三代高速CAN FD收发器,目前已经通过第三方AEC-Q100认证、德国益驰CAN通信一致性测试、德国C&S兼容性测试。相比第一代基础SIT1040Q和第二代CAN FD SIT1042Q CAN收发器,此芯片引脚更多功能更全。SIT1043Q在实现基本CAN收发器功能的同时,增强了电磁兼容性(EMC)性能,并引出SPLIT引脚稳定总线信号共模输出,支持与电压为3V至5V的MCUTXD&RXD电平适配。除此之外,同时还具有的高级功能包括: ❶支持通过INH引脚使能关断整个节点电源,只保留SIT1043Q CAN收发器待机工作实 现节点功耗最低;❷支持5种工作
[嵌入式]
车规级SIT1043Q低功耗CAN<font color='red'>收发</font>器特点及典型应用
三层交换机处理器收发包相关问题分析
在当前的三层以太网交换设备中,报文的二层交换和三层路由主要由交换芯片和网络处理器完成,CPU基本上不参与交换和路由过程,主要完成管理和控制交换芯片的功能 。 在这种情况下,CPU的负载主要来自以下几个方面:协议的定时驱动、用户的配置驱动、外部事件的驱动。其中,外部事件的驱动最为随机,无法预料。典型的外部事件包括端口的连接/断开(Up/Down),媒体访问控制(MAC)地址消息的上报(包括学习、老化、迁移等),CPU通过直接存储器存取(DMA)收到包,CPU通过DMA发包等。 在以上所列的外部事件中,又以CPU通过DMA收到包之后的处理最为复杂。因为数据包由低层上送到上层软件时,各协议的处理动作千差万别,可能会涉及到发包、端口操作、
[网络通信]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
  • 学习ARM开发(16)
    ARM有很多东西要学习,那么中断,就肯定是需要学习的东西。自从CPU引入中断以来,才真正地进入多任务系统工作,并且大大提高了工作效率。采 ...
  • 学习ARM开发(17)
    因为嵌入式系统里全部要使用中断的,那么我的S3C44B0怎么样中断流程呢?那我就需要了解整个流程了。要深入了解,最好的方法,就是去写程序 ...
  • 学习ARM开发(18)
    上一次已经了解ARM的中断处理过程,并且可以设置中断函数,那么它这样就可以工作了吗?答案是否定的。因为S3C44B0还有好几个寄存器是控制中 ...
  • 嵌入式系统调试仿真工具
    嵌入式硬件系统设计出来后就要进行调试,不管是硬件调试还是软件调试或者程序固化,都需要用到调试仿真工具。 随着处理器新品种、新 ...
  • 最近困扰在心中的一个小疑问终于解惑了~~
    最近在驱动方面一直在概念上不能很好的理解 有时候结合别人写的一点usb的例子能有点感觉,但是因为arm体系里面没有像单片机那样直接讲解引脚 ...
  • 学习ARM开发(1)
  • 学习ARM开发(2)
  • 学习ARM开发(4)
  • 学习ARM开发(6)
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved