找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5763|回复: 1
打印 上一主题 下一主题
收起左侧

STC8A8K64S4A12单片机2.4G遥控小车,模拟量摇杆 舵机超声波 OELD显示 附带程序哦

  [复制链接]
跳转到指定楼层
楼主
没发过什么帖子 ,打字就不多了,用图片来解释:
遥控发射模块

小车模型

此小车用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)


评分

参与人数 2黑币 +65 收起 理由
shineyunze978 + 15 很给力!
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏10 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:404695 发表于 2018-12-12 11:28 | 只看该作者
真的是超级超级棒啊,简直可以拿去参加飞思卡尔
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表