|
#include<reg52.h> #include "nrf_rx.h" #define uint unsigned int #define uchar unsigned char sbit ot1=P2^0; //定義 ot1,ot2控制左輪;ot2,ot3控制右輪 ena為左輪pwm輸出,enb為右輪pwm輸出 sbit ot2=P2^1; sbit ot3=P2^2; sbit ot4=P2^3; sbit ena=P1^3; sbit enb=P1^4; uint num1,k,b,t; //pwm波標(biāo)記 uint a,tm; uint flag; uchar ts; extern uchar RX_Buffer[8]; void delayms(uint x) //程序延時(shí) { uint i,j; for(i=x;i>0;i--) for(j=110;j>0;j--); } void pwm0() //計(jì)時(shí)器中斷 { TMOD=0x01; TH0=(65536-5000)/256; TL0=(65536-5000)%256; TH1=(65536-1000)/256; TL1=(65536-1000)%256; EA=1; ET0=1; ET1=1; } void zhixing_h() //高速直行轉(zhuǎn)彎 { ot1=0; ot2=1; ot3=0; ot4=1; ena=1; enb=1; k=1; } void zuozhuan_h() { ot1=0; ot2=0; ot3=0; ot4=1; ena=1; enb=1; if(b==1) { delayms(400); ot1=0; ot2=0; ot3=0; ot4=0; } else { TR1=1; tm=200; } a=0; } void youzhuan_h() { ot1=0; ot2=1; ot3=0; ot4=0; ena=1; enb=1; if(b==1) { delayms(400); ot1=0; ot2=0; ot3=0; ot4=0; } else { TR1=1; tm=200; } } void diaotou() { ot1=0; ot2=1; ot3=1; ot4=0; ena=1; enb=1; if(b==1) { delayms(800); ot1=0; ot2=0; ot3=0; ot4=0; } else { tm=600; TR1=1; } } void daoche_h() { ot1=1; ot2=0; ot3=1; ot4=0; ena=1; enb=1; k=1; } void stop() { ot1=0; ot2=0; ot3=0; ot4=0; ena=0; enb=0; } void direct() //判斷得到數(shù)據(jù) 快速直行轉(zhuǎn)彎或慢速直行轉(zhuǎn)彎 { char c; b=a/10; //提取a的第一位 c=a%10; //提取a的第二位 if(b==0) { ts=1; //調(diào)速標(biāo)記 } else { ts=0; } switch(c) { //a為一個(gè)2位數(shù)第一位1表示高速0表示低速,第二位代表所需要狀態(tài) case 1:zhixing_h(); break; case 3:zuozhuan_h(); break; case 4:youzhuan_h(); break; case 6:diaotou(); break; case 2:daoche_h(); break; case 5:stop();break; } } /*void bizhang() { uint t=15; trige=1; while(t--); trige=0; while(!reback) ; TR1=1; while(reback) { if(TL1>10) //17cm { t=0; TL1=0; break; } else { t=0; TL1=0; stop(); break; } } }*/ /* void main(void) { P0=0xff; P1=0xff; P2=0xff; P3=0xff; _delay_us(1000); nRF24L01_Init(); while(1) { nRF24L01_Set_RX_Mode(); //設(shè)置為接收模式 _delay_ms(100); if(nRF24L01_RX_Data()) //判斷是都接收到數(shù)據(jù) { LED=0;//如果有數(shù)據(jù)收到燈亮 P0=RX_Buffer[0]; } else//否則燈熄 LED=1; } } */ void main() { P0=0xff; P1=0xff; P2=0xff; P3=0xff; EA=1; EX0=1; IT0=1; _delay_us(1000); nRF24L01_Init(); nRF24L01_Set_RX_Mode(); //設(shè)置為接收模式 while(1) { pwm0(); direct(); a=0; while(a==0) { if(ts==1) //ts等于1時(shí)需要調(diào)速 轉(zhuǎn)彎調(diào)速時(shí)flag大于250轉(zhuǎn)彎結(jié)束 { //if(k==1) //此時(shí)計(jì)時(shí)器1空閑 小車處于運(yùn)動(dòng)狀態(tài) //{ // bizhang(); //} TR0=1; ena=1; enb=1; while(num1>2) { ena=0; enb=0; } if(flag>tm) { ot1=0; ot2=0; ot3=0; ot4=0; ena=0; enb=0; flag=0; TR1=0; } } } } } void int0() interrupt 0 using 0 { char i; P2=0x50; for(i=0;i<3;i++) { nRF24L01_Set_RX_Mode(); //設(shè)置為接收模式 _delay_ms(100); if(nRF24L01_RX_Data()) //判斷是都接收到數(shù)據(jù) { LED=0;//如果有數(shù)據(jù)收到燈亮 a=RX_Buffer[0]; P0=RX_Buffer[0]; } else//否則燈熄 { LED=1; } } } void time0() interrupt 1 using 1 { num1++; TH0=(65536-5000)/256; TL0=(65536-5000)%256; if(num1>20) { num1=0; } } void time1() interrupt 3 using 2 { t++; if(t==400) { flag++; t=0; } TH1=(65536-100)/256; TL1=(65536-100)%256; } 附錄B:#include <reg52.h> #include <intrins.h> #include "nrf_rx.h" #define TX_ADDR_WITDH 5 //發(fā)送地址寬度設(shè)置為5個(gè)字節(jié) #define RX_ADDR_WITDH 5 //接收地址寬度設(shè)置為5個(gè)字節(jié) #define TX_DATA_WITDH 8 //發(fā)送數(shù)據(jù)寬度為8字節(jié) #define RX_DATA_WITDH 8 //接收數(shù)據(jù)寬度為8字節(jié) uchar sta; // 狀態(tài)變量 #define RX_DR (sta & 0x40) // 接收成功中斷標(biāo)志 #define TX_DS (sta & 0x20) // 發(fā)射成功中斷標(biāo)志 #define MAX_RT (sta & 0x10) // 重發(fā)溢出中斷標(biāo)志 uchar code TX_Addr[]={0x34,0x34,0x10,0x10,0x01}; //發(fā)送地址 uchar RX_Buffer[RX_DATA_WITDH]; //接收數(shù)據(jù)緩存 void _delay_us(uint x) { uint i,j; for (j=0;j<x;j++) for (i=0;i<12;i++); } void _delay_ms(uint x) { uint i,j; for (j=0;j<x;j++) for (i=0;i<120;i++); } void nRF24L01_Init(void) { _delay_us(2000); CE=0; CSN=1; SCK=0; // IRQ=1; } uchar SPI_RW(uchar byte) { uchar i; for(i=0;i<8;i++) { if(byte&0x80) MOSI=1; else MOSI=0; byte<<=1; SCK=1; if(MISO) byte|=0x01; SCK=0; } return byte; } uchar SPI_W_Reg(uchar reg,uchar value) { uchar status; CSN=0; status=SPI_RW(reg); SPI_RW(value); CSN=1; return status; } uchar SPI_R_byte(uchar reg) { uchar status; CSN=0; SPI_RW(reg); status=SPI_RW(0); CSN=1; return status; } uchar SPI_R_DBuffer(uchar reg,uchar *Dat_Buffer,uchar Dlen) { uchar reg_value,i; CSN=0; reg_value=SPI_RW(reg); for(i=0;i<Dlen;i++) { Dat_Buffer=SPI_RW(0); } CSN=1; return reg_value; } uchar SPI_W_DBuffer(uchar reg,uchar *TX_Dat_Buffer,uchar Dlen) { uchar reg_value,i; CSN=0; reg_value=SPI_RW(reg); for(i=0;i<Dlen;i++) { SPI_RW(TX_Dat_Buffer); } CSN=1; return reg_value; } /************************************************** 函數(shù):nRF24L01_Set_RX_Mode() 描述: 這個(gè)函數(shù)設(shè)置nRF24L01為接收模式,等待接收發(fā)送設(shè)備的數(shù)據(jù)包 /**************************************************/ void nRF24L01_Set_RX_Mode(void) { CE=0;//待機(jī) SPI_W_DBuffer(W_REGISTER+TX_ADDR,TX_Addr,TX_ADDR_WITDH); //寫寄存器指令+發(fā)送節(jié)點(diǎn)地址+地址寬度 SPI_W_DBuffer(W_REGISTER+RX_ADDR_P0,TX_Addr,TX_ADDR_WITDH); //為了接收設(shè)備應(yīng)答信號(hào),接收通道0地址與發(fā)送地址相同 SPI_W_Reg(W_REGISTER+EN_AA,0x01);//auot ack //使能接收通道0自動(dòng)應(yīng)答 SPI_W_Reg(W_REGISTER+EN_RX_ADDR,0x01); //接收通道0接收使能 SPI_W_Reg(W_REGISTER+SETUP_RETR,0x0f); //延時(shí)250+86us 自動(dòng)重發(fā)15次 SPI_W_Reg(W_REGISTER+RX_PW_P0,RX_DATA_WITDH); //設(shè)置接收數(shù)據(jù)寬度 SPI_W_Reg(W_REGISTER+RF_CH,0); //設(shè)置信道 SPI_W_Reg(W_REGISTER+RF_SETUP,0x07); // 數(shù)據(jù)傳輸率1Mbps,發(fā)射功率0dBm,低噪聲放大器增益 SPI_W_Reg(W_REGISTER+CONFIG,0x0f); // CRC使能,16位CRC校驗(yàn),上電,接收模式 CE=1; _delay_ms(5); } uchar nRF24L01_RX_Data(void) { sta=SPI_R_byte(R_REGISTER+STATUS); if(RX_DR) //如果接收成功 { CE=0; SPI_R_DBuffer(R_RX_PLOAD,RX_Buffer,RX_DATA_WITDH); //將數(shù)據(jù)讀入接收緩存 SPI_W_Reg(W_REGISTER+STATUS,0xff); //清除狀態(tài)標(biāo)志 CSN=0; SPI_RW(FLUSH_RX); // 清除RX FIFO寄存器 CSN=1; return 1; } else return 0; } /* void main(void) { P0=0xff; P1=0xff; P2=0xff; P3=0xff; _delay_us(1000); nRF24L01_Init(); while(1) { nRF24L01_Set_RX_Mode(); //設(shè)置為接收模式 _delay_ms(100); if(nRF24L01_RX_Data()) //判斷是都接收到數(shù)據(jù) { LED=0;//如果有數(shù)據(jù)收到燈亮 P0=RX_Buffer[0]; } else//否則燈熄 LED=1; } } */
|