经过dt的两天睡不好,玩不好的日子,终于把nrf24l01这个看着dt,做起来也dt的东西搞定了。幸亏有一点好的,就是资料还算是多的。看了两天的资料,调试了两天后终于在这个阳光明媚的下午实验成功。这两天可是一句dota都没有玩。为了庆祝一下,确定成功后马上玩了一把开心版的。
做好这个东西的最起码具备两方面的能力,一个就是写过液晶程序,而且深入理解。第二就是理解单片机之间的串口通信。写过这两方面程序的同学可能会对这个程序好理解一点。我这个代码大部分也是从资料上抄过来的,经过理解才能最终实现的,所以不要幻想有哪个代码一放进单片机就能运行。
这个代码分两部分,一个是.c的主函数,一个是.h的宏定义函数。那个宏定义函数几乎算是一个固定的函数,所以不会太多的改动,只是改动一下几个I/O就行了。
这个发送代码只是发送了一个循环左移的数据。
#include <reg51.h>
#include <api_t.h>
#define uchar unsigned char
/***************************************************/
#define TX_ADR_WIDTH 5 // 5字节宽度的发送/接收地址
#define TX_PLOAD_WIDTH 4 // 数据通道有效数据宽度
#define LED P1
uchar code TX_ADDRESS[TX_ADR_WIDTH] = {0x34,0x43,0x10,0x10,0x01}; // 定义一个静态发送地址
uchar RX_BUF[TX_PLOAD_WIDTH];
uchar TX_BUF[TX_PLOAD_WIDTH];
uchar flag;
uchar DATA = 0x01;
uchar bdata sta;
sbit RX_DR = sta^6;
sbit TX_DS = sta^5;
sbit MAX_RT = sta^4;
sbit key=P2^0;
sbit wela=P2^6;
sbit dula=P2^7;
/**************************************************/
/**************************************************
函数: init_io()
描述:
初始化IO
/**************************************************/
void init_io(void)
{
CE = 0; // 待机
CSN = 1; // SPI禁止
SCK = 0; // SPI时钟置低
IRQ = 1; // 中断复位
LED = 0xff; // 关闭指示灯
}
/**************************************************/
/**************************************************
函数:delay_ms()
描述:
延迟x毫秒
/**************************************************/
void delay_ms(uchar x)
{
uchar i, j;
i = 0;
for(i=0; i<x; i++)
{
j = 250;
while(--j);
j = 250;
while(--j);
}
}
/**************************************************/
/**************************************************
函数:SPI_RW()
描述:
根据SPI协议,写一字节数据到nRF24L01,同时从nRF24L01
读出一字节
/**************************************************/
uchar SPI_RW(uchar byte)
{
uchar i;
for(i=0; i<8; i++) // 循环8次
{
MOSI = (byte & 0x80); //