發送的代碼:
#include "stc12c5a.h"
#include "intrins.h"
//#include "stc12_adc.h"
//這個是寄存器基地址
#define READ_REG 0x00 //讀配置寄存器,低5位為寄存器地址
#define WRITE_REG 0x20 //寫配置寄存器,低5位為寄存器地址
#define RD_RX_PLOAD 0x61 //讀RX有效數據,1~32字節
#define WR_TX_PLOAD 0xA0 //寫TX有效數據,1~32字節
#define FLUSH_TX 0xE1 //清除TX FIFO寄存器.發射模式下用
#define FLUSH_RX 0xE2 //清除RX FIFO寄存器.接收模式下用
#define REUSE_TX_PL 0xE3 //重新使用上一包數據,P_24L01_CE為高,數據包被不斷發送.
#define NOP 0xFF //空操作,可以用來讀狀態寄存器
// SPI(nRF24L01) registers(addresses) 這個是寄存器偏移地址
#define CONFIG 0x00 //配置寄存器地址
#define EN_AA 0x01 //使能自動應答功能
#define EN_RXADDR 0x02 //接收地址允許
#define SETUP_AW 0x03 //設置地址寬度(所有數據通道)
#define SETUP_RETR 0x04 //建立自動重發
#define RF_CH 0x05 //RF通道
#define RF_SETUP 0x06 //RF寄存器
#define STATUS 0x07 //狀態寄存器
#define OBSERVE_TX 0x08 // 發送檢測寄存器
#define CD 0x09 // 載波檢測寄存器
#define RX_ADDR_P0 0x0A // 數據通道0接收地址
#define RX_ADDR_P1 0x0B // 數據通道1接收地址
#define RX_ADDR_P2 0x0C // 數據通道2接收地址
#define RX_ADDR_P3 0x0D // 數據通道3接收地址
#define RX_ADDR_P4 0x0E // 數據通道4接收地址
#define RX_ADDR_P5 0x0F // 數據通道5接收地址
#define TX_ADDR 0x10 // 發送地址寄存器
#define RX_PW_P0 0x11 // 接收數據通道0有效數據寬度(1~32字節)
#define RX_PW_P1 0x12 // 接收數據通道1有效數據寬度(1~32字節)
#define RX_PW_P2 0x13 // 接收數據通道2有效數據寬度(1~32字節)
#define RX_PW_P3 0x14 // 接收數據通道3有效數據寬度(1~32字節)
#define RX_PW_P4 0x15 // 接收數據通道4有效數據寬度(1~32字節)
#define RX_PW_P5 0x16 // 接收數據通道5有效數據寬度(1~32字節)
#define FIFO_STATUS 0x17 // FIFO狀態寄存器
#define STA_MARK_RX 0X40
#define STA_MARK_TX 0X20
#define STA_MARK_MX 0X10
//AD轉換
//#ifndef _STC12_ADC_H_
//#define _STC12_ADC_H_
#define ADC_POWER 0x80 //ADC power control bit 給ADC上電 置位ADC_power
#define ADC_FLAG 0x10 //ADC complete flag ADC轉換完成標志
#define ADC_START 0x08 //ADC start control bit ADC開始轉換
#define ADC_SPEEDH 0x40 //180 clocks 原來為0x00 =540? 但好像不符合
#define ADC_SPEEDLL 0x00
#define ADC_SPEEDL 0x20
#define ADC_SPEEDHH 0x60
sfr ADC_LOW2 = 0xBE; //ADC low 2-bit result register 低2位
void Init_ADC( );
unsigned int GetADC(unsigned char ch);
float AD_av(unsigned char ch);
//#endif
sbit remote_IRQ=P0^3;
sbit remote_CE=P0^5;
sbit remote_CSN=P1^3;
sbit remote_SCK=P1^7;
sbit remote_MOSI=P1^5;
sbit remote_MISO=P1^6; //定義nrf24l01芯片管腳
//定義ps2搖桿管腳
sbit ps2_vcc1=P0^0;
sbit ps2_gnd1=P0^4;
sbit ps2_y1=P1^0 ; //1號y
sbit ps2_vcc2=P0^1;
sbit ps2_gnd2=P0^2;
sbit ps2_x2=P1^1 ; //2號x
unsigned int bdata sta; //狀態標志
sbit RX_DR =sta^6; //定義再可位尋址區的變量
sbit TX_DS =sta^5;
sbit MAX_RT =sta^4;
#define TX_DATA_WIDTH 32 //數據長度為32
#define RX_DATA_WIDTH 32
#define TX_ADR_WIDTH 5 //地址長度為5
#define RX_ADR_WIDTH 5
#define remote_TX_Mode 0x0e //發送模式
#define remote_RX_Mode 0x0f //接收模式
typedef unsigned int u16;
typedef unsigned char u8;
u8 code TX_ADDRESS[TX_ADR_WIDTH] = {0x17,0x14,0x14,0x93,0xcd}; //本機地址
u8 code RX_ADDRESS[RX_ADR_WIDTH] = {0x17,0x14,0x14,0x93,0xcd}; //接受端地址
//u8 Tx_Buffer1[DATA_WIDTH];
//u8 Tx_Buffer2[DATA_WIDTH];
//延時函數
void inerDelay_us(unsigned char n)
{
for(;n>0;n--)
_nop_();
}
void delay_ms(unsigned char x)
{
unsigned char i, j;
i = 0;
for(i=0; i<x; i++)
{
j = 250;
while(--j);
j = 250;
while(--j);
}
}
void delay(unsigned int k)
{
unsigned int i,j;
for(i=0;i<k;i++)
{
for(j=0;j<121;j++)
{;}
}
}
u16 remote_SPI_Drive(u16 Dat) //spi協議配置 設置spi寫時序
{
u16 i; //定義循環量
remote_SCK=0; // 輸出 8-bit
for(i=0;i<8;i++)
{
remote_MOSI=Dat&0x80; // 輸出 'Dat', 高位 進入 MOSI
Dat<<=1; // 進行移位 轉換下一位數據為高位
remote_SCK=1; // spi時鐘設為高
Dat|=remote_MISO; // 讀取當前的MISO位
remote_SCK=0; // spi時鐘設為低
}
return Dat;
}
u16 remote_Write_Read_Reg_Drive(u8 reg,u8 value) //NRF24L01用spi讀寫寄存器函數
{
u16 status; // CSN=0,初始化spi
status = remote_SPI_Drive(reg); // 選擇寄存器作為讀取來源 讀寄存器
remote_SPI_Drive(value); //將value寫入寄存器
remote_CSN=1;
return status;
}
u16 remote_Read_Buffer_Drive(u8 reg,u8 *pBuf,u8 len) //用于讀數據,
//reg 為寄存器地址,pBuf:為待讀出數據地址,len:讀出數據的個數
{
u16 status,k;
remote_CSN=0;
status=remote_SPI_Drive(reg);
for(k=0;k<len;k++)
{
pBuf[k]=remote_SPI_Drive(NOP);
}
remote_CSN=1;
return status;
}
u8 remote_Write_Buffer_Drive(u8 reg, u8 *pBuf, u8 len) // 用于寫數據:reg 為寄存器地址
//pBuf:為待寫入數據地址,len:寫入數據的個數
{
u8 status,k;
remote_CSN=0;
status = remote_SPI_Drive(reg);
for(k=0; k<len; k++)
{
remote_SPI_Drive(*pBuf++);
}
remote_CSN=1;
return status;
}
void remote_Init(void) //nrf24l01芯片初始化
{
remote_CE=0; //使能
remote_CSN=1; //spi中斷
remote_SCK=0; //spi時鐘
remote_Write_Buffer_Drive(WRITE_REG+TX_ADDR,TX_ADDRESS,TX_ADR_WIDTH); // 寫本地地址 地址值 長度
remote_Write_Buffer_Drive(WRITE_REG+RX_ADDR_P0,TX_ADDRESS,RX_ADR_WIDTH); // 寫接收端地址 地址
remote_Write_Read_Reg_Drive(WRITE_REG+RX_PW_P0,RX_DATA_WIDTH); //設置接收數據長度 通道0接受32長度的數據
remote_Write_Read_Reg_Drive(WRITE_REG + EN_AA, 0x01); // 頻道0自動 ACK應答允許 即自動應答
remote_Write_Read_Reg_Drive(WRITE_REG + EN_RXADDR, 0x01); // 允許接收地址只有頻道0,如果需要多頻道可以參考Page21
remote_Write_Read_Reg_Drive(WRITE_REG+RF_CH,55); //設置通信頻率為2454HZ
remote_Write_Read_Reg_Drive(WRITE_REG+RF_SETUP,0x0f); //數據傳輸率2Mbps,發射功率0dBm,最遠
remote_Write_Read_Reg_Drive(WRITE_REG+SETUP_RETR,0x0f); //建立自動重發 間隔250us 重發15次
}
//這個相當于remote_Init不傳參數 將0x0f即 remote_RX_Mode賦值給函數
//即為接受函數
void SetRX_Mode(void) //數據接收配置
{
remote_CE=0;
remote_Write_Read_Reg_Drive(WRITE_REG + CONFIG, remote_TX_Mode); // IRQ收發完成中斷響應,16位CRC ,主接收 0x0f表示接收
remote_CE = 1;
inerDelay_us(130);
}
//數據讀取后放如rx_buf接收緩沖區中
unsigned char nRF24L01_RxPacket(unsigned char* rx_buf)
{
unsigned char revale=0;
sta = remote_SPI_Drive(STATUS); // 讀取狀態寄存 STATUS為狀態寄存器 其來判斷數據接收狀況
if(RX_DR) // 判斷是否接收到數據
{
remote_CE = 0; //SPI使能
remote_Read_Buffer_Drive(RD_RX_PLOAD,rx_buf,TX_DATA_WIDTH); // read receive payload from RX_FIFO buffer
revale =1; //讀取數據完成標志
}
remote_Write_Read_Reg_Drive(WRITE_REG+STATUS,sta); //接收到數據后RX_DR,TX_DS,MAX_PT都置高為1,通過寫1來清楚中斷標志
return revale;
}
//發送 tx_buf中數據
void nRF24L01_TxPacket(unsigned char * tx_buf)
{
remote_CE=0; //StandBy I 待機模式
remote_Write_Buffer_Drive(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); // 裝載接收端地址
remote_Write_Buffer_Drive(WR_TX_PLOAD, tx_buf, TX_DATA_WIDTH); // 裝載數據
remote_Write_Read_Reg_Drive(WRITE_REG + CONFIG, remote_TX_Mode); // IRQ收發完成中斷響應,16位CRC,remote_TX_Mode即0x0e 主發送
remote_CE=1; //置高CE,激發數據發送
inerDelay_us(10);
}
//AD采集 初始化
void Init_ADC(void)
{
P1M0=0X03;
P1M1=0X03; //P1^0 P1^1作為AD采集位
P1ASF = 0x03; //P1^0,1采集電壓
ADC_RES = 0; //清空轉換結果存儲寄存器
ADC_LOW2=0;
ADC_CONTR = 0x00; //寄存器初始化
_nop_(); _nop_(); _nop_(); _nop_(); //等待ADC_CONTR值寫入
ADC_CONTR =ADC_CONTR | ADC_SPEEDH | ADC_START ;
_nop_(); _nop_(); _nop_(); _nop_(); //確保ADC_CONTR的值寫入
}
unsigned int GetADC(unsigned char ch)
{
unsigned int res;
ADC_CONTR =ADC_CONTR | ADC_POWER | ADC_START|ch ;
_nop_(); _nop_(); _nop_(); _nop_(); //確保ADC_CONTR的值寫入
while(!(ADC_CONTR & 0x10)); //如果AD轉換未結束FLAG位為0,程序在此等待,如果為1,跳出循環
res=ADC_RES*4+ADC_LOW2; //讀AD轉換結果讀走AD轉換結果,由于ADC_DATA中存儲12位中的
//高8位,當要轉換成10進制時,需將ADC_DATA中的數左移2位,即相當于*4
ADC_CONTR&=0xe7; //清除標志位
return res;
}
float AD_av(unsigned char ch)
{
float ADV;
unsigned char num;
for(num=20;num>0;num--) //采集20次
{
ADV+=GetADC(ch); //求和
}
ADV/=20.0;
ADV=ADV/4.0;
return ADV;
}
//檢查接收設備有無接收到數據包,設定沒有收到應答信號是否重發
//unsigned char Check_ACK(bit clear)
//{
// while(remote_IRQ);
// sta = remote_SPI_Drive(NOP); // 返回狀態寄存器
// if(MAX_RT) //1:最大重發計數中斷關閉
// if(clear) // 是否清除TX FIFO,沒有清除在復位MAX_RT中斷標志后重發
// remote_SPI_Drive(FLUSH_TX);
// remote_Write_Read_Reg_Drive(WRITE_REG + STATUS, sta); // 清除TX_DS或MAX_RT中斷標志
// remote_IRQ = 1;
// if(TX_DS)
// return(0x00);
// else
// return(0xff);
//}
void main(void)
{
unsigned char _pwm,wheel,RxBuf[32]={0},TxBuf[32]; // 接收的數據 數組
delay(500);
remote_Init(); //模塊初始化
Init_ADC(); //AD初始化
while(1)
{
SetRX_Mode(); //設置成接受模式
nRF24L01_RxPacket(RxBuf);
delay(10);
//電機
ps2_vcc1=1;
ps2_gnd1=0;
ps2_vcc2=1;
ps2_gnd2=0;
_pwm=(unsigned char)((256-AD_av(0)+70)*0.92); //這個參數可能以后要調
if(_pwm<140)
{
Init_ADC();
TxBuf[1]=1;
_pwm=_pwm;
}
else
{
TxBuf[1]=0;
_pwm=_pwm;
delay(2);
}
//方向
Init_ADC();
wheel=(unsigned char)AD_av(1); // pwm:68~250 AD_av(1):(右)47~118~189(左) 有待考究
if(wheel<=105) //右轉
{
//TxBuf[2]=_pwm-(130-wheel);
TxBuf[2]=0;
TxBuf[3]=_pwm;
}
if( wheel>105&&wheel<=131)
{
//TxBuf[2]=_pwm;
TxBuf[2]=1;
TxBuf[3]=_pwm;
}
if(wheel>131) //左轉
{
//TxBuf[2]=_pwm;
TxBuf[2]=2;
TxBuf[3]=_pwm-(wheel-100);
}
nRF24L01_TxPacket(TxBuf); //發送數據 Transmit Tx buffer data
// Check_ACK(1);
delay(50);
}
}
接受的代碼:
#include "stc12c5a.h"
#include "intrins.h"
//#include "stc12_adc.h"
//這個是寄存器基地址
#define READ_REG 0x00 //讀配置寄存器,低5位為寄存器地址
#define WRITE_REG 0x20 //寫配置寄存器,低5位為寄存器地址
#define RD_RX_PLOAD 0x61 //讀RX有效數據,1~32字節
#define WR_TX_PLOAD 0xA0 //寫TX有效數據,1~32字節
#define FLUSH_TX 0xE1 //清除TX FIFO寄存器.發射模式下用
#define FLUSH_RX 0xE2 //清除RX FIFO寄存器.接收模式下用
#define REUSE_TX_PL 0xE3 //重新使用上一包數據,P_24L01_CE為高,數據包被不斷發送.
#define NOP 0xFF //空操作,可以用來讀狀態寄存器
// SPI(nRF24L01) registers(addresses) 這個是寄存器偏移地址
#define CONFIG 0x00 //配置寄存器地址
#define EN_AA 0x01 //使能自動應答功能
#define EN_RXADDR 0x02 //接收地址允許
#define SETUP_AW 0x03 //設置地址寬度(所有數據通道)
#define SETUP_RETR 0x04 //建立自動重發
#define RF_CH 0x05 //RF通道
#define RF_SETUP 0x06 //RF寄存器
#define STATUS 0x07 //狀態寄存器
#define OBSERVE_TX 0x08 // 發送檢測寄存器
#define CD 0x09 // 載波檢測寄存器
#define RX_ADDR_P0 0x0A // 數據通道0接收地址
#define RX_ADDR_P1 0x0B // 數據通道1接收地址
#define RX_ADDR_P2 0x0C // 數據通道2接收地址
#define RX_ADDR_P3 0x0D // 數據通道3接收地址
#define RX_ADDR_P4 0x0E // 數據通道4接收地址
#define RX_ADDR_P5 0x0F // 數據通道5接收地址
#define TX_ADDR 0x10 // 發送地址寄存器
#define RX_PW_P0 0x11 // 接收數據通道0有效數據寬度(1~32字節)
#define RX_PW_P1 0x12 // 接收數據通道1有效數據寬度(1~32字節)
#define RX_PW_P2 0x13 // 接收數據通道2有效數據寬度(1~32字節)
#define RX_PW_P3 0x14 // 接收數據通道3有效數據寬度(1~32字節)
#define RX_PW_P4 0x15 // 接收數據通道4有效數據寬度(1~32字節)
#define RX_PW_P5 0x16 // 接收數據通道5有效數據寬度(1~32字節)
#define FIFO_STATUS 0x17 // FIFO狀態寄存器
#define STA_MARK_RX 0X40
#define STA_MARK_TX 0X20
#define STA_MARK_MX 0X10
//AD轉換
//#ifndef _STC12_ADC_H_
//#define _STC12_ADC_H_
#define ADC_POWER 0x80 //ADC power control bit 給ADC上電 置位ADC_power
#define ADC_FLAG 0x10 //ADC complete flag ADC轉換完成標志
#define ADC_START 0x08 //ADC start control bit ADC開始轉換
#define ADC_SPEEDH 0x40 //180 clocks 原來為0x00 =540? 但好像不符合
#define ADC_SPEEDLL 0x00
#define ADC_SPEEDL 0x20
#define ADC_SPEEDHH 0x60
sfr ADC_LOW2 = 0xBE; //ADC low 2-bit result register 低2位
void Init_ADC( );
unsigned int GetADC(unsigned char ch);
float AD_av(unsigned char ch);
//#endif
sbit remote_IRQ=P0^3;
sbit remote_CE=P0^5;
sbit remote_CSN=P1^3;
sbit remote_SCK=P1^7;
sbit remote_MOSI=P1^5;
sbit remote_MISO=P1^6; //定義nrf24l01芯片管腳
//定義輸出管腳 電機驅動
sbit IN1=P1^0;
sbit IN2=P1^1;
//sg90 舵機
sbit Zheng=P2^0;
sbit Fu=P2^1;
sbit _pwm_=P2^2;
unsigned int bdata sta; //狀態標志
sbit RX_DR =sta^6; //定義再可位尋址區的變量
sbit TX_DS =sta^5;
sbit MAX_RT =sta^4;
#define TX_DATA_WIDTH 32 //數據長度為32
#define RX_DATA_WIDTH 32
#define TX_ADR_WIDTH 5 //地址長度為5
#define RX_ADR_WIDTH 5
#define remote_TX_Mode 0x0e //發送模式
#define remote_RX_Mode 0x0f //接收模式
typedef unsigned int u16;
typedef unsigned char u8;
u8 code TX_ADDRESS[TX_ADR_WIDTH] = {0x17,0x14,0x14,0x93,0xcd}; //本機地址
u8 code RX_ADDRESS[RX_ADR_WIDTH] = {0x17,0x14,0x14,0x93,0xcd}; //接受端地址
//u8 Tx_Buffer1[DATA_WIDTH];
//u8 Tx_Buffer2[DATA_WIDTH];
//延時函數
void inerDelay_us(unsigned char n)
{
for(;n>0;n--)
_nop_();
}
void delay_ms(unsigned char x)
{
unsigned char i, j;
i = 0;
for(i=0; i<x; i++)
{
j = 250;
while(--j);
j = 250;
while(--j);
}
}
void delay(unsigned int k)
{
unsigned int i,j;
for(i=0;i<k;i++)
{
for(j=0;j<121;j++)
{;}
}
}
u16 remote_SPI_Drive(u16 Dat) //spi協議配置 設置spi寫時序
{
u16 i; //定義循環量
remote_SCK=0; // 輸出 8-bit
for(i=0;i<8;i++)
{
remote_MOSI=Dat&0x80; // 輸出 'Dat', 高位 進入 MOSI
Dat<<=1; // 進行移位 轉換下一位數據為高位
remote_SCK=1; // spi時鐘設為高
Dat|=remote_MISO; // 讀取當前的MISO位
remote_SCK=0; // spi時鐘設為低
}
return Dat;
}
u16 remote_Write_Read_Reg_Drive(u8 reg,u8 value) //NRF24L01用spi讀寫寄存器函數
{
u16 status; // CSN=0,初始化spi
status = remote_SPI_Drive(reg); // 選擇寄存器作為讀取來源 讀寄存器
remote_SPI_Drive(value); //將value寫入寄存器
remote_CSN=1;
return status;
}
u16 remote_Read_Buffer_Drive(u8 reg,u8 *pBuf,u8 len) //用于讀數據,
//reg 為寄存器地址,pBuf:為待讀出數據地址,len:讀出數據的個數
{
u16 status,k;
remote_CSN=0;
status=remote_SPI_Drive(reg);
for(k=0;k<len;k++)
{
pBuf[k]=remote_SPI_Drive(NOP);
}
remote_CSN=1;
return status;
}
u8 remote_Write_Buffer_Drive(u8 reg, u8 *pBuf, u8 len) // 用于寫數據:reg 為寄存器地址
//pBuf:為待寫入數據地址,len:寫入數據的個數
{
u8 status,k;
remote_CSN=0;
status = remote_SPI_Drive(reg);
for(k=0; k<len; k++)
{
remote_SPI_Drive(*pBuf++);
}
remote_CSN=1;
return status;
}
void remote_Init(void) //nrf24l01芯片初始化
{
remote_CE=0; //使能
remote_CSN=1; //spi中斷
remote_SCK=0; //spi時鐘
remote_Write_Buffer_Drive(WRITE_REG+TX_ADDR,TX_ADDRESS,TX_ADR_WIDTH); // 寫本地地址 地址值 長度
remote_Write_Buffer_Drive(WRITE_REG+RX_ADDR_P0,TX_ADDRESS,RX_ADR_WIDTH); // 寫接收端地址 地址
remote_Write_Read_Reg_Drive(WRITE_REG+RX_PW_P0,RX_DATA_WIDTH); //設置接收數據長度 通道0接受32長度的數據
remote_Write_Read_Reg_Drive(WRITE_REG + EN_AA, 0x01); // 頻道0自動 ACK應答允許 即自動應答
remote_Write_Read_Reg_Drive(WRITE_REG + EN_RXADDR, 0x01); // 允許接收地址只有頻道0,如果需要多頻道可以參考Page21
remote_Write_Read_Reg_Drive(WRITE_REG+RF_CH,55); //設置通信頻率為2454HZ
remote_Write_Read_Reg_Drive(WRITE_REG+RF_SETUP,0x0f); //數據傳輸率2Mbps,發射功率0dBm,最遠
remote_Write_Read_Reg_Drive(WRITE_REG+SETUP_RETR,0x0f); //建立自動重發 間隔250us 重發15次
}
//這個相當于remote_Init不傳參數 將0x0f即 remote_RX_Mode賦值給函數
//即為接受函數
void SetRX_Mode(void) //數據接收配置
{
remote_CE=0;
remote_Write_Read_Reg_Drive(WRITE_REG + CONFIG, remote_RX_Mode); // IRQ收發完成中斷響應,16位CRC ,主接收 0x0f表示接收
remote_CE = 1;
inerDelay_us(130);
}
//數據讀取后放如rx_buf接收緩沖區中
unsigned char nRF24L01_RxPacket(unsigned char* rx_buf)
{
unsigned char revale=0;
sta = remote_SPI_Drive(STATUS); // 讀取狀態寄存 STATUS為狀態寄存器 其來判斷數據接收狀況
if(RX_DR) // 判斷是否接收到數據
{
remote_CE = 0; //SPI使能
remote_Read_Buffer_Drive(RD_RX_PLOAD,rx_buf,TX_DATA_WIDTH); // read receive payload from RX_FIFO buffer
revale =1; //讀取數據完成標志
}
remote_Write_Read_Reg_Drive(WRITE_REG+STATUS,sta); //接收到數據后RX_DR,TX_DS,MAX_PT都置高為1,通過寫1來清楚中斷標志
return revale;
}
//發送 tx_buf中數據
void nRF24L01_TxPacket(unsigned char * tx_buf)
{
remote_CE=0; //StandBy I 待機模式
remote_Write_Buffer_Drive(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); // 裝載接收端地址
remote_Write_Buffer_Drive(WR_TX_PLOAD, tx_buf, TX_DATA_WIDTH); // 裝載數據
remote_Write_Read_Reg_Drive(WRITE_REG + CONFIG, remote_TX_Mode); // IRQ收發完成中斷響應,16位CRC,remote_TX_Mode即0x0e 主發送
remote_CE=1; //置高CE,激發數據發送
inerDelay_us(10);
}
////檢查接收設備有無接收到數據包,設定沒有收到應答信號是否重發
//unsigned char Check_ACK(bit clear)
//{
// while(remote_IRQ);
// sta = remote_SPI_Drive(NOP); // 返回狀態寄存器
// if(MAX_RT) //1:最大重發計數中斷關閉
// if(clear) // 是否清除TX FIFO,沒有清除在復位MAX_RT中斷標志后重發
// remote_SPI_Drive(FLUSH_TX);
// remote_Write_Read_Reg_Drive(WRITE_REG + STATUS, sta); // 清除TX_DS或MAX_RT中斷標志
// remote_IRQ = 1;
// if(TX_DS)
// return(0x00);
// else
// return(0xff);
//}
//產生pwm波形
#define Stop 0 //宏定義,停止
#define Left 1 //宏定義,左轉
#define Right 2 //宏定義,右轉
unsigned char TimeOutCounter = 0; //TimeOutCounter:定時器溢出計數
unsigned char LeftOrRight = 0; // LeftOrRight:舵機左右旋轉標志
void InitialTimer ( void ) //配置定時器1
{
{
TMOD=0x10; //定時/計數器1工作于方式1
TH1 = ( 65535 - 500 ) / 256; //0.25ms
TL1 = ( 65535 - 500 ) % 256;
EA=1; //開總中斷
ET1=1; //允許定時/計數器1 中斷
TR1=1; //啟動定時/計數器1 中斷
}
}
//void ControlLeftOrRight ( void ) //控制舵機函數
//{
// if( RxBuf[2] == 0 )
// {
// //while ( !KeyStop ); //使標志等于Stop(0),在中斷函數中將用到
// LeftOrRight = Stop;
// }
//
// if( RxBuf[2] == 1 )
// {
// //while ( !KeyLeft ); //使標志等于Left(1),在中斷函數中將用到
// LeftOrRight = Left;
// }
//
// if( RxBuf[2] == 2 )
// {
// //while ( !KeyRight ); //使標志等于Right(2),在中斷函數中將用到
// LeftOrRight = Right;
// }
//
//}
void main(void)
{
unsigned char RxBuf[32]={0}; // 接收的數據 數組
delay(500);
remote_Init(); //模塊初始化
//PWM_init();
//PWM_clock(2); // PCA/PWM時鐘源為定時器0的溢出
while(1)
{
SetRX_Mode(); //設置成接受模式
nRF24L01_RxPacket(RxBuf);
delay(10);
if(RxBuf[1]==0) //制動
{
delay(10);
IN1=1;
IN2=1;
}
else
{
if(RxBuf[0]==0) //停止
{
delay(10);
IN1=0;
IN2=0;
}
//else
}
//舵機
InitialTimer();
if( RxBuf[2] == 0 )
{
//while ( !KeyStop ); //使標志等于Stop(0),在中斷函數中將用到
LeftOrRight = Stop;
}
if( RxBuf[2] == 1 )
{
//while ( !KeyLeft ); //使標志等于Left(1),在中斷函數中將用到
LeftOrRight = Left;
}
if( RxBuf[2] == 2 )
{
//while ( !KeyRight ); //使標志等于Right(2),在中斷函數中將用到
LeftOrRight = Right;
}
switch ( LeftOrRight )
{
case 0 : //為0時,舵機歸位,脈寬1.5ms
{
if( TimeOutCounter <= 3 )
{
Zheng=1;
Fu=0;
_pwm_ = 1;
}
else
{
_pwm_ = 0;
}
break;
}
case 1 : //為1時,舵機左轉,脈寬1ms(理論值),實際可以調試得出
{
if( TimeOutCounter <= 1 )
{
Zheng=1;
Fu=0;
_pwm_ = 1;
}
else
{
_pwm_ = 0;
}
break;
}
case 2 : //為2時,舵機右轉,脈寬2ms(理論值),實際可以調試得出
{
if( TimeOutCounter <= 6 )
{
Zheng=1;
Fu=0;
_pwm_ = 1;
}
else
{
_pwm_ = 0;
}
break;
}
default : break;
}
if( TimeOutCounter == 80 ) //周期20ms(理論值),比較可靠,最好不要修改
{
TimeOutCounter = 0;
}
delay(50);
}
}
void Timer1( void ) interrupt 3 //定時器中斷函數
{
TH1 = ( 65535 - 500 ) / 256;
TL1 = ( 65535 - 500 ) % 256;
TimeOutCounter ++;
}
|