📄 main.c
字号:
/*这份代码经源码格式软件格式化过
yang_hx@neusoft.com */
#include <STC89C51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define WC 0x00
// 写配置寄存器
#define RC 0x10
// 读配置寄存器
#define WTP 0x20
// 向 TX Payload 发送有效数据
#define RTP 0x21
// 向 TX Payload 接受有效数据
#define WTA 0x22
// 向TX Address 写入发送地址
#define RTA 0x23
// 向 TX Address 读出要发送的地址
#define RRP 0x24
// 从 RX Payload 读取有效数据
/*******************************************************************************************/
typedef struct RFConfig
{
uchar n ;
uchar buf[10];
}
RFConfig ;
code RFConfig RxTxConf=
{
10,
0x4c,0x0c,0x44,0x20,0x20,0xcc,0xcc,0xcc,0xcc,0x58
}
;
uchar data TxBuf[5]=
{
0x01,0x02
}
;
//uchar data RxBuf[32];
/*******************************************************************************************/
uchar bdata DATA_BUF ;
sbit flag=DATA_BUF^7 ;
sbit flag1=DATA_BUF^0 ;
/*******************************************************************************************/
sbit TX_EN=P3^5 ;
sbit TRX_CE=P3^4 ;
sbit PWR_UP=P1^7 ;
sbit MISO=P1^3 ;
sbit MOSI=P1^2 ;
sbit SCK=P1^1 ;
sbit CSN=P1^0 ;
sbit AM=P1^5 ;
sbit DR=P1^4 ;
sbit CD=P1^6 ;
sbit K=P3^2 ;
sbit LED=P2^7 ;
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 SpiWrite(uchar);
// Write data to nRF905
void Delay(uchar n);
// Delay 100us
///当前按纽设置
void ID(void)
{
unsigned char temp;
unsigned char jk ;
P2=0XFF ;
Delay(1);
temp=P2 ;
for(jk=10;jk>0;jk--)
{
if(P2!=temp) jk=10;
if((temp&0x1f)==0x00) jk=10 ;
}
P2=temp ;
//写回数据,保证IO口不耗电
temp&=0x1f ;
//保留底5位
//temp=0x01;
TxBuf[2]=temp ;
TxBuf[3]=temp ;
TxBuf[4]=temp ;
//保存入发射缓冲
WDT_CONTR=0x3a ;
//看门狗 262ms
}
void irq0_str(void)
{
EX0=1 ;
EA=1 ;
}
//S1有效 ,P32
void irq_ex(void)interrupt 0
{
unsigned char mm=20 ;
// ID();
while(mm--)
{
if(K==1)
{
return ;
}
Delay(1);
}
PWR_UP=1 ;
// nRF905 power on
SetRxMode();
Delay(10);
while(CD==1);
Delay(10);
LED=0 ;
SetTxMode();
// Set Tx Mode
TxPacket();
Delay(10);
// Transmit Tx buffer data // Scan key
while(K==0)
{
SetRxMode();
Delay(10);
while(CD==1);
Delay(10);
SetTxMode();
// Set Tx Mode
TxPacket();
Delay(10);
// Transmit Tx buffer data // Scan key
WDT_CONTR=0x3a ;
//看门狗 262ms
}
// WDT_CONTR=0x38 ;
// while(1);
}
void main(void)
{
InitIO();
// Initialize IO port
TxBuf[0]=0x01 ;
TxBuf[1]=0x02 ;
Config905();
// Config nRF905 module
SetTxMode();
// Set Tx Mode
TxPacket();
// Transmit Tx buffer data
Delay(500);
// delay for led light
// SetRxMode(); // Set nRF905 in Rx mode
//////////////////////以上为905初始化完毕//////////////////////////////////////////
irq0_str();
// circulation
while(1)
{
// PWR_UP=0 ;
// nRF905 power OFF
WDT_CONTR=0x3a ;
//看门狗 262ms
ID();
// LED=1 ;
// PCON=0X02 ;
//mcu poeer off QQQQQQQQQQQQQQQQQQQQQQ
SetRxMode();
Delay(60);
while(CD==1) LED=0;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
}
/*******************************************************************************************/
//function InitIO();
/*******************************************************************************************/
void InitIO(void)
{
CSN=1 ;
// 关闭SPI
SCK=0 ;
// Spi 空闲状态为0
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 Config905();
/*******************************************************************************************/
void Config905(void)
{
uchar i ;
CSN=0 ;
// SPI开始
SpiWrite(WC);
// 写配置积存器命令
// 写入配置数据
for(i=0;i<RxTxConf.n;i++)
{
SpiWrite(RxTxConf.buf[i]);
}
CSN=1 ;
// 关闭SPI
}
/*******************************************************************************************/
//function Delay100us();Delay 100us
/*******************************************************************************************/
void Delay(uchar n)
{
uint i ;
while(n--)
for(i=0;i<20;i++)
WDT_CONTR=0x3a ;
//看门狗 262ms
}
/*******************************************************************************************/
//function SpiWrite();
/*******************************************************************************************/
void SpiWrite(uchar byte)
{
uchar i ;
DATA_BUF=byte ;
// Put function's parameter into a bdata variable
// Setup byte circulation bits
for(i=0;i<8;i++)
{
// Delay(1);
// Put DATA_BUF.7 on data line
if(flag)MOSI=1 ;
else
MOSI=0 ;
// Delay(1);
SCK=1 ;
// Delay(1); // Set clock line high
DATA_BUF=DATA_BUF<<1 ;
// Shift DATA_BUF
//Delay(1);
SCK=0 ;
// Set clock line low
// Delay(1);
}
}
/*******************************************************************************************/
//function SpiRead();
/*******************************************************************************************/
//function TxPacket();
/*******************************************************************************************/
void TxPacket(void)
{
uchar i ;
//Config905();
CSN=0 ;
// 打开SPI
SpiWrite(WTP);
// 写有效数据命令
for(i=0;i<5;i++)
{
SpiWrite(TxBuf[i]);
// 写入32个数据
}
CSN=1 ;
// 关闭SPI
Delay(1);
CSN=0 ;
// 打开SPI
SpiWrite(WTA);
// 写目的地址命令
// 写入4个地址
for(i=0;i<4;i++)
{
SpiWrite(RxTxConf.buf[i+5]);
}
CSN=1 ;
// 关闭SPI
TRX_CE=1 ;
TRX_CE=1 ;
// 启动发送
Delay(1);
// while (DR!=1);
TRX_CE=0 ;
// 发送完毕
}
/*******************************************************************************************/
//function RxPacket();
/*******************************************************************************************/
//function SetTxMode();
/*******************************************************************************************/
void SetTxMode(void)
{
TX_EN=1 ;
TRX_CE=0 ;
Delay(50);
// delay for mode change(>=650us)
}
/*******************************************************************************************/
//function SetRxMode();
/*******************************************************************************************/
void SetRxMode(void)
{
TX_EN=0 ;
TRX_CE=1 ;
Delay(50);
// delay for mode change(>=650us)
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -