找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 9083|回复: 6
收起左侧

基于51单片机的无线遥控小车设计[附发射接收程序]

  [复制链接]
ID:256970 发表于 2019-5-5 00:11 | 显示全部楼层 |阅读模式
基于51单片机的无线遥控小车设计
(附发射接收程序)
关于遥控小车,网上的资料很多,有蓝牙的、有WIFI的、有红外的、还有单片机+PT2262/PT2272编解码芯片的等等,动不动就上演智能小车的节奏,什么避障、什么循迹,讲半天云里雾里的,还不知道真正的遥控在哪里。如果只是需要小车进行简单的前后左右停止操作,需要那么麻烦吗?1.蓝牙版的需要手机APP和蓝牙接收模块(一般十几元,加运费的话也得二十了),另外遥控范围有限,一般在10米以内;2.WIFI版的,难到小车只在有网的地方跑吗?况且WIFI接收模块也不便宜吧;3.红外版的,遥控器只能对着小车遥控,又不是电视机(搁那一直不动),用红外遥控器的,不知道怎么想的;4.还有单片机+PT2262/PT2272编解码芯片的,这个让我不能理解的是既然已经有单片机了,还要编解码芯片做什么呢?好了,话不多说,现在给大家来一款51单片机版(不需要编解码芯片)的无线遥控小车设计,电路原理图及实物照片如下图:


另外需要说明的是,发射接收模块需要自己各接上17cm长的导线作为天线,小车电源的话用一节可充电的锂电池就好,容量最好大一点,小车跑的时间就能长一些,或者把以前不用的手机上的锂电池拆下来接上也可以!遥控器电源采用2节3V(2032的)钮扣电池就可以了。


以下是遥控小车程序代码:
  1. /***************************************************************/
  2. /*【基于51单片机的无线遥控小车设计】
  3. /***************************************************************/
  4. /*发射部分*/
  5. #include"STC15F104E.H"
  6. #define uchar unsigned char
  7. sbit K0=P3^5;//S4,停止
  8. sbit K1=P3^4;//S5,前进
  9. sbit K2=P3^1;//S2,后退
  10. sbit K3=P3^2;//S1,左转
  11. sbit K4=P3^0;//S3,右转
  12. sbit TX=P3^3;

  13. void delay_315()
  14. {
  15.         uchar i,j;
  16.         for(i=0;i<10;i++)
  17.                 for(j=0;j<110;j++);
  18. }

  19. void main()
  20. {
  21.         uchar i;
  22.         bit dong=0;                       
  23.         TMOD=0X01;                        //开定时器0中断
  24.         TH0=(65536-100)/256;
  25.         TL0=(65536-100)%256;
  26.         EA=1;
  27.         ET0=1;
  28.         TR0=1;
  29.         EX0=1;
  30.         IT0=1;

  31.         TX=0;
  32.         while(1)                                                 
  33.         {
  34.                 if(K0==0)                //发送指令0
  35.                 {
  36.                         delay_315();
  37.                         while(K0==0){ v0();v0();v0();m=0;while(m<40);}
  38.                         }               
  39.                                                                                                                                                                                                                                     
  40.                 if(K1==0)                //发送指令1
  41.                 {
  42.                         delay_315();
  43.                         while(K1==0){ v0();v0();v1();m=0;while(m<40);}
  44.                         }                                                       
  45.                                                                                                                                                                
  46.                 if(K2==0)
  47.                 {
  48.                         delay_315();
  49.                         while(K2==0){ v0();v1();v0();m=0;while(m<40);}
  50.                 dong=1;                       
  51.                 }

  52.                 if(K3==0)
  53.                 {
  54.                         delay_315();
  55.                         while(K3==0){ v0();v1();v1();m=0;while(m<40);}
  56.                 dong=1;       
  57.                 }

  58.                 if(K4==0)
  59.                 {
  60.                         delay_315();
  61.                         while(K4==0){ v1();v0();v0();m=0;while(m<40);}
  62.                 dong=1;       
  63.                 }


  64.                 if(dong==1)
  65.                 {
  66.                         dong=0;
  67.                         for(i=0;i<5;i++)
  68.                         { v0();v0();v0();m=0;while(m<40);
  69.                         delay_315(); }
  70.                
  71.                  }

  72.         }

  73. }
  74. /*
  75. void EXINT_0() interrupt 0
  76. {
  77.                 delay_315();
  78.                 if(K7==0)                //发送指令1
  79.                 {

  80.                 delay_315();
  81.                 while(K7==0){v3();v2();v0();v0();v1();m=0;while(m<40);}
  82.                 delay_315();
  83.        
  84.         //                dong=1;         
  85.                 }
  86. }
  87. */
  88. void timer0() interrupt 1
  89. {
  90.         TH0=(65536-100)/256;
  91.         TL0=(65536-100)%256;
  92.         m++;
  93.         TF0=0;
  94. }





  95. /***************************************************************/
  96. /*【基于51单片机的无线遥控小车设计】
  97. /***************************************************************/
  98. /*接收部分*/
  99. #include"STC15F104E.H"
  100. #define uchar unsigned char
  101. sbit RX=P3^3;        //定义接收脚

  102. sbit LED=P3^5;        //定义继电器端

  103. sbit IN1=P3^0;        //电机驱动L
  104. sbit IN2=P3^1;        //电机驱动L
  105. sbit IN3=P3^2;        //电机驱动R
  106. sbit IN4=P3^4;        //电机驱动R



  107. //void delay10ms(unsigned char a);


  108. //小车动作函数
  109. void run()//前进
  110. {
  111.         IN1=1;//左电机往前走
  112.         IN2=0;
  113.        
  114.         IN3=1;//右电机往前走
  115.         IN4=0;
  116. }
  117. void backrun()//后退
  118. {
  119.         IN1=0;//左电机往后走
  120.         IN2=1;
  121.        
  122.         IN3=0;//右电机往后走
  123.         IN4=1;
  124. }
  125. /*
  126. void leftrun()//左前
  127. {
  128.         IN1=0;//左电机往后走
  129.         IN2=0;
  130.        
  131.         IN3=1;//右电机往前走
  132.         IN4=0;
  133. }
  134. void rightrun()//右前
  135. {
  136.         IN1=1;//左电机往前走
  137.         IN2=0;
  138.        
  139.         IN3=0;//右电机往后走
  140.         IN4=0;
  141. }
  142. */
  143. void lefturn()//左转
  144. {
  145.         IN1=0;//左电机往后走
  146.         IN2=1;
  147.        
  148.         IN3=1;//右电机往前走
  149.         IN4=0;
  150. }
  151. void righturn()//右转
  152. {
  153.         IN1=1;//左电机往前走
  154.         IN2=0;
  155.        
  156.         IN3=0;//右电机往后走
  157.         IN4=1;
  158. }
  159. void stop()//停止
  160. {
  161.         IN1=0;//左电机停止
  162.         IN2=0;
  163.        
  164.         IN3=0;//右电机停止
  165.         IN4=0;
  166. }



  167. uchar m,flag,x,y;
  168. bit n;
  169. //PCON2=0X00;
  170. void main()
  171. {
  172. //        P3M1 = 0x00;
  173. //    P3M1 = 0xFF;

  174.         uchar a,b,c,p=0;   //定义存取的数据
  175.         TMOD=0X01;
  176.         TH0=(65536-100)/256;   //开定时器0
  177.         TL0=(65536-100)%256;
  178.         EA=1;         //开总中断
  179.         ET0=1;         //开定时器0中断
  180.         TR0=1;         //启动定时器0工作
  181.         EX1=1;         //允许外部中断INT1
  182.         IT1=1;         //外部中断INT1为下降沿触发方式
  183.         p=0;
  184.         x=0;
  185.         LED=1;
  186.         while(1)
  187.         {
  188.         if(n==1)
  189.         {                               
  190. p=a+b+c;
  191.                                         x++;
  192.                                         if(x==1)y=p;
  193. //                                        delay10ms(1);
  194.                                         if(x==2)
  195.                                         {
  196.                                                 x=0;
  197.                                                 if(y==p)
  198.                                                 {
  199.                                         //        P2=p;delay100ms(8); P2=0XFF;
  200.                                                         switch(p)
  201.                                                         {
  202.                                                                 case 0:stop();break;        //停止
  203.                                                                 case 1:run()break;
  204.                                                                 case 2:backrun();break;
  205.                                                                 case 3:lefturn();break;
  206.                                                                 case 4:righturn();break;
  207.                                                 //                case 5:lefturn();break;
  208.                                                 //                case 6:righturn();break;
  209.                                                  //                case 7:LED = 1;delay100ms(1); break;
  210.                                                                 default:stop();LED = 1;break;
  211.                                                         }
  212.                                                 }       
  213.                                         }
  214.                                 //        stop();LED = 1;
  215.                                 }
  216.                           
  217.                         }                       
  218.                 }               
  219.         }
  220. }
  221. /*
  222. void delay10ms(unsigned char a)
  223. {
  224.     unsigned char i,j,k;
  225.     for(i=a;i>0;i--)
  226.     for(j=20;j>0;j--)
  227.     for(k=248;k>0;k--);
  228. }
  229. */
  230. void timer0() interrupt 1
  231. {
  232.          
  233.         TH0=(65536-100)/256;
  234.         TL0=(65536-100)%256;
  235.         m++;
  236.   //  x++;
  237.        
  238.         TF0=0;
  239. }

  240. void INT_1() interrupt 2
  241. {
  242.         n=1;
  243. }
复制代码

评分

参与人数 1黑币 +80 收起 理由
admin + 80 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:407374 发表于 2019-5-5 10:14 | 显示全部楼层
这也不是用的51啊
回复

使用道具 举报

ID:320226 发表于 2019-6-13 22:29 | 显示全部楼层
楼主 你好.你的程序翻译不通过啊
回复

使用道具 举报

ID:695961 发表于 2022-4-4 10:35 | 显示全部楼层
哥们,您这发射接收模块用的是什么呢?
回复

使用道具 举报

ID:673647 发表于 2022-7-13 15:45 | 显示全部楼层
谢谢分享,原理图好像不完整啊?请问有完整的图吗?包括发射接收的?
回复

使用道具 举报

ID:66287 发表于 2022-8-3 16:02 | 显示全部楼层
大神,像 v0();这类,你在哪定义的?
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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