找回密码
 立即注册

QQ登录

只需一步,快速开始

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

51单片机循迹小车制作总结 附程序源码

[复制链接]
跳转到指定楼层
楼主
ID:83710 发表于 2015-6-23 19:05 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 hongniu 于 2015-6-23 19:08 编辑

我的循迹小车历经两整天,两晚的奋战终于与今天下午巡迹成功了,总结一下我最大的收获就是:抓住关键点,结点事件,先把最关键的问题加以解决,以后联调试时会很快的,还有一点,别人的东西不一定是对的,即使他做过,你要综合各方面的信息,做出自己的判断,还有就是手册的重要性,这是一个思考问题、发现问题、解决问题的过程,很苦燥,但是结果是很甜的,就像做出了一道数学题,还是那句话:即使一小步,也有新高度


程序源码:
  1. #include<reg52.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. sbit p0_0=P0^0;
  5. sbit p0_7=P0^7;

  6. sbit p1_7=P0^7;




  7. sbit EN1=P1^2;//m1脉冲输入
  8. sbit EN2=P1^5;//m2脉冲输入
  9. //*****************************
  10. sbit HW1=P2^0;//加建
  11. sbit HW2=P2^1;//减键  m1
  12. //***************************
  13. sbit p2_2=P2^2;
  14. sbit p2_3=P2^3;
  15.        // m2
  16. //*********************
  17. sbit p1_3=P1^3;
  18. sbit p1_4=P1^4;  //M2转向组合
  19. //******************************
  20. sbit p1_1=P1^1;
  21. sbit p1_0=P1^0;    //M1转向组合
  22. //*****M1***********************************************
  23. uint t=100;  //载波周期
  24. uint time0; // 低电平可按键调整量 我这里是 把周期和低电平设为一个是程序内可调,一个是程序外可调而高电平是死的,也可以反之是一样的
  25. uint time1; // 高点平基准量
  26. uint timeing0;//立即低电平动态变量
  27. uint timeing1; //立即高电平动态变量  
  28. //*****M2****************
  29. //uint t=500;  //载波周期
  30. uint time_0; // 低电平可按键调整量 我这里是 把周期和低电平设为一个是程序内可调,一个是程序外可调而高电平是死的,也可以反之是一样的
  31. uint time_1; // 高点平基准量
  32. uint timeing_0;//立即低电平动态变量
  33. uint timeing_1; //立即高电平动态变量
  34. //********传感器中间变量定义****************************

  35.    uchar middate,middate1,middate2;



  36. //********************************
  37. //void delay(uint z) //延时1ms程序
  38. //{
  39. //uint x,a,b;
  40. //        for (x=0;x<z;x++)
  41. //  
  42.   //     {
  43. //       for(b=120;b>0;b--)
  44. //    {
  45.   //      for(a=3;a>0;a--);
  46. //   
  47. //             }
  48. //    }
  49.   //

  50. // }

  51. void stop() //停止函数    停止     HW1=HW2=0;
  52. {

  53.   EA=0;  //禁止中断
  54.   EN1=0;
  55.   EN2=0;







  56. }
  57. void goon()//               直着走      HW1=1=HW2;
  58. {

  59.   EA=1;
  60.   
  61.   time0=50;
  62.   time_0=50;
  63.   time1=50;
  64.   time_1=50;





  65. }
  66. void left()//向左转弯                         HW1=1;HW2=0;                 修改定时数据,实现实时PWM调制
  67. {
  68. EA=1;
  69.      
  70.    
  71.      
  72.             
  73.              //***************
  74.           time_0=50;
  75.          time_1=50;    // //通过调整左轮的转速来调整转弯力度,这里要配合传感器实时采集才行
  76.           time0=(time0-1);
  77.           time1=(t-time0);
  78.           //***********************
  79.           timeing0=0;
  80.           timeing1=0;
  81.         
  82.       

  83.       
  84.       
  85.         


  86.      
  87. }





  88.             
  89.   void right()//向右转弯        HW1=0;HW2=1;
  90. {
  91.     EA=1;
  92.    
  93.    
  94.    

  95.      
  96.            //***************
  97.            time0=50;
  98.           time1=50;      //通过调整右轮的转速来调整转弯力度,这里要配合传感器实时采集才行
  99.           time_0=(time_0-1);
  100.           time_1=(t-time_0);
  101.           //******************




  102.           timeing_0=0;
  103.           timeing_1=0;  //太关键了!这一步,因为不加的话,当再一次的time0被修改时timeing0,和timeing1不为0
  104.          //             所以才会发生错误,表现为波形时断时续,而且有尖锋脉冲,这都是没有在刷新TIME0的同时刷新tineing的后果
  105.          //             没想到很简单的一点事竟差点酿成PWM做不出来!真是有有教训了
  106.          //             2010年10月7日晚8:34分与天津开发区第四项目部宿舍1
  107.         
  108.         

  109.       
  110.       
  111.         


  112. }








  113. void InitTimer0(void) //10us 定时器初始化设置函数
  114. {
  115.     TMOD = 0x01;

  116.     TH0 =0xff;
  117.     TL0 =0xf7;
  118.     EA = 1;
  119.     ET0 = 1;
  120.     TR0 = 1;


  121. }

  122. void main(void)//主函数
  123. { P2=0x0f;
  124.     InitTimer0(); //10 us(可变啊,根据不同的精准度和频率要求)
  125. //************
  126.    p1_0=0;
  127.    p1_1=1;    //M2
  128.   
  129.   
  130.                     //决策转向
  131.    p1_3=1;
  132.    p1_4=0;  //M1
  133. //************
  134.    time0=50; //**************************************************************************************************************//
  135.    time1=50; //                            //
  136.   time_0=50; //                            //
  137.   time_1=50; //        通知                   //
  138.        //     L293B的8脚是要接>5V的,16脚要接5V,但是别人的不是这样的,我是看了手册,和失败后这样做的     //                       //
  139.     //   这里我用了周期是1000us的但是我的定时器是10us一次的所以我这里取t=100;表示我把周期分成100份    //
  140.     //    占空比(q)=高电平(time1)/周期(t);故而time1/100=占空比;            //
  141.     //    电压(u)=占空比*最大电压(Um)故而我的输出电压函数为:U0=Um*q =time1/100*5V(这里我用的是5v电压=Um)  //
  142.     //    根据上述公式可以算出MCU输出电压:例如:我要输出1.5V电压只要让time1=30即可,当然time0=70(保证频率不变) //
  143.     //            我要输出3V只要让time1=60,tim0=40;即可    呵呵呵呵       //
  144.     //             大概这也就是数模转换的原理吧         //
  145.     //                            //
  146.     //       2010年10月24日下午与天津第四项目部宿舍              //
  147.     //**************************************************************************************************************//



  148.   while(1) //主循环
  149.   {  



  150.       //***********************
  151.           middate=0x00;
  152.           middate1=0x00;
  153.     middate2=0x00;
  154.     middate1=HW1;     //传感器信号采集后处理
  155.    middate2=HW2;
  156.    CY=0;
  157.    middate2=(middate2<<1) ;
  158.    middate=(middate1+middate2) ;
  159.    // ****************************



  160.     switch(middate)   //转向关键步函数
  161.     {
  162.       case 3:{stop();break;     }//停止>>>>>>>>>>>>>>HW1=0=HW2;                                 
  163.    case 1:{left();break;     }//左转>>>>>>>>>>>>>>HW1=1;HW2=0;
  164.    case 2:{right();break;    }//右转>>>>>>>>>>>>>>HW1=0;HW2=1;
  165.    case 0:{goon();break;     }//直行>>>>>>>>>>>>>>HW1=1=HW2;
  166.    
  167.    
  168.    
  169.    
  170.    
  171.    
  172.     }























  173.   
  174.    }












  175. }

  176. void Timer0Interrupt(void) interrupt 1    //定时器中断函数生成PWM,接口单元为:time0(PWM1号低电平时间),time1(PWM1号高电平时间),time_0(PWM2号低电平时间),time_1(PWM2号高电平时间) ,t(周期)
  177. {                   //   MCU:P1.2是第一路PWM,P1.5是第二路PWM         
  178.    

  179.      if(time0==timeing0)
  180.   {
  181.         if(time1!=timeing1)
  182.      {     //高电平时间段
  183.    
  184.         TH0 =0xff;
  185.               TL0 =0xf7;
  186.           EN1=1;
  187.           timeing1++;
  188.    
  189.    
  190.    
  191.      }
  192.        //中断子函数(定时器参量修改)




  193.   }
  194.    else
  195.    if(time0!=timeing0)
  196.      {
  197.    TH0 =0xff;
  198.         TL0 =0xf7;
  199.     EN1=0;      //低电平时间段
  200.    timeing0++;
  201.       



  202.   }

  203.   if(time0==timeing0)
  204.   {
  205.   if(time1==timeing1)

  206.   {
  207.   
  208.    timeing0=0;
  209.    timeing1=0;
  210.   }

  211.   }

  212. //****************M2的************************************************************************************************************************************************************






  213.      if(time_0==timeing_0)
  214.   {
  215.         if(time_1!=timeing_1)
  216.      {     //高电平时间段
  217.    
  218.         TH0 =0xff;
  219.               TL0 =0xf7;
  220.           EN2=1;
  221.           timeing_1++;
  222.    
  223.    
  224.    
  225.      }
  226.        //中断子函数(定时器参量修改)




  227.   }
  228.    else
  229.    if(time_0!=timeing_0)
  230.      {
  231.    TH0 =0xff;
  232.         TL0 =0xf7;
  233.    EN2=0;      //低电平时间段
  234.    timeing_0++;
  235.       



  236.   }

  237.   if(time_0==timeing_0)
  238.   {
  239.   if(time_1==timeing_1)

  240.   {
  241.   
  242.    timeing_0=0;
  243.    timeing_1=0;
  244.   }

  245.   }
  246.   

  247.   
  248. }
复制代码






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

使用道具 举报

沙发
ID:129918 发表于 2017-1-11 21:04 | 只看该作者
图画的我给满分
回复

使用道具 举报

板凳
ID:200853 发表于 2017-5-15 10:18 | 只看该作者
楼主用的是哪些传感器
回复

使用道具 举报

地板
ID:198608 发表于 2017-5-16 20:44 | 只看该作者
看了你的图我还以为你是学画画的
回复

使用道具 举报

5#
ID:201562 发表于 2017-5-16 21:14 | 只看该作者
学习  学习
回复

使用道具 举报

6#
ID:33452 发表于 2017-8-15 18:25 | 只看该作者

学习  学习
回复

使用道具 举报

7#
ID:167884 发表于 2018-9-27 23:12 | 只看该作者
楼主的思路很好,值得参考
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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