找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机循迹小车源码(4对红外管、双黑线)

[复制链接]
跳转到指定楼层
楼主
ID:313679 发表于 2018-4-22 13:54 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
循迹小车源程序
单片机源程序如下:
  1. #include <reg52.h>

  2. #define  u16  unsigned int
  3. #define  u8   unsigned char

  4. sbit IN1=P1^0;
  5. sbit IN2=P1^1;
  6. sbit IN3=P1^2;
  7. sbit IN4=P1^3;

  8. sbit L_WXJ=P0^4;
  9. sbit L_NXJ=P0^5;
  10. sbit R_WXJ=P0^6;
  11. sbit R_NXJ=P0^7;

  12. sbit key4 = P3^7;
  13. sbit key3 = P3^6;
  14. sbit key2 = P3^5;
  15. sbit key1 = P3^4;

  16. u8 pp;

  17. char sum;


  18. sbit L_PWM=P1^4;
  19. sbit R_PWM=P1^5;


  20. #define  L_go          IN1=1;IN2=0    //左轮进
  21. #define  L_back        IN1=0;IN2=1    //左轮退
  22. #define  L_stop        IN1=0;IN2=0    //左轮停

  23. #define  R_go          IN3=1;IN4=0     //右轮进
  24. #define  R_back        IN3=0;IN4=1     //右轮退
  25. #define  R_stop        IN3=0;IN4=0     //右轮停止

  26. #define  car_go        L_go;R_go       //车向前进
  27. #define  car_back      L_back;R_back   //车倒退
  28. #define  car_stop      L_stop;R_stop   //车停止
  29. #define  car_lift      R_go;L_stop     //车左转
  30. #define  car_right     L_go;R_stop     //车右转


  31. #define  car_lift360   L_back;R_go     //可以理解为左大转弯
  32. #define  car_right360  R_back;L_go     //可以理解为右大转弯




  33. void delay(unsigned int t){               
  34.         while(t--);
  35. }

  36. void T0_Init()
  37. {
  38.         TMOD=0X01;
  39.         TH0=0XFC;      //定时器0实现1ms产生一次中断,若是设置10格调速,则PWM的周期就是10ms
  40.         TL0=0X07;
  41.         ET0=1;
  42.         TR0=1;
  43.         EA=1;
  44.        
  45. }

  46. void time0()interrupt 1
  47. {
  48.         TMOD=0X01;
  49.         TH0=0XFC;
  50.         pp++;
  51.   if(pp>9) pp=0;
  52.         if(sum!=0&&sum!=9)
  53.         {
  54.                 if(pp<=sum)
  55.         {        L_PWM=1;
  56.                 R_PWM=1;
  57.   }
  58.         else
  59.                 {
  60.                         L_PWM=0;
  61.                         R_PWM=0;
  62.     }
  63.         }
  64.         else if(sum==0)
  65.         {
  66.                 L_PWM=0;
  67.                         R_PWM=0;
  68.   }
  69.         else if(sum==9)
  70.         {
  71.                 L_PWM=1;
  72.                 R_PWM=1;
  73.   }       
  74. }

  75. /*void PWM_kandle()
  76. {                    //该函数实现不同等级的PWM频率,pp是产生中断的次数,pp<sum表示高电平的时间
  77.         if(pp>9) pp=0;
  78.         if(sum!=0&&sum!=9)
  79.         {
  80.                 if(pp<=sum)
  81.         {        L_PWM=1;
  82.                 R_PWM=1;
  83.   }
  84.         else
  85.                 {
  86.                         L_PWM=0;
  87.                         R_PWM=0;
  88.     }
  89.         }
  90.         else if(sum==0)
  91.         {
  92.                 L_PWM=0;
  93.                         R_PWM=0;
  94.   }
  95.         else if(sum==9)
  96.         {
  97.                 L_PWM=1;
  98.                 R_PWM=1;
  99.   }
  100.                
  101.                
  102. }*/
  103. /*若要实现两个轮子的转速不一致实现快速转小弯可使用一下程序
  104. u8 sum1,sum2;//定义两个变量  放到程序顶部
  105. void PWM_kandle()
  106. {
  107.         if(pp>9) pp=0;
  108.                 if(pp<=sum1)
  109.         {        L_PWM=1;
  110.                
  111.   }
  112.         else
  113.                 {
  114.                         L_PWM=0;
  115.                        
  116.     }
  117.         }
  118.         if(pp<=sum2)
  119.         {
  120.                         R_PWM=1;}
  121.         else
  122.   {
  123.    R_PWM=0;
  124.          }
  125.                
  126. }


  127. */


  128. void XJkabdle()
  129. {
  130.        
  131.         //while(1)
  132.         if(L_WXJ&&R_WXJ==0)
  133.                 {
  134.    car_lift360;
  135.                         }
  136.         else if(R_WXJ&&L_WXJ==0)
  137.         {car_right360;}
  138.         else if(L_NXJ&&R_NXJ)
  139.         {car_go;}
  140.         else if(L_NXJ)
  141.         {car_lift;}
  142.         else if(R_NXJ)
  143.         {car_right;}
  144.         else {car_stop;}

  145. }
  146. main()
  147. {
  148.         T0_Init();
  149.         sum=9;

  150.         while(1)
  151. {
  152.                         //PWM_kandle();
  153.          XJkabdle();
  154.    /* if(!key1)
  155.     {sum=2;
  156.     //XJkabdle();
  157.     }
  158.    else if(!key2)               
  159.          { sum=5;
  160.     //XJkabdle();
  161.     }
  162.          else if(!key3)
  163.          {sum=7;
  164.     //XJkabdle();
  165.    }
  166.          else if(!key4)
  167.          {sum=9;
  168.     //XJkabdle();
  169.    }
  170.          XJkabdle();
  171.   }
  172.         */
  173. }}
复制代码

所有资料51hei提供下载:
车寻迹(4对红外管、双黑线).zip (41.99 KB, 下载次数: 32)


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

使用道具 举报

沙发
ID:445186 发表于 2018-12-19 11:43 来自手机 | 只看该作者
谢谢楼主,学习了
回复

使用道具 举报

板凳
ID:525332 发表于 2019-5-10 18:40 | 只看该作者
请问有原理图吗
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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