#include ".\\nRF24L01\\nRF24L01.h"
#include "def.h"
#define uint unsigned int
#define TX_PLOAD_WIDTH 20 // 20字节TX有效载荷
#define RX_PLOAD_WIDTH 20 // 20字节TX有效载荷
sbit n=P2^1; //定义光电对管的输出端口
sbit RS = P1^0;
sbit RW = P1^1;
sbit EN = P2^5;
sbit DU = P2^6;
uint g,s,b,q,w;
uint const TX_ADDRESS[TX_ADR_WIDTH]= {0x34,0x43,0x10,0x10,0x01}; //本地地址
uint const RX_ADDRESS[RX_ADR_WIDTH]={0x34,0x43,0x10,0x10,0x01}; //接收地址
uchar bdata sta;
sbit RX_DR =sta^6;
sbit TX_DS =sta^5;
sbit MAX_RT =sta^4;
void delay(uint k)
{
uint a,j;
for(a=0;a<k;a++)
for(j=0;j<121;j++);
}
void inerDelay_us(unsigned char n)
{
for(;n>0;n--)
_nop_();
}
void init_NRF24L01(void)
{
inerDelay_us(100);
CE=0;
CSN=1;
SCK=0;
SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH); // 写本地地址
SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, RX_ADDRESS, RX_ADR_WIDTH); // 写接收端地址
SPI_RW_Reg(WRITE_REG + EN_AA, 0x01); // 频道0自动ACK应答允许
SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01); //允许接收地址只有频道0
SPI_RW_Reg(WRITE_REG + RF_CH, 0); //设置信道工作为2.4GHZ,收发一致
SPI_RW_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH);
//设置接收数据长度,本次设置为4字节
SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07);
//设置发射速率为1Mkbps,发射功率为最大值0dB
}
uchar SPI_RW(uint uchar)
{
uint bit_ctr;
for(bit_ctr=0;bit_ctr<8;bit_ctr++) // output 8-bit
{
MOSI = (uchar & 0x80); //输出 'uchar'到 MOSI
uchar = (uchar << 1);
SCK = 1;
uchar |= MISO;
SCK = 0;
}
return(uchar); //返回uchar
}
uchar SPI_Read(uchar reg)
{
uchar reg_val;
CSN = 0; // 置低CSN, 激活 SPI通信
SPI_RW(reg); // 选择寄存器
reg_val = SPI_RW(0); // 读取寄存器数值
CSN = 1; //置高CSN,终止SPI通信
return(reg_val); // 返回值
}
uchar SPI_RW_Reg(uchar reg, uchar value)
{
uint status;
CSN = 0; // CSN 拉低,激活SPI
status = SPI_RW(reg); // 选择寄存器
SPI_RW(value); //写入数值..
CSN = 1; // 置高CSN
return(status); // 返回模块状态
}
uchar SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars)
{
uint status,uchar_ctr;
CSN = 0;
status = SPI_RW(reg);
for(uchar_ctr=0;uchar_ctr<uchars;uchar_ctr++)
pBuf[uchar_ctr] = SPI_RW(0);
CSN = 1;
return(status);
}
uchar SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars)
{
uint status,uchar_ctr;
CSN = 0; //SPI使能
status = SPI_RW(reg);
for(uchar_ctr=0; uchar_ctr<uchars; uchar_ctr++)
SPI_RW(*pBuf++);
CSN = 1; //关闭SPI
return(status);
}
void SetRX_Mode(void)
{
CE=0;
SPI_RW_Reg(WRITE_REG + CONFIG, 0x0f); // IRQ收发完成中断响应
CE = 1;
inerDelay_us(130);
}
unsigned char nRF24L01_RxPacket(unsigned char* rx_buf)
{
unsigned char revale=0;
sta=SPI_Read(STATUS); // 读取状态寄存其来判断数据接收状况
if(RX_DR) // 判断是否接收到数据
{
CE = 0; //SPI使能
SPI_Read_Buf(RD_RX_PLOAD,rx_buf,TX_PLOAD_WIDTH);
revale =1; //读取数据完成标志
}
SPI_RW_Reg(WRITE_REG+STATUS,sta);
//接收到数据后RX_DR,TX_DS,MAX_PT都置高为1,通过写1来清楚中断标志
return revale;
}
void nRF24L01_TxPacket(unsigned char * tx_buf)
{
CE=0; //StandBy I模式
SPI_Write_Buf(WRITE_REG+RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH);
// 装载接收端地址
SPI_Write_Buf(WR_TX_PLOAD, tx_buf, TX_PLOAD_WIDTH);
// 装载数据
SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e);
// IRQ收发完成中断响应,16位CRC,主发送
CE=1; //置高CE,激发数据发送
inerDelay_us(10);
}
bit LCD_Check_Busy(void)
{
P0= 0xFF;
RS=0;
RW=1;
delay(5);
EN=0;
delay(5);
EN=1;
return (bit)(P0 & 0x80);
}
void LCD_Write_Com(uchar com)
{
while(LCD_Check_Busy());
P0= com;
RS=0;
RW=0;
delay(5);
EN=1;
delay(5);
EN=0;
}
void LCD_Write_Data(uchar Data)
{
while(LCD_Check_Busy());
P0= Data;
RS=1;
RW=0;
delay(5);
EN=1;
delay(5);
EN=0;
}
void LCD_Init(void)
{
LCD_Write_Com(0x38);
LCD_Write_Com(0x08);
LCD_Write_Com(0x01);
LCD_Write_Com(0x06);
LCD_Write_Com(0x0C);
}
void display(unsigned long int n,uchar address)
{
g=n%10;
s=n%100%10;
b=n/100%10;
q=n/1000%10;
w=n/10000%10;
//sw=n/100000%10;
LCD_Write_Com(0x80 + address);
LCD_Write_Data('T');
LCD_Write_Data('/');
LCD_Write_Data(w+48);
//LCD_Write_Data(q+48);
LCD_Write_Data(46);
LCD_Write_Data(q+48);
LCD_Write_Data(b+48);
LCD_Write_Data(s+48);
LCD_Write_Data(g+48);
}
unsigned long int i;//z;
uint m=0;//,t;
void main()
{
unsigned char TxBuf[20]={0};
unsigned char RxBuf[20]={0};
DU=1;
P0=0X00;
DU=0;
TMOD=0x01;
TH0=(65536-100)/256;
TL0=(65536-100)%256;
ET0=1;
EA=1;
LCD_Init();
init_NRF24L01();
while(1)
{
if(n==0)
{
delay(5);
while(!n); //记得分号
{
TR0=1;
m++;
if(m>11)
{
TR0=0;
delay(100);
TxBuf[0]=g;
TxBuf[1]=s;
TxBuf[2]=b;
TxBuf[3]=q;
TxBuf[4]=w;
//TxBuf[5]=sw;
delay(100);
nRF24L01_TxPacket(TxBuf); // Transmit Tx buffer data
SPI_RW_Reg(WRITE_REG+STATUS,0XFF);
delay(1000);
TxBuf[0]=0;
TxBuf[1]=0;
TxBuf[2]=0;
TxBuf[3]=0;
TxBuf[4]=0;
//TxBuf[5]=0;
//i=0;
while(1)
{EA=0; }
}
display(i+15872,0x00);
}
}
}
}
void t1_i() interrupt 1
{
TH0=(65536-100)/256;
TL0=(65536-100)%256;
i++;
}
|