找回密码
 立即注册

QQ登录

只需一步,快速开始

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

51单片机循迹避障小车系统原理图程序

[复制链接]
跳转到指定楼层
楼主
寻迹避障 小车 ,经典物件 !

制作出来的实物图如下:


电路原理图如下:


单片机源程序如下:
  1. #include <oled.h>
  2. #include <reg51.h>                                                                //51通用头文件        
  3. #include <intrins.h>


  4. void delay(unsigned char sss)
  5. {
  6.   while(sss--);
  7. }


  8. sbit PWM=P1^2;//  P1.0输出pwm
  9. sbit sd=P1^3;//  P1.0输出pwm
  10. char time,ct;  // 定义占空比的变量
  11. int d,a,dw,ks=0;
  12. int y=2,z=2;
  13. int xs=220;

  14. sbit AIN2 =P2^4;        
  15. sbit AIN1 =P2^3;  
  16. sbit BIN2 =P2^5;        
  17. sbit BIN1 =P2^6;  
  18. sbit zuo =P1^0;        
  19. sbit you =P1^1;  
  20. sbit hw  =P2^0;

  21. void Delay100ms()                //@11.0592MHz
  22. {
  23.         unsigned char i, j, k;


  24.         i = 5;
  25.         j = 52;
  26.         k = 195;
  27.         do
  28.         {
  29.                 do
  30.                 {
  31.                         while (--k);
  32.                 } while (--j);
  33.         } while (--i);
  34. }



  35. void Delay180ms()                //@11.0592MHz
  36. {
  37.         unsigned char i, j, k;
  38.         _nop_();
  39.         _nop_();
  40.         i = 8;
  41.         j = 145;
  42.         k = 99;
  43.         do
  44.         {
  45.                 do
  46.                 {
  47.                         while (--k);
  48.                 } while (--j);
  49.         } while (--i);
  50. }

  51. void Delay300ms()                //@11.0592MHz
  52. {
  53.         unsigned char i, j, k;

  54.         _nop_();
  55.         _nop_();
  56.         i = 13;
  57.         j = 156;
  58.         k = 83;
  59.         do
  60.         {
  61.                 do
  62.                 {
  63.                         while (--k);
  64.                 } while (--j);
  65.         } while (--i);
  66. }

  67. void Delay250ms()                //@11.0592MHz
  68. {
  69.         unsigned char i, j, k;

  70.         _nop_();
  71.         _nop_();
  72.         i = 11;
  73.         j = 130;
  74.         k = 111;
  75.         do
  76.         {
  77.                 do
  78.                 {
  79.                         while (--k);
  80.                 } while (--j);
  81.         } while (--i);
  82. }


  83. void initExtInt0()
  84. {
  85.     IT0 = 1;       // 电平下降沿触发
  86.     EX0 = 1;       // 开启INT0中断
  87.     EA = 1;        // 开总中断
  88. }

  89. void Timer01Init() {
  90.    TMOD|=0X01;//选择为定时器 0 模式,工作方式 1,仅用 TR0 打开启动。
  91.    TH0=0XFC; //给定时器赋初值,定时 1ms
  92.    TL0=0X18;
  93.    ET0=1;//打开定时器 0 中断允许
  94.    EA=1;//打开总中断
  95.    TR0=1;//打开定时器
  96.                
  97. }

  98. void xj()
  99. {
  100. if(zuo==1&&you==0) {y=1;z=5;}
  101. if(zuo==0&&you==1) {y=5;z=1;}
  102. if(zuo==0&&you==0) {y=2;z=2;}
  103. }
  104. void fw()
  105. {
  106. if(zuo==1||you==1){z=5,y=1;Delay250ms();dw=0;a=0;}
  107. }
  108.         
  109. void bz()                                      //判断小车前面是否存在障碍物
  110. {
  111.    if(hw==0){a=1;dw=1;}
  112.     while(a)
  113.    {
  114. switch (dw)                                    //循迹避障
  115.     {
  116.         case 1:z=5;y=1;Delay300ms();dw=2;break;//小车左转           
  117.         case 2:z=2,y=2;Delay100ms();dw=3;break;//小车直行           
  118.               case 3:z=1,y=5;Delay180ms();dw=4;break;//小车右转           
  119.         case 4:z=2,y=2;Delay100ms();dw=5;break;//小车直行           
  120.         case 5:z=1,y=5;Delay250ms();dw=6;break;//小车右转     
  121.                      case 6:z=2,y=2;fw();break;             //判断是否接触黑线

  122.     }
  123.    }
  124. }
  125. void main()
  126. {
  127. Timer01Init();                                 //定时器初始化
  128.                 AIN2=1;                                    //tb6612正反设定
  129.                 AIN1=0;
  130.                 BIN2=1;
  131.                 BIN1=0;                                
  132. OLED_Init();
  133. OLED_Clear();
  134. OLED_ShowCHinese(0,0,0);        
  135. OLED_ShowCHinese(16,0,1);
  136. OLED_ShowNum(0,2,2023400,7,16);
  137. OLED_ShowNum(56,2,20365,5,16);        
  138. while(1)
  139.         {

  140.                 xj();                                     //调用循迹
  141.     bz();                                     //调用避障
  142.        }
  143.         }

  144. void IntT0() interrupt 1                        
  145. {
  146.          TH0=0xFC;
  147.          TL0=0x18;
  148.          time++;
  149.    ct++;
  150.         
  151.         if(time>=y ) {time=0;}    //右边转速
  152.         if(time<=d*ks) {PWM=1;}
  153.         else           {PWM=0;}
  154.         
  155.         if(ct>=z   )   {ct=0;}    //左边转速
  156.         if(ct<=d*ks)   {sd=1;}
  157.         else           {sd=0;}

  158. }
复制代码

原理图: 无
仿真: 无
代码: 程序.7z (39.83 KB, 下载次数: 0)

评分

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

查看全部评分

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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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