找回密码
 立即注册

QQ登录

只需一步,快速开始

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

自制遥控机器人的单片机代码

[复制链接]
跳转到指定楼层
楼主
可以遥控捡东西,用手机蓝牙软件控制移动,也可以让它自主捡东西,红外避障,外加pwm调速


单片机源程序如下:
  1. /**************************************************************************************
  2. *                              LED流水灯实验                                                                                                  *
  3. 实现现象:下载程序后LED呈现流水灯效果进行左移右移滚动
  4. 注意事项:无       
  5. 手机遥控时按键设置如下:
  6. 前进 1 0
  7. 后退 2 0
  8. 左转 3 0
  9. 右转 4 0
  10. 发球 7 8
  11. 收球 5 6
  12. ***************************************************************************************/

  13. #include "reg52.h"                         //此文件中定义了单片机的一些特殊功能寄存器
  14. #include<intrins.h>                //因为要用到左右移函数,所以加入这个头文件

  15. typedef unsigned int u16;          //对数据类型进行声明定义
  16. typedef unsigned char u8;

  17. sbit L_11=P1^4;
  18. sbit L_12=P1^5;
  19. sbit R_21=P1^6;
  20. sbit R_22=P1^7;       

  21. sbit shou1=P2^2;
  22. sbit shou2=P2^3;

  23. sbit fa1=P2^6;
  24. sbit fa2=P2^7;

  25. sbit left_PWM1=P1^5;
  26. sbit right_PWM2=P1^7;
  27. sbit shou_PWM=P2^3;   //定义PWM端口

  28. sbit led1=P1^0;
  29. sbit led2=P1^1;
  30. sbit led3=P1^2;




  31. u16 timer1,timer2,timer3;

  32. #define left_run {L_11=0,L_12=1;}       //左轮正转
  33. #define left_down {L_11=1,L_12=0;}      //左轮反转
  34. #define left_stop {L_11=1,L_12=1;}      //左轮停止
  35. #define right_run {R_21=0,R_22=1;}      //右轮正转
  36. #define right_down {R_21=1,R_22=0;}     //右轮反转
  37. #define right_stop {R_21=1,R_22=1;}     //右轮停止

  38. #define shou_run {shou1=0,shou2=1;}
  39. #define shou_stop {shou1=1,shou2=1;}

  40. #define fa_run {fa1=0,fa2=1;}
  41. #define fa_stop {fa1=1,fa2=1;}



  42. /*******************************************************************************
  43. * 函 数 名         : delay
  44. * 函数功能                   : 延时函数,i=1时,大约延时10us
  45. *******************************************************************************/

  46. void delay(u16 k)
  47. {
  48.         while(k--);
  49. }

  50. void Timer1Init()   //定时器初始化
  51. {
  52.         TMOD|=0x01;      //选择定时器1模式,工作方式1
  53.         TH0=0xFE;       //赋初值,定时0.5ms
  54.         TL0=0x0C;
  55.         ET1=1;           //打开定时器1中断允许
  56.         EA=1;             //打开总中断
  57. //        TR1=1;           //打开定时器
  58. }

  59. void UsartInit()
  60. {
  61. //        P2=0xff;
  62.         SCON=0X50;                        //设置为工作方式1
  63.         TMOD=0X20;                        //设置计数器工作方式2
  64.         PCON=0X80;                        //波特率加倍
  65.         TH1=0XF3;                                //计数器366初始值设置,注意波特率是4800的
  66.         TL1=0XF3;
  67.         IP=0X10;
  68.         ES=1;                                                //打开接收中断
  69.         EA=1;                                                //打开总中断
  70.         TR1=1;                                        //打开计数器
  71. }


  72. void left_PWM_fan(u16 j)         //PWM控制左轮转速
  73. {
  74.         u16 timer1;
  75.         for(timer1=0;timer1<100;timer1++)
  76.         {
  77.                 if(timer1>100)          //PWM周期100*定时器周期
  78.                 {
  79.                         timer1=0;
  80.                 }
  81.                 if(timer1<j)           //调节占空比
  82.                 {
  83.                         left_PWM1=0;
  84.        
  85.                 }
  86.                 else
  87.                 {
  88.                         left_PWM1=1;
  89.        
  90.                 }
  91.         }
  92. }
  93. void shouq_PWM(u16 t)         //PWM控制左轮转速
  94. {
  95.         u16 timer3;
  96.         for(timer3=0;timer3<200;timer3++)
  97.         {
  98.                 if(timer3>200)          //PWM周期100*定时器周期
  99.                 {
  100.                         timer3=0;
  101.                 }
  102.                 if(timer3<t)           //调节占空比
  103.                 {
  104.                         shou_PWM=1;
  105.        
  106.                 }
  107.                 else
  108.                 {
  109.                         shou_PWM=0;
  110.        
  111.                 }
  112.         }
  113. }
  114. void left_PWM_zheng(u16 k)         //PWM控制左轮转速
  115. {
  116.         u16 timer1;
  117.         for(timer1=0;timer1<100;timer1++)
  118.         {
  119.                 if(timer1>100)          //PWM周期100*定时器周期
  120.                 {
  121.                         timer1=0;
  122.                 }
  123.                 if(timer1<k)           //调节占空比
  124.                 {
  125.                         left_PWM1=1;
  126.        
  127.                 }
  128.                 else
  129.                 {
  130.                         left_PWM1=0;
  131.        
  132.                 }
  133.         }
  134. }

  135. void right_PWM_fan(u16 q)         //PWM控制右轮转速
  136. {
  137.         u16 timer2;
  138.         for(timer2=0;timer2<100;timer2++)
  139.         {
  140.                 if(timer2>100)
  141.                 {
  142.                         timer2=0;
  143.                 }
  144.                 if(timer2<q)
  145.                 {
  146.        
  147.                         right_PWM2=0;
  148.                 }
  149.                 else
  150.                 {

  151.                         right_PWM2=1;
  152.                 }
  153.         }
  154. }
  155. void right_PWM_zheng(u16 w)         //PWM控制右轮转速
  156. {
  157.         u16 timer2;
  158.         for(timer2=0;timer2<100;timer2++)
  159.         {
  160.                 if(timer2>100)
  161.                 {
  162.                         timer2=0;
  163.                 }
  164.                 if(timer2<w)
  165.                 {
  166.        
  167.                         right_PWM2=1;
  168.                 }
  169.                 else
  170.                 {

  171.                         right_PWM2=0;
  172.                 }
  173.         }
  174. }
  175. /*******************************************************************************
  176. 需要改的数据中,所有含pwm的为调速所用
  177. 其余的为转动角度或者行走距离
  178. 传送带的速度到时候看情况,实在不会找一波或我
  179. *******************************************************************************/
  180. ////////////////需要改的数字在left1循环里面,一共2个数字
  181. void left1(u16 i)             //调轮子转速
  182. {
  183.         while(i--)
  184.         {
  185.           left_down;
  186.         left_PWM_fan(95);
  187.         right_run;
  188.         right_PWM_zheng(95);

  189.         }
  190. }
  191. void shouqiu()        //调风扇及传送带速度
  192. {
  193.                                 shou_run;
  194.                 shouq_PWM(120);
  195. }

  196. void shouqiuting()        //调风扇及传送带速度
  197. {
  198.                                 shou_stop;

  199. }
  200. void faqiu()
  201. {
  202.        
  203.         fa_run;
  204. }
  205. void fating()
  206. {
  207.         fa_stop;
  208. }
  209. ////////////////需要改的数字在right1循环里面,一共2个数字
  210. void right1(u16 i)         //调轮子转速
  211. {
  212. while(i--)
  213. {
  214.                           left_run;
  215.         left_PWM_zheng(95);
  216.         right_down;
  217.         right_PWM_fan(95) ;

  218. }
  219.        
  220. }

  221. void stop()       //停止
  222. {

  223.        
  224.           left_stop;
  225.           right_stop;
  226.        
  227. }
  228. /////////////////需要改的数字在down1循环里面,一共2个数字
  229. void down1(u16 i)       //调轮子转速
  230. {
  231.   while(i--)
  232.         {
  233.         left_down;
  234.         left_PWM_fan(78);
  235.         right_down;
  236.         right_PWM_fan(78) ;

  237.         }
  238. }
  239. ////////////////////////////////需要改的数字在run1循环里面,一共2个数字
  240. void run1()
  241. {

  242.                           left_run;
  243.         left_PWM_zheng(78);
  244.        
  245.         right_run;
  246.         right_PWM_zheng(78) ;

  247.        
  248. }

  249. void run2(u16 i)
  250. {
  251. while(i--)
  252. {
  253.                           left_run;
  254.         left_PWM_zheng(78);
  255.        
  256.         right_run;
  257.         right_PWM_zheng(78) ;
  258. }
  259. }
  260. void hongwai()
  261. {
  262.                                 if(led1==1&&led2==1&&led3==1)
  263.                         {
  264.                                 delay(10);
  265.                                 if(led1==1&&led2==1&&led3==1)
  266.                         {
  267.         run1();
  268.                                 delay(20);
  269.                         }
  270.                         }
  271.                         if(led1==1&&led2==0&&led3==1)
  272.                         {
  273.                                 delay(10);
  274.                                 if(led1==1&&led2==0&&led3==1)
  275.                                 {
  276.                                 left1(298);                    //转动角度
  277.                                 run1();
  278.                                                 delay(20);
  279.                                 }
  280.                         }
  281.                         if(led1==1&&led2==1&&led3==0)
  282.                         {
  283.                                 delay(10);
  284.                                 if(led1==1&&led2==1&&led3==0)
  285.                         {
  286.                                 right1(298);                       //转动角度
  287.                                 run1();
  288.                                         delay(20);
  289.                         }
  290.                 }
  291.                         if(led1==1&&led2==0&&led3==0)
  292.                         {
  293.                                 delay(10);
  294.                                 if(led1==1&&led2==0&&led3==0)
  295.                         {
  296.                                 right1(298);                       //转动角度
  297.                                 run1();
  298.                                         delay(20);
  299.                         }
  300.                 }
  301. //                                else
  302. //                {
  303. //                        down1(150);                        //后退距离
  304. //                        left1(400);                       //转动角度
  305. //                        run1();
  306. //          }
  307.                                         if(led1==0&&led2==1&&led3==1)
  308.                         {
  309.                                 delay(10);
  310.                                 if(led1==0&&led2==1&&led3==1)
  311.                         {
  312.                    down1(150);                        //后退距离
  313.                         left1(400);                       //转动角度
  314.                         run1();
  315.                                 delay(20);
  316.                         }
  317.                         }
  318.                         if(led1==0&&led2==0&&led3==1)
  319.                         {
  320.                                 delay(10);
  321.                                 if(led1==0&&led2==0&&led3==1)
  322.                                 {
  323.                                                    down1(150);                        //后退距离
  324.                            left1(400);                       //转动角度
  325.                             run1();
  326.                                                 delay(20);
  327.                                 }
  328.                         }
  329.                         if(led1==0&&led2==1&&led3==0)
  330.                         {
  331.                                 delay(10);
  332.                                 if(led1==0&&led2==1&&led3==0)
  333.                         {
  334.                                                    down1(150);                        //后退距离
  335.                         left1(400);                       //转动角度
  336.                         run1();
  337.                                         delay(20);
  338.                         }
  339.                 }
  340.                         if(led1==0&&led2==0&&led3==0)
  341.                         {
  342.                                 delay(10);
  343.                                 if(led1==0&&led2==0&&led3==0)
  344.                         {
  345.                                                    down1(150);                        //后退距离
  346.                         left1(400);                       //转动角度
  347.                         run1();
  348.                                         delay(20);
  349. }
  350. }
  351. }
  352. ///////////////////////////////////////////////////////////需要改的数字在while循环里面,一共四个数字
  353. void main()
  354. {
  355.         Timer1Init();
  356.         UsartInit();
  357.                 shouqiu();
  358.         while(1)
  359.         {
  360.      hongwai();
  361.                         }
  362.                 }
  363.        


  364. void Time0() interrupt 1     //中断函数
  365. {
  366.         TH0=0xFE;
  367.         TL0=0x0C;
  368.         timer1++;
  369.         timer2++;
  370.         timer3++;
  371.        
  372. }

  373. void Usart() interrupt 4
  374. {// unsigned int i;
  375.         u8 receiveData;
  376.         RI = 0;//清除接收中断标志位
  377.         receiveData=SBUF;//出去接收到的数据
  378.         SBUF=receiveData;//将接收到的数据放入到发送寄存器
  379.         switch(receiveData)
  380.                 {
  381.                 case '1':run2(50);break;//0xfe的字符码
  382.                 case '7':faqiu();break;
  383.                         case '8':fating();break;
  384.                         case '2':down1(50);break;
  385.                         case '5':shouqiu();break;
  386.                         case '3':left1(50);break;
  387.                         case '6':shouqiuting();break;
  388.                         case '4':right1(50);break;                       
  389.                         case '0':stop();break;

  390.                 }
  391. ////                ES=1;
  392.           TI=0;                                                 //清除发送完成标志位
  393. }       
复制代码

所有资料51hei提供下载:
sds.zip (52.77 KB, 下载次数: 8)



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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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