📄 set.h
字号:
#ifndef __SET_H__
#define __SET_H__
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define WC 0x00 // Write configuration register command ADDR_8255_control
#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
//////////////////////下面是t_mini.c里的copy过来的////////////////////////////////////////////////
#define V_TH0 0xee /* ~ 5ms , ! notice: crystal 11.0592MHz */
#define V_TL0 0x00
/* 数码管段驱动寄存器地址 */
#define ADDR_8SEG XBYTE[0x2000]
/* 数码管位驱动和指示灯驱动寄存器地址 */
#define ADDR_SEL XBYTE[0x4000]
#define PB8255 XBYTE[0xE001] //B口地址
#define SB 16 //sent bytes 一个数据包里的payload字节数
//用于按键消抖
unsigned char p_counter=0;
/* 按键 */
sbit pKEY1= P1^0;
sbit pKEY2= P1^1;
sbit pKEY3= P1^2;
sbit pKEY4= P1^3;
/*******************************************************************************************/
typedef struct RFConfig
{
uchar n;
uchar buf[10];
}RFConfig;
code RFConfig RxTxConf =
{
10,
0x01,
0x2c,
0x44,
0x10,
0x10,
0xcc, 0xcc, 0xcc,0xcc, // 4 bytes address
0x5c
};
RFConfig temp={0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
/*******************************************************************************************/
uchar xdata TxBuf[32];
uchar xdata RxBuf[32];
/*******************************************************************************************/
//uchar key,rsbrf,delayf,tf;
//sbit retest=P2^0;
int trsec=0;
uchar jj=0;
uchar r_flag=1;// flag of receiving 指示芯片处于接受状态的flag
uchar retrieving_flag=0; //高则指示单片机从芯片取数据的那段时间
int jsq=3; //计数器
uchar id=0; //index
bit time_up=0;
bit ready2send=0;
/*******************************************************************************************/
uchar bdata DATA_BUF;
sbit flag =DATA_BUF^7;
sbit flag1 =DATA_BUF^0;
/*******************************************************************************************/
/**** receive_module nrf905 控制引脚 ****/
//#define COM8255 XBYTE[0xE003] //命令口地址
/* 8255 reset */
sbit RST8255 = P1^4;
/* 输出缓存,8255端口B ,定义了一个可位寻址的变量 */
unsigned char bdata PB;
sbit SCK = PB^7;
sbit TX_EN = PB^6;
sbit TRX_CE = PB^5;
sbit PWR_UP = PB^4;
sbit MOSI = PB^2;
sbit CSN = PB^0;
sbit AM =P3^2;
sbit DR =P3^3;
sbit MISO= P3^4;
sbit CD =P3^5;
/*******************************************************************************************/
//void InitIO(void); // Initialize IO port
void InitWireless(void); //
void Config905(void); // Config nRF905 module配置NRF905模式
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(int n); // Delay 100us
void Wireless_int0(void);
void Wireless_while(void);
//void TxData (uchar x); // Send key_value to CRT display
void Key1(void);
void Key2(void);
void Key3(void);
void Key4(void);
//////////////////////////////////////////////////////
void InitWireless(void)
{
// 8255初始化
RST8255=0;
ADDR_8255_control=0x81;
//================NRF905初始化
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
PB8255=PB;
//================
Config905(); // Config nRF905 module
SetRxMode(); // Set nRF905 in Rx mode
}
//////////////////////////////////////////////////////
/*******************************************************************************************/
//function Delay100us();Delay 100us
/*******************************************************************************************/
void Delay(int n)
{
int i;
for(i=0;i<n;i++) _nop_();
}
/*******************************************************************************************/
/*******************************************************************************************/
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; PB8255=PB; }
else
{MOSI=0; PB8255=PB; }
Delay(10);
SCK=1;PB8255=PB;
// Delay(1);
Delay(10);
// Set clock line high
// Shift DATA_BUF
DATA_BUF=DATA_BUF<<1;
SCK=0; PB8255=PB; // Set clock line low
// Delay(10);
// _nop_();_nop_();_nop_();_nop_(); Delay(10);
}
}
/*******************************************************************************************/
//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; PB8255=PB; // Set clock line high
// _nop_();_nop_();_nop_();_nop_(); Delay(10);
if (MISO)
flag1=1; // Read data
else
flag1=0;
Delay(10);
SCK=0; PB8255=PB; // Set clock line low
Delay(10);
// _nop_();_nop_();_nop_();_nop_(); Delay(10);
}
return DATA_BUF; // Return function parameter
}
/*******************************************************************************************/
void Config905(void)
{
uchar i,flag=1;
CSN=0; PB8255=PB; // Spi enable for write a spi command
SpiWrite(WC); // Write config command写放配置命令
for (i=0;i<RxTxConf.n;i++) // Write configration words 写放配置字
{
SpiWrite(RxTxConf.buf[i]);
}
CSN=1; PB8255=PB; // Disable Spi
CSN=0;PB8255=PB;
SpiWrite(RC);
for (i=0;i<RxTxConf.n;i++) // Write configration words 写放配置字
{
temp.buf[i]=SpiRead();
}
CSN=1; PB8255=PB;
for(i=0;i<RxTxConf.n;i++)
{
if ( temp.buf[i] == RxTxConf.buf[i]) flag++;
}
fir_dis=flag;
if(flag!=11)
Config905();
}
/*******************************************************************************************/
void FixConfig(void) //fix the configuration command if it goes wrong
{
uchar i,flag=1;
TRX_CE=0;PB8255=PB;Delay(100);
CSN=0; PB8255=PB;
SpiWrite(RC);
for (i=0;i<RxTxConf.n;i++) // Write configration words 写放配置字
{
temp.buf[i]=SpiRead();
}
CSN=1; PB8255=PB;
for(i=0;i<RxTxConf.n;i++)
{
if ( temp.buf[i] == RxTxConf.buf[i]) flag++;
}
if (flag!=(RxTxConf.n+1))
{
for_dis=10;
TRX_CE=0;PB8255=PB;Delay(100);
Config905();
}
}
/*******************************************************************************************/
//function SpiWrite();
/*******************************************************************************************/
//function TxPacket();
/*******************************************************************************************/
void TxPacket(void)
{
uchar i;
TRX_CE=0;
//Config905();
CSN=0; PB8255=PB; // Spi enable for write a spi command
SpiWrite(WTP); // Write payload command
for (i=0;i<SB;i++)
{
SpiWrite(TxBuf[i]); // Write 32 bytes Tx data
}
CSN=1; PB8255=PB; // Spi disable
Delay(1);
CSN=0; PB8255=PB; // Spi enable for write a spi command
SpiWrite(WTA); // Write address command
for (i=0;i<(RxTxConf.n-6);i++) // Write 4 bytes address
{
SpiWrite(RxTxConf.buf[i+5]);
}
CSN=1; // Spi disable
TRX_CE=1; PB8255=PB; // Set TRX_CE high,start Tx data transmission
Delay(1000); // while (DR!=1);
TRX_CE=0; PB8255=PB; // Set TRX_CE low
}
/*******************************************************************************************/
//function RxPacket();
/*******************************************************************************************/
void RxPacket(void)
{
uchar i;
TRX_CE=0; PB8255=PB; // Set nRF905 in standby mode
Delay(100);
CSN=0; PB8255=PB; // Spi enable for write a spi command
SpiWrite(RRP); // Read payload command
for (i=0;i<SB;i++)
{
RxBuf[i]=SpiRead(); // Read data and save to buffer
}
CSN=1; PB8255=PB; // Disable spi
while(DR||AM) _nop_();
//P0= RxBuf[0]; // Buffer[0] output from P0 port...
TRX_CE=1; PB8255=PB;
/* if (!(RxBuf[0]==0&&RxBuf[1]==0) )
for (i=0;i<SB;i++)
{
TmpBuf[i]=RxBuf[i]; // Read data and save to buffer
} */
//xx=(RxBuf[0]>>4)&0x0f;
// for (i=0;i<SB;i++) TxData(RxBuf[i]);
}
/*******************************************************************************************/
//function SetTxMode();
/*******************************************************************************************/
void SetTxMode(void)
{
TX_EN=1;
TRX_CE=0; PB8255=PB;
Delay(100); // delay for mode change(>=650us)
r_flag=0;
}
/*******************************************************************************************/
//function SetRxMode();
/*******************************************************************************************/
void SetRxMode(void)
{
TRX_CE=0; PB8255=PB;
Delay(100);
Config905();
//FixConfig();
Delay(100);
TX_EN=0;
TRX_CE=1; PB8255=PB;
Delay(100); // delay for mode change(>=650us)
r_flag=1;
}
void Wireless_int0(void)
{
int i;
if(p_counter<30) p_counter++;
/* 检测到按键被按下(0)时,相应的指示灯亮(0) */
if (pKEY1==0)
{if (p_counter==30) {p_counter=0;Key1();} }
if (pKEY2==0)
{if (p_counter==30) {p_counter=0;Key2();} }
if (pKEY3==0)
{if (p_counter==30) {p_counter=0;Key3();} }
if (pKEY4==0)
{if (p_counter==30) {p_counter=0;Key4();} }
if(trsec>0 && (!retrieving_flag))
{
if (trsec%180==0)
{
SetTxMode();
for(i=0;i<SB;i++)
TxBuf[i]=jj;
jj++;
if(jj>15) jj=0;
TxPacket();
SetRxMode();
}
trsec--;
if (trsec==0) trsec=200;
}
}
void Wireless_while(void)
{
if (r_flag && DR) // Ifr recive data ready...
{
r_flag=0;
retrieving_flag=1;
RxPacket(); // ... recive data
fir_dis = RxBuf[1]; //jsq++;
sec_dis = RxBuf[2];
thi_dis = RxBuf[3];
for_dis = jsq;if (jsq<15)jsq++; else jsq=0;
SetRxMode();
// Delay(1000);
retrieving_flag=0;
r_flag=1;
}
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -