没发过什么帖子 ,打字就不多了,用图片来解释:
遥控发射模块
小车模型
此小车用STC8A8K64S4A12作为控制芯片,也是51内核,对玩小车的人来说 移植也是比较简单的。这里我没有自己做一个遥控器,用2个8A8K的开发板做收发遥控 玩玩就行了。发射模块上我用模拟量遥控制,用的是板子上2.5V的基准电压。一开始用了超声波测距,还用了舵机云台再180度角内转动并连续测距里,但是后面添加2.4G后,发现大部分时间被超声波测距占用了,导致2.4G反应迟钝,于是屏蔽了超声波,反应速度立马提高。在显示方面,本来用了SPI的协议,可以黑白反显,但是2.4G也是SPI,就改成了IIC,所以没有黑白反显的功能了。
制作出来的实物图如下:
直接附上程序吧
#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;
// }
}
}
全部资料51hei下载地址:
nRF24L01无线发射(硬件SPI)OLED.zip
(5.39 MB, 下载次数: 142)
|