找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4100|回复: 8
收起左侧

求一个51单片机的红外壁障加蓝牙遥控的小车程序

[复制链接]
ID:156528 发表于 2016-12-27 15:59 | 显示全部楼层 |阅读模式
40黑币
单片机是stc89c52rc 芯片,电机是L298N驱动模块。3路红外对管,HC-06蓝牙,小弟万分感谢!!!

回复

使用道具 举报

ID:155507 发表于 2016-12-27 23:21 | 显示全部楼层
  1. #include "STC15W201S.h"
  2. #include "intrins.h"

  3. typedef unsigned char BYTE;
  4. typedef unsigned int WORD;

  5. sbit D1 = P1^4;  //用于控制左边发光二极管
  6. sbit D2 = P3^7;   //用于控制右边发光二极管

  7. bit busy;

  8. bit l9110s_1 ;
  9. bit l9110s_2 ;

  10. bit R9110s_1 ;
  11. bit R9110s_2 ;

  12. unsigned char func;

  13. void Delay500ms()                //@11.0592MHz
  14. {
  15.   unsigned char i, j, k;

  16.   _nop_();
  17.   _nop_();
  18.   i = 2;
  19.   j = 2;
  20.   k = 2;
  21.   do
  22.   {
  23.     do
  24.     {
  25.       while (--k);
  26.     } while (--j);
  27.   } while (--i);
  28. }

  29. BYTE usart_recv;

  30. /*----------------------------
  31. UART 中断处理函数
  32. -----------------------------*/
  33. void Uart() interrupt 4 using 1
  34. {
  35.   if (RI)
  36.   {
  37.     RI = 0;                 //??RI?
  38.     usart_recv = SBUF;
  39.   }
  40.   if (TI)
  41.   {
  42.     TI = 0;                 //??TI?
  43.     busy = 0;               //????
  44.   }
  45. }

  46. //串口初始化为9600波特率
  47. void Usart_init(void)
  48. {
  49.   SCON = 0x50;       
  50.   T2L = 0xE0;               
  51.   T2H = 0xFE;               
  52.   AUXR |= 0x01;               
  53.   AUXR |= 0x4;               
  54.   AUXR |= 0x10;               
  55.   ES = 1;
  56.   EA = 1;
  57. }


  58. //电机PWM方式驱动

  59. void PWM_Init(void)                //100??@11.0592MHz
  60. {
  61.   AUXR |= 0x80;               
  62.   TMOD = 0x02;       
  63.   TL0 = 0x00;               
  64.   TH0 = 0x00;               
  65.   TF0 = 0;               
  66.   TR0 = 1;               
  67.   ET0 = 1;
  68.   EA  = 1;
  69. }

  70. unsigned char R_PWM,L_PWM;
  71. unsigned char count;
  72. void timer0_int (void) interrupt 1
  73. {
  74.   count++;
  75.   if(count > 100)
  76.   {
  77.     P32 = l9110s_1;
  78.     P33 = l9110s_2;
  79.     P54 = R9110s_1;
  80.     P55 = R9110s_2;
  81.     count = 0;
  82.   }
  83.   
  84.   if(count == L_PWM)
  85.   {
  86.     P54 = 0;
  87.     P55 = 0;
  88.   }
  89.   
  90.   if(count == R_PWM)
  91.   {
  92.     P32 = 0;
  93.     P33 = 0;
  94.   }
  95.   
  96. }


  97. void SendData(BYTE dat)
  98. {
  99.   while (busy);               //???????????
  100.   busy = 1;
  101.   SBUF = dat;                 //????UART?????
  102. }


  103. //电机控制,注意电机驱动芯片9110两个控制端只能有一个为高电平,
  104. //若同时为高电平则芯片内部短路,危险,极易损坏芯片。
  105. void stop(void);
  106. void front(void);
  107. void back(void);
  108. void right(void);
  109. void left(void);

  110. //停止
  111. void stop(void)
  112. {
  113.   l9110s_1 = 0;
  114.   l9110s_2 = 0;
  115.   R9110s_1 = 0;
  116.   R9110s_2 = 0;
  117. }

  118. //前进
  119. void front(void)
  120. {
  121.   l9110s_1 = 0;
  122.   l9110s_2 = 1;
  123.   R9110s_1 = 0;
  124.   R9110s_2 = 1;
  125. }

  126. //倒退
  127. void back(void)
  128. {
  129.   l9110s_1 = 1;
  130.   l9110s_2 = 0;
  131.   R9110s_1 = 1;
  132.   R9110s_2 = 0;
  133. }


  134. //右转
  135. void right(void)
  136. {
  137.   l9110s_1 = 1;
  138.   l9110s_2 = 0;
  139.   R9110s_1 = 0;
  140.   R9110s_2 = 1;
  141. }

  142. //左转
  143. void left(void)
  144. {
  145.   l9110s_1 = 0;
  146.   l9110s_2 = 1;
  147.   R9110s_1 = 1;
  148.   R9110s_2 = 0;
  149. }




  150. //循迹避障 蓝牙控制功能选择
  151. unsigned char func_sel(void)
  152. {
  153.   unsigned long c;
  154.   unsigned char i;
  155.   i = 0;
  156.   c = 0;
  157.   D1 = D2 = 1;
  158.   stop();
  159.   Delay500ms();Delay500ms();Delay500ms();Delay500ms();
  160.   while((P15 == 0)&& (c <0x3ffff))
  161.   {
  162.     c++;
  163.     if((c > 0xffff) && (c < 0x1ffff))
  164.     {
  165.       D1 = 0;
  166.       i = 1;
  167.     }
  168.    
  169.     if((c > 0x1ffff) && (c < 0x2ffff))
  170.     {
  171.       D1 = 1; D2 = 0;
  172.       i = 2;
  173.     }
  174.    
  175.     if((c > 0x2ffff) && (c < 0x3ffff))
  176.     {
  177.       D1 = 0; D2 = 0;
  178.       i = 3;
  179.     }
  180.   }
  181.   
  182.   if(c < 0xffff)
  183.   {
  184.     return func;
  185.   }
  186.   return i;
  187. }



  188. void main(void)
  189. {
  190.   BYTE last_recv;
  191.   
  192.   P32 = P33 = P54 = P55 = 0;
  193.   l9110s_1 = l9110s_2 = R9110s_1 = R9110s_2 = 0;
  194.   
  195.   R_PWM = 99;
  196.   L_PWM = 99;
  197.   P3M1 = 0;
  198.   P3M0 = 0x0C;
  199.   P5M1 = 0;
  200.   P5M0 = 0x30;
  201.   P1M1 = 0xf;
  202.   P1M0 = 0;
  203.   IP =0x10;
  204.   PWM_Init();
  205.   Usart_init();
  206.   D1 = D2 = 1;
  207.   P15 = 1;
  208.   func = 1;
  209.   
  210.   while(func == 1)   //功能1:循迹
  211.   {
  212.     while((P11 == 1)&& (P13 == 0))
  213.     {
  214.       right(); D2 = 0;D1 = 1;
  215.     }
  216.     while((P13 == 1)&&(P11 == 0))
  217.     {
  218.       left();D1 = 0;D2 =1;
  219.     }
  220.    
  221.     while((P13 == 0)&&(P11 == 0))
  222.     {
  223.       front();D1 = 0;D2 =0;
  224.     }
  225.     front();Delay500ms();
  226.     if(P15 == 0)
  227.     {
  228.       func = func_sel();
  229.     }
  230.   }

  231.   while(func == 2)  //功能2:避障
  232.   {
  233.     if(P15 == 0)
  234.     {
  235.       func = func_sel();
  236.     }
  237.    
  238.     while((P12 == 1)&& (P10 == 0))
  239.     {
  240.       left(); D2 = 0;D1 = 1;
  241.     }
  242.    
  243.     while((P12 == 0)&& (P10 == 1))
  244.     {
  245.       right(); D2 = 1;D1 = 0;
  246.     }
  247.    
  248.     while((P12 == 1)&& (P10 == 1))
  249.     {
  250.       front(); D2 = 0;D1 = 0;
  251.     }
  252.    
  253.     while((P12 == 0)&& (P10 == 0))
  254.     {
  255.       back(); D2 = 1;D1 = 1;
  256.     }
  257.   }

  258.   
  259.   while(func == 3)    //功能3:蓝牙遥控
  260.   {
  261.     if(P15 == 0)
  262.     {
  263.       func = func_sel();
  264.     }
  265.    
  266.     if(last_recv != usart_recv)
  267.     {
  268.       last_recv = usart_recv;
  269.       switch(usart_recv)
  270.       {
  271.       case 0x14:
  272.       case 0x15:
  273.       case 0x16:
  274.       case 0x17:
  275.       case 0x18:
  276.       case 0x19:
  277.       case 0x1a:
  278.       case 0x1b:
  279.       case 0x1c:
  280.       case 0x1d:
  281.       case 0x1e:
  282.       case 0x1f:       
  283.         front();
  284.         R_PWM = 69+(usart_recv-0x10)*2;
  285.         L_PWM = 69+(usart_recv-0x10)*2;
  286.         D1 = D2 = 0;
  287.         break;
  288.         
  289.       case 0x24:
  290.       case 0x25:
  291.       case 0x26:
  292.       case 0x27:
  293.       case 0x28:
  294.       case 0x29:
  295.       case 0x2a:
  296.       case 0x2b:
  297.       case 0x2c:
  298.       case 0x2d:
  299.       case 0x2e:
  300.       case 0x2f:       
  301.         back();
  302.         R_PWM = 69+(usart_recv-0x20)*2;
  303.         L_PWM = 69+(usart_recv-0x20)*2;
  304.         D1 = D2 = 1;
  305.         break;
  306.         
  307.       case 0x34:
  308.       case 0x35:
  309.       case 0x36:
  310.       case 0x37:
  311.       case 0x38:
  312.       case 0x39:
  313.       case 0x3a:
  314.       case 0x3b:
  315.       case 0x3c:
  316.       case 0x3d:
  317.       case 0x3e:
  318.       case 0x3f:       
  319.         left();
  320.         R_PWM = 69+(usart_recv-0x30)*2;
  321.         L_PWM = 69+(usart_recv-0x30)*2;
  322.         D1 = 0; D2 = 1;
  323.         break;               
  324.         
  325.         
  326.       case 0x44:
  327.       case 0x45:
  328.       case 0x46:
  329.       case 0x47:
  330.       case 0x48:
  331.       case 0x49:
  332.       case 0x4a:
  333.       case 0x4b:
  334.       case 0x4c:
  335.       case 0x4d:
  336.       case 0x4e:
  337.       case 0x4f:       
  338.         right();
  339.         R_PWM = 69+(usart_recv-0x40)*2;
  340.         L_PWM = 69+(usart_recv-0x40)*2;
  341.         D1 = 1; D2 = 0;
  342.         break;                       
  343.         
  344.       case 0x54:
  345.       case 0x55:
  346.       case 0x56:
  347.       case 0x57:
  348.       case 0x58:
  349.       case 0x59:
  350.       case 0x5a:
  351.       case 0x5b:
  352.       case 0x5c:
  353.       case 0x5d:
  354.       case 0x5e:
  355.       case 0x5f:       
  356.         front();
  357.         R_PWM = 99;
  358.         L_PWM = 100-(usart_recv-0x50)*2;
  359.         D1 = 1; D2 = 0;
  360.         break;                                       
  361.         

  362.       case 0x64:
  363.       case 0x65:
  364.       case 0x66:
  365.       case 0x67:
  366.       case 0x68:
  367.       case 0x69:
  368.       case 0x6a:
  369.       case 0x6b:
  370.       case 0x6c:
  371.       case 0x6d:
  372.       case 0x6e:
  373.       case 0x6f:       
  374.         front();
  375.         R_PWM = 100-(usart_recv-0x60)*2;
  376.         L_PWM = 99;
  377.         D1 = 0; D2 = 1;
  378.         break;                                       
  379.         
  380.         
  381.       case 0x74:
  382.       case 0x75:
  383.       case 0x76:
  384.       case 0x77:
  385.       case 0x78:
  386.       case 0x79:
  387.       case 0x7a:
  388.       case 0x7b:
  389.       case 0x7c:
  390.       case 0x7d:
  391.       case 0x7e:
  392.       case 0x7f:       
  393.         back();
  394.         R_PWM = 99;
  395.         L_PWM = 100-(usart_recv-0x70)*2;
  396.         D1 = 1; D2 = 1;
  397.         break;               
  398.         
  399.       case 0x84:
  400.       case 0x85:
  401.       case 0x86:
  402.       case 0x87:
  403.       case 0x88:
  404.       case 0x89:
  405.       case 0x8a:
  406.       case 0x8b:
  407.       case 0x8c:
  408.       case 0x8d:
  409.       case 0x8e:
  410.       case 0x8f:       
  411.         back();
  412.         R_PWM = 100-(usart_recv-0x80)*2;
  413.         L_PWM = 99;
  414.         D1 = 1; D2 = 1;
  415.         break;                                       
  416.         
  417.       case 0:
  418.         stop();
  419.         D1 = 1; D2 = 1;
  420.         break;
  421.       }
  422.     }
  423.   }
  424. }

