沒發過什么帖子 ,打字就不多了,用圖片來解釋:
遙控發射模塊
小車模型
此小車用STC8A8K64S4A12作為控制芯片,也是51內核,對玩小車的人來說 移植也是比較簡單的。這里我沒有自己做一個遙控器,用2個8A8K的開發板做收發遙控 玩玩就行了。發射模塊上我用模擬量遙控制,用的是板子上2.5V的基準電壓。一開始用了超聲波測距,還用了舵機云臺再180度角內轉動并連續測距里,但是后面添加2.4G后,發現大部分時間被超聲波測距占用了,導致2.4G反應遲鈍,于是屏蔽了超聲波,反應速度立馬提高。在顯示方面,本來用了SPI的協議,可以黑白反顯,但是2.4G也是SPI,就改成了IIC,所以沒有黑白反顯的功能了。
制作出來的實物圖如下:
IMG_20181210_170531.jpg (959.45 KB, 下載次數: 80)
下載附件
整體圖片
2018-12-11 21:35 上傳
IMG_20181210_170311.jpg (890.3 KB, 下載次數: 93)
下載附件
小車顯示模塊
2018-12-11 21:35 上傳
IMG_20181210_165051.jpg (968.34 KB, 下載次數: 86)
下載附件
遙控發射器
2018-12-11 21:33 上傳
直接附上程序吧
#include "oled.h"
#include "pwm.h"
#include "delay.h"
#include "dingshiqi.h"
#include "csb.h"
#include "NRF24L01.h"
extern uint8 RxPayload[32]; //無線接收緩存
extern uint8 flag,sudu,CSB;
/***************************************************************************
* 描 述 : 主函數
* 入 參 : 無
* 返回值 : 無
**************************************************************************/
int main() //主函數
{
static uint16 n1,n2;
//static uint16 c;
uint8 i;
bit kai=1;
n1=50;
n2=50;
P0M1=0x00; //推挽輸出
P0M0=0xC0;
// Timer1Init();
// Timer0Init(); //TO定時器是超聲波
PWM0_Configuration(); //控制舵機的
PWM1_Configuration(); //控制舵機的
EA=1;
Init_NRF24L01_MA(); //初始化
Set_RxMode_MA(); //配置nRF24L01為接收模式
delay_ms(150);
OLED_Init() ;
OLED_Fill(0x00); //清屏
for(i=0;i<8;i++)
{
LCD_P16x16Ch(i*16,0,i);
};
for(i=8;i<11;i++)
{
LCD_P16x16Ch(i*16-16*8,4,i);
};
for(i=15;i<18;i++)
{
LCD_P16x16Ch(i*16-16*15,2,i);
};
LCD_P8x16Str(48, 2,":");
LCD_P8x16Str(48, 4,":");
LCD_P8x16Str(80, 4,"'C");
LCD_P8x16Str(0, 6,"PWMY:");
CSZX(90); //超聲波的控制舵機角度
XCZX(90); //轉向角的控制舵機角度
delay_ms(1500); //讓舵機有時間轉到中間
while(1)
{
if(NRF24L01_RxPacket_MA(RxPayload)==RX_OK)
if(RxPayload[0] == 0x01) //檢驗校驗碼
{
while( !(NRF24L01_RxPacket_MA(RxPayload+1)==RX_OK)); //等待接收數據
while( !(NRF24L01_RxPacket_MA(RxPayload+2)==RX_OK)); //等待接收數據
while( !(NRF24L01_RxPacket_MA(RxPayload+3)==RX_OK)); //等待接收數據
}
if(RxPayload[0] == 0x01 && RxPayload[3] == 0x02) //符合校驗碼的值 ,則中間的數據是正確的,不然亂碼,錯位的數據就不對
{
n1=RxPayload[1];
n2=RxPayload[2];
RxPayload[0] = 0;
RxPayload[1] = 0;
RxPayload[2] = 0;
RxPayload[3] = 0;
}
XCZX(75+15*n1/50);
if(n2<48)moter(0,(49-n2)*80/45);
else if(n2<52) moter(0,0);
else moter(1,(n2-52)*80/45);
// CSBZX_(); //控制超聲波舵機轉向的
// if(CSB==1) //超聲波測距
// {
// StartModule(); //啟動HC-SR04模塊 (控制控制口發一個10uS以上的高電平)
// while(!ECHO); //當HC-SR04模塊的接收端ECHO為低電平時,程序執行空語句,即等待ECHO端口變為高電平才執行下面的語句
// TR0=1; //當HC-SR04模塊的接收端ECHO為高電平時,開啟定時器0計數
// while(ECHO); //若HC-SR04模塊的接收端ECHO仍為高電平,程序執行空語句,即等待ECHO端口變為低電平才執行下面的語句
// TR0=0; //當HC-SR04模塊的接收端ECHO變為低電平時,關閉定時器0
// c=Conut(); //計算距離并在oled屏上顯示
// CSB=0;
//
// if(c<=400) {moter(0,10);kai=0;}
// else kai=1;
// }
}
}
0.png (36.61 KB, 下載次數: 84)
下載附件
2018-12-12 01:30 上傳
全部資料51hei下載地址:
nRF24L01無線發射(硬件SPI)OLED.zip
(5.39 MB, 下載次數: 142)
2018-12-11 21:54 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|