找回密码
 立即注册

QQ登录

只需一步,快速开始

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

基于STC89C52单片机的红外线遥小车实现源码

[复制链接]
跳转到指定楼层
楼主
ID:280773 发表于 2018-2-12 09:40 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
基于STC89C52单片机的小车实现
责任描述:
一、完成小车的原理设计和焊接。
二、用Keil4编写单片机实现了五个功能:1.红外线遥控前进后退转弯功能。2.小车地面寻迹功能。3.超声波感应避障功能。4.光敏感应行走功能。
ps:最后有文档源代码。

下载:
源代码.docx (14.22 KB, 下载次数: 21)

单片机源程序:
  1. #include <REGX52.H>
  2. #include <intrins.h>
  3. sbit LeftLed=P2^0;                        
  4. sbit RightLed=P0^7;                       
  5. sbit FontLled=P1^7;

  6. sbit LeftIR=P3^5;                        
  7. sbit RightIR=P3^6;                        
  8. sbit FontIR=P3^7;                        

  9. sbit M1A=P0^0;                           
  10. sbit M1B=P0^1;                           

  11. sbit M2A=P0^2;                           
  12. sbit M2B=P0^3;                           

  13. sbit B1=P0^4;                             
  14. sbit SB1=P0^6;                           
  15. sbit IRIN=P3^3;                                       

  16. unsigned char code  LedShowData[]={0x03,0x9F,0x25,0x0D,0x99,  
  17.                                    0x49,0x41,0x1F,0x01,0x19};//0,1,2,3,4,5,6,7,8,9
  18. unsigned char code  RecvData[]={0x19,0x46,0x15,0x43,0x44,0x40,0x0D,0x0E,0x00,0x0F};
  19. unsigned char IRCOM[7];
  20. static unsigned int LedFlash;                        
  21. bit EnableLight=0;                                    
  22. #define ShowPort P2                                   
  23. unsigned char temp = 1;
  24. void tingzhi()
  25. {
  26.    M1A=0;                                   
  27.    M1B=0;                                   
  28.    M2A=0;                                   
  29.    M2B=0;

  30. }

  31. void qianjin()
  32. {
  33.    M1A=1;                                   
  34.    M1B=0;                                   
  35.    M2A=1;                                   
  36.    M2B=0;
  37. }

  38. void houtui()
  39. {
  40.    M1A=0;                                   
  41.    M1B=1;                                   
  42.    M2A=0;                                   
  43.    M2B=1;
  44. }

  45. void zuozhuan()
  46. {
  47.    M1A=0;                                   
  48.    M1B=1;                                   
  49.    M2A=1;                                   
  50.    M2B=0;
  51. }

  52. void youzhuan()
  53. {
  54.    M1A=1;                                   
  55.    M1B=0;                                   
  56.    M2A=0;                                   
  57.    M2B=1;
  58. }

  59. void Delay1ms(unsigned int i)
  60. {
  61. unsigned char j,k;
  62. do{
  63.   j = 10;
  64.   do{
  65.    k = 50;
  66.    do{
  67.     _nop_();
  68.    }while(--k);     
  69.   }while(--j);
  70. }while(--i);

  71. }

  72. void delay_nus(unsigned int i)  
  73. {
  74.   i=i/10;
  75.   while(--i);
  76. }   
  77. void delay_nms(unsigned int n)  
  78. {
  79.   n=n+1;
  80.   while(--n)  
  81.   delay_nus(900);         
  82.   
  83. }  

  84. void delayms(unsigned char x)                        
  85. {
  86.   unsigned char i;                                   
  87.   while(x--)                                         
  88.   {
  89.     for (i = 0; i<13; i++) {}                        
  90.   }
  91. }

  92. void Delay()                                          
  93. {
  94.   unsigned int DelayTime=30000;                       
  95.   while(DelayTime--);                                 
  96.   return;                                             
  97. }
  98. void ControlCar(unsigned char ConType)   
  99. {

  100.   tingzhi();
  101. switch(ConType)                          
  102. {
  103.   case 1:  //前进                        
  104.   {
  105.     //tingzhi();                                                     
  106.         //Delay1ms(50);
  107.         LeftLed = 0 ;
  108.         qianjin();
  109.     break;
  110.   }
  111.   case 2: //后退                        
  112.   {
  113.    // tingzhi();                                                              
  114.    // Delay1ms(50);
  115.     LeftLed = 1 ;         
  116.         houtui();                                
  117.     break;
  118.   }
  119.   case 3: //左转                          
  120.   {
  121.      //tingzhi();                                                                  
  122.         // Delay1ms(50);
  123.          zuozhuan();                              
  124.          break;
  125.   }
  126.   case 4: //右转                          
  127.   {
  128.    // tingzhi();                                                                  
  129. //        Delay1ms(50);
  130.         youzhuan();                                
  131.                                           
  132.         break;
  133.   }
  134.   case 8: //停止                          
  135.   {
  136.     tingzhi();
  137.         break;                                
  138.   }
  139. }
  140. }

  141. void ControlCar_yaokong(unsigned char ConType)   
  142. {

  143.   tingzhi();
  144. switch(ConType)                          
  145. {
  146.   case 1:  //前进                        
  147.   {
  148.     tingzhi();                                                      
  149.         Delay1ms(150);
  150.         LeftLed = 0 ;
  151.         qianjin();
  152.     break;
  153.   }
  154.   case 2: //后退                          
  155.   {
  156.     tingzhi();                                                              
  157.     Delay1ms(150);
  158.     LeftLed = 1 ;         
  159.         houtui();                                
  160.     break;
  161.   }
  162.   case 3: //左转                          
  163.   {
  164.      tingzhi();                                                                  
  165.          Delay1ms(150);
  166.          zuozhuan();                              
  167.          break;
  168.   }
  169.   case 4: //右转                          
  170.   {
  171.      tingzhi();                                                                  
  172.          Delay1ms(150);
  173.      youzhuan();                                
  174.           break;
  175.   }
  176.   case 8: //停止                          
  177.   {
  178.     tingzhi();
  179.         break;                              
  180.   }
  181. }
  182. }
  183. void Robot_Avoidance()                  
  184. {

  185.    LeftLed=LeftIR;                        
  186.    RightLed=RightIR;                     
  187.    FontLled= FontIR;
  188.    SB1=FontIR;

  189.     if(FontIR == 0)                          
  190.    {
  191.       ControlCar(8);                       
  192.       delay_nms (300);                                          
  193.           ControlCar(2);                                          
  194.           delay_nms (1000);                                          
  195.           ControlCar(3);                                          
  196.           delay_nms (1800);        
  197.   }
  198.    else
  199.    {
  200.       ControlCar(1);                     
  201.       delay_nms (10);
  202.    }
  203.     ControlCar(1);
  204. }
  205. //机器人循迹子程序
  206. void Robot_Traction()                     
  207. {
  208.    LeftLed=LeftIR;                        
  209.    RightLed=RightIR;                     
  210.    FontLled= FontIR;
  211.    SB1=LeftIR;
  212.    if(LeftIR == 0 && RightIR == 0)   
  213.    {
  214.       ControlCar(1);                     
  215.       delay_nms (10);
  216.    }
  217.    
  218.    else if(LeftIR == 0 && RightIR == 1)
  219.    {
  220.       ControlCar(3);                     
  221.       delay_nms (10);
  222.    }

  223.    else if(LeftIR == 1 && RightIR == 0)
  224.    {
  225.       ControlCar(4);                     
  226.       delay_nms (10);
  227.    }
  228.     ControlCar(8);
  229. }

  230. void main()                              
  231. {
  232.   
  233.   bit RunFlag=0;                          
  234.   LedFlash=3000;                                       
  235.   //EX1=1;                                               
  236.   IT1=1;                                               
  237.   EA=1;                                                
  238.   ControlCar(8);                          
  239.   while(1)                                
  240.   {
  241.              if(P3_2 == 0)
  242.           {
  243.            delay_nms(10);
  244.            if(P3_2 == 0)
  245.            {
  246.                      temp++;
  247.                   while(!P3_2);
  248.            }
  249.           }
  250.           if(temp > 3)
  251.           {
  252.           temp = 1;
  253.           }
  254.           switch(temp)
  255.           {
  256.                    case 1:        ShowPort = LedShowData[1];Robot_Traction();EX1 = 0;break;
  257.                 case 2: ShowPort = LedShowData[2];Robot_Avoidance();EX1 = 0;break;
  258.                 case 3: ShowPort = LedShowData[3];EX1 = 1;break;
  259.           }
  260.   }
  261. }
  262. //----------红外遥控-------------------------------------------------------------
  263. void IR_IN() interrupt 2 using 0                     
  264. {
  265.   unsigned char j,k,N=0;                              
  266.    
  267.   EX1 = 0;                                             
  268.   delayms(15);                                       
  269.   if (IRIN==1)                                       
  270.   {  
  271.      EX1 =1;                                         
  272.          return;                                       
  273.   }
  274.                            
  275.   while (!IRIN)                                    
  276.   {
  277.       delayms(1);                                   
  278.   }

  279.   for (j=0;j<4;j++)                                
  280.   {
  281.     for (k=0;k<8;k++)                              
  282.     {
  283.        while (IRIN)                                 
  284.        {
  285.          delayms(1);                              
  286.        }
  287.       
  288.        while (!IRIN)                                
  289.        {
  290.          delayms(1);                              
  291.        }
  292.    
  293.        while (IRIN)                                
  294.        {
  295.          delayms(1);                                
  296.          N++;                                      
  297.          if (N>=30)                              
  298.              {
  299.            EX1=1;                                 
  300.                return;                                   
  301.          }                  
  302.        }
  303.                                        
  304.       IRCOM[j]=IRCOM[j] >> 1;                        
  305.      
  306.       if (N>=8)                                      
  307.       {
  308.          IRCOM[j] = IRCOM[j] | 0x80;                  
  309.       }
  310.       N=0;                                         
  311.     }
  312.   }
  313.    
  314.   if (IRCOM[2]!=~IRCOM[3])                           
  315.   {
  316.      EX1=1;                                          
  317.      return;                                         
  318.   }

  319.   for(j=0;j<10;j++)                                   
  320.    {
  321.       if(IRCOM[2]==RecvData[j])                     
  322.       {
  323.        // ControlCar(j);
  324.                 ControlCar_yaokong(j);                              
  325.       }
  326.    }
  327.    EX1 = 1;                                         
  328. }
  329. //-------------------------------------------------------------------------------------------------------
复制代码


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

使用道具 举报

沙发
ID:493533 发表于 2019-4-11 14:57 | 只看该作者
调速的怎么改啊
回复

使用道具 举报

板凳
ID:462827 发表于 2019-4-12 19:21 | 只看该作者
小车是买成品还是散件自己装?
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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