复制代码
回复

使用道具 举报

ID:156528 发表于 2016-12-28 10:43 | 显示全部楼层
程序中是不是没有定义电机控制P0口,我是个初学者不懂,求教了
回复

使用道具 举报

ID:155822 发表于 2016-12-28 11:39 | 显示全部楼层
很好 谢谢拉
回复

使用道具 举报

ID:118338 发表于 2016-12-28 12:29 | 显示全部楼层
我有整套蓝牙小车资料,89C52的单片机,驱动也是L298N,,手机蓝牙遥控,自己加下红外蔽障功能就可以。

蓝牙小车程序.zip

30.15 KB, 下载次数: 45

回复

使用道具 举报

ID:152682 发表于 2016-12-31 12:00 | 显示全部楼层
fanchunping 发表于 2016-12-28 12:29
我有整套蓝牙小车资料,89C52的单片机,驱动也是L298N,,手机蓝牙遥控,自己加下红外蔽障功能就可以。

可以发一下整套资料吗?谢谢!
回复

使用道具 举报

ID:189908 发表于 2017-4-15 20:02 | 显示全部楼层
fanchunping 发表于 2016-12-28 12:29
我有整套蓝牙小车资料,89C52的单片机,驱动也是L298N,,手机蓝牙遥控,自己加下红外蔽障功能就可以。

注释很清楚,正在找类似程序,感谢分享
回复

使用道具 举报

ID:298261 发表于 2018-10-12 17:24 | 显示全部楼层
我最近也在做壁障,给我的你看
void keys()//按键扫描
{
        if(R_redlight == 0)//右红外探头检测到障碍物,往左拐
    {
        delay(20);//延时消抖
        if(R_redlight == 0)
        {        
           JD--;
          //  JD = JD - angle;
        }
    }

    //---------------------------   
    if(L_redlight == 0)//左红外探头检测到障碍物,往右拐
    {
        delay(20);
        if(L_redlight == 0)   
        {  
           JD++;
           //JD = JD + angle;  
        }
    }
    if(L_redlight == 1 && R_redlight == 1)//当左右两边探头没有检测到物体时舵机保持中间值
    {
        JD = median;
    }
   
    if(JD <= 1)
        JD = 1;
    if(JD > 150)
        JD = 150;
   
}
回复

使用道具 举报

ID:408692 发表于 2018-10-12 17:44 | 显示全部楼层
帮助非常大。谢谢
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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