找回密码
 立即注册

QQ登录

只需一步,快速开始

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

循迹小车代码

[复制链接]
跳转到指定楼层
楼主
循迹小车代码


  1. #include "1602.h"
  2. #include <reg52.h>

  3. sbit L1=P0^0;
  4. sbit L2=P0^1;
  5. sbit L3=P0^2;
  6. sbit L4=P0^3;


  7. sbit H1=P0^6;
  8. sbit H2=P0^7;

  9. /*sbit L1=P0^0;
  10. sbit L3=P0^7;
  11. sbit L2=P2^0;
  12. sbit L4=P2^1;
  13. sbit H1=P0^2;
  14. sbit H2=P0^4;
  15. */

  16. uchar s1[2];
  17. uchar d1[2];
  18. uchar t1[2];
  19. uint speed;
  20. uint maxd;
  21. uint i;
  22. uint tt;
  23. uint f;


  24. long unsigned int distance1;
  25. long unsigned int ti;

  26. void scan();
  27. void Pwm(uint distance,uint x);
  28. void init();
  29. void distancedisplay();
  30. void speeddisplay();
  31. void chuli();
  32. void welcome();
  33. void PWM(uint pw,uint a);
  34. void Pathfinding();
  35. void timedisplay();


  36. void timedisplay()
  37. {
  38.                         if(f>999)
  39.                                 f=0;
  40.                         t1[0]=f/100+'0';
  41.                         t1[1]=(f%100)/10+'0';
  42.                         t1[2]=f%10+'0';        
  43.                         LCD_Write_Char(11,0,t1[0]) ;
  44.                         LCD_Write_Char(12,0,t1[1]) ;
  45.                         LCD_Write_Char(13,0,t1[2]) ;
  46. }


  47. void PWM(uint pw,uint a)
  48. {
  49.         
  50.         switch(a)
  51.         {
  52.                 case 1:
  53.                         if(pw>i)
  54.                                 L1=1;
  55.                         else if(pw<=i && i<100)
  56.                                 L1=0;
  57.                         else if(i>100)
  58.                                 i=0;
  59.                                 break;//左轮一个脉冲50ms,占空比pw%
  60.                  case 2:
  61.                         if(pw>i)
  62.                                 L3=1;
  63.                         else if(pw<=i && i<100)
  64.                                 L3=0;
  65.                         else if(i>100)
  66.                                 i=0;
  67.                         break;//右轮一个脉冲50ms,占空比pw%
  68.         
  69.         }
  70. }

  71. void Pathfinding()
  72. {
  73.         if(H1==0 && H2==0 )
  74.         {
  75.                 PWM(65,1);
  76.                 PWM(65,2);//直行
  77.         }
  78.         else if(H1==0 && H2==1)
  79.         {
  80.                 PWM(50,1);
  81.                 L3=0;// 右转
  82.         }
  83.         else if(H1==1 && H2==0)
  84.         {
  85.                 PWM(50,2);
  86.                 L1=0;// 左转
  87.         }
  88.         else
  89.         {
  90.                 L1=0;
  91.                 L3=0;
  92.                 speed=0;// 停止
  93.         }
  94. }


  95. void welcome()
  96. {
  97.                 uint k,j;
  98.                 uchar *pa;
  99.                 pa="Welcome to my car!";
  100.                 k=0;
  101.                 while(*pa)
  102.                 {
  103.                         LCD_Write_Char(k,0,*pa);
  104.                         pa++;
  105.                         k++;
  106.                         if(*pa==0)
  107.                                 LCD_Write_Com(0x18);
  108.                         DelayMs(250);
  109.                 }
  110.                 for(j=0;j<8;j++)
  111.                 DelayMs(250);
  112.                 k=0;
  113. }

  114. void chuli()
  115. {
  116.         
  117.         distance1=distance1+22;        
  118.         if(distance1>999)
  119.         {
  120.                 distance1=0;
  121.                 maxd++;
  122.                 if(maxd>9)
  123.                         maxd==0;
  124.                 LCD_Write_Char(10,1,maxd+'0') ;

  125.         }
  126.                         L1=1;
  127.                         speeddisplay();
  128.                         //L1=0;
  129.                         distancedisplay();               
  130. }


  131. void distancedisplay()
  132. {
  133.                         d1[0]=distance1/100+'0';
  134.                         d1[1]=(distance1%100)/10+'0';
  135.                         d1[2]=distance1%10+'0';        
  136.                         
  137.                         LCD_Write_Char(3,0,d1[0]) ;
  138.                         LCD_Write_Char(4,0,d1[1]) ;
  139.                         LCD_Write_Char(5,0,d1[2]) ;
  140.                         
  141. }

  142. void speeddisplay()
  143. {
  144.                         s1[0]=speed/100+'0';
  145.                         s1[1]=(speed%100)/10+'0';
  146.                         s1[2]=speed%10+'0';
  147.                         
  148.                         LCD_Write_Char(3,1,s1[0]) ;
  149.                         LCD_Write_Char(4,1,s1[1]) ;
  150.                         LCD_Write_Char(5,1,s1[2]) ;
  151.                         
  152. }


  153. void init()
  154. {
  155.           TMOD = 0x61;          //t1计数模式,方式2自动重装 t0定时器模式,方式1,500us触发一次
  156.                 TH0 =(65536-500)/256;   
  157.                 TL0 =(65536-500)%256;
  158.                 TH1        =256-1;
  159.                 TL1        =256-1;
  160.                 EA = 1;                                                        
  161.                 ET0 = 1;                                                        
  162.                 ET1        =        1;
  163.                 TR0 = 1;                                                        
  164.                 TR1=1;
  165. }


  166. void main()
  167.         {        

  168.                 i=0;
  169.                 L2=0;
  170.                 L4=0;
  171.                 distance1=0;
  172.                 ti=0;
  173.                 speed=0;
  174.                 LCD_Init();
  175.                 DelayMs(10);               
  176.                 LCD_Clear();//清屏
  177.                 init();
  178.                 //welcome();
  179.                   LCD_Clear();
  180.                         LCD_Write_String(1,1,"v:");
  181.                         LCD_Write_String(3,1,"000");
  182.                         LCD_Write_String(6,1,"cm/s");
  183.                   LCD_Write_String(1,0,"d:");
  184.                         LCD_Write_String(3,0,"000");
  185.                         LCD_Write_String(6,0,"cm");
  186.                         //LCD_Write_String(9,0,"t:");
  187.                         //LCD_Write_Char(14,0,'s');
  188.                 while(1)
  189.                     {
  190.                                         Pathfinding();
  191.                                        
  192.                                 }
  193.         }
  194.         
  195.         void Timer() interrupt 1 //定时器中断
  196. {
  197.         TH0 =(65536-500)/256;   
  198.         TL0 =(65536-500)%256;               
  199.         ti++;
  200.         i++;        
  201.         tt++;
  202.         if(tt==2000)
  203.         {
  204.                 f++;
  205.                 tt=0;
  206.                 //timedisplay();
  207.         }
  208. }

  209. void cesu() interrupt 3  //定时器中断计数测速 1 P3.5输入计数脉冲
  210. {

  211.         speed = 22/(ti*0.0005);
  212.         chuli();
  213.         ti=0;
  214. }


  215.         
复制代码


全部资料下载:
循迹小车.7z (49.23 KB, 下载次数: 8)

评分

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

查看全部评分

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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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