發送程序
#include <12c5a60s2.h>
#include <intrins.h>
#define FOSC 11059200L
#define BAUD (256-FOSC/32/9600)
#define uint unsigned int
#define uchar unsigned char
uchar data TxBuf[32];
uchar data RxBuf[32];
uchar bdata DATA_BUF;
/* 定義RF905 */
#define WC 0x00 // 寫配置寄存器指令
#define RC 0x10 // 讀取配置寄存器命令
#define WTP 0x20 //寫TX有效數據字節寫操作全部從0開始
#define RTP 0x21 // 讀TX有效數據字節寫操作全部從0開始
#define WTA 0x22 // 寫發送地址命令
#define RTA 0x23 // 讀發送地址命令
#define RRP 0x24 // 讀RX有效數據字節寫操作全部從0開始
typedef struct RFConfig
{
uchar n;
uchar buf[10];
}RFConfig;
code RFConfig RxTxConf ={
10,
0x01, 0x0c, 0x44, 0x20, 0x20, 0xcc, 0xcc, 0xcc,0xcc, 0x58
};
//這個結構的內容是NRF905的初始化數據。
// ch_no = 1;433MHz;正常運轉,沒有協議;接收,發送的地址是4字節/收發有效寬度為32字節;禁用外部時鐘;晶振頻率= 16MHz / / 8位CRC和使/*******************************************************************************************/
/*******************************************************************************************/
void delay(uchar z)
{
uint x,y;
for(x=z;x<0;x--)
for(y=110;y>0;y--);
}
sbit SPISS=P1^4;
sbit MOSI=P1^5;
sbit MISO=P1^6;
sbit SCK=P1^7; //主器件啟動一次數據傳輸時自動產生8個SCK時鐘周期信號給從機
sbit CSN=P1^1;
sbit DR=P2^1;
sbit AM=P2^2;
sbit CD=P2^4;
sbit PWR_UP=P2^5;
sbit TRX_CE=P2^6;
sbit TX_EN=P2^7;
/*******************************************************************************************/
/*******************************************************************************************/
//function InitIO();
/*******************************************************************************************/
void InitIO(void)
{
CSN=1;// SPI禁用
SCK=0;// SPI初始化時鐘線高
DR=1;// 初始化DR輸入
AM=1;// 初始化AM輸入
PWR_UP=1;// nRF905芯片上電
TRX_CE=0;// 在待機模式下設置nRF905
TX_EN=0;// 在接收模式設置無線
}
/*******************************************************************************************/
void SetTXmode()
{
TRX_CE=1;
TX_EN=1;
delay(1);
}
/***********************************
funtion :write spi date
***********************************/
void Spi_write(uchar date)
{
DATA_BUF=date;
SPDAT=DATA_BUF;
while(!SPIF);
SPSTAT=SPIF|WCOL;
}
void Config905(void)
{
uchar i;
CSN=0;
Spi_write(WC);
for(i=0;i<RxTxConf.buf[i];i++)
{
Spi_write(RxTxConf.buf[i]);
}
CSN=1;
}
/***************************************
funtion: send 32 date
****************************************/
void TxPacket(void)
{
uchar i;
CSN=0;
Spi_write(WTP);
for(i=0;i<32;i++)
{
Spi_write(TxBuf[i]);
}
CSN=1;
delay(5);
CSN=0;
Spi_write(WTP);
for(i=0;i<4;i++)
{
Spi_write(TxBuf[i+5]);
}
CSN=1;
TRX_CE=1;
delay(5);
TRX_CE=0;
}
/***************************************
funtion: SPI init
****************************************/
void SPI_init(void)
{
SPCTL=0xfd;
SPSTAT=SPIF|WCOL;
SPDAT=0;
IE2|=ESPI;
EA=1;
}
/***************************************
funtion: uart init
****************************************/
void Uart_init(void)
{
TMOD=0x20;
AUXR=0x40;
TH1=TL1=BAUD;
SCON=0x50;
PCON=0X00;
TR1=1;
}
uchar RecvUart()
{
while(!RI)
RI=0;
return SBUF;
}
void SendUart(uchar dat)
{
while(!TI);
TI=0;
SBUF=dat;
}
void main()
{
InitIO();
Uart_init();
SPI_init();
Config905();
SetTXmode();
delay(500);// 延時
while(1)
{
Scankey();
TxPacket();
if(DR)
{
beep=~beep;
delay(1000);
}
}
}
|