找回密码
 立即注册

QQ登录

只需一步,快速开始

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

51单片机智能小车程序 原理图与PCB文件

  [复制链接]
跳转到指定楼层
楼主
蓝牙遥控,循迹,避障,默认初始为蓝牙遥控功能,按数字键盘上面的按键可切换功能
Altium Designer画的原理图和PCB图如下:(51hei附件中可下载工程文件)



单片机源程序如下:
  1. #include<AT89x52.H>
  2. #include <intrins.h>  

  3.         //HL-1小车驱动接线定义
  4.   #define Left_moto_go     {P1_3=0,P1_4=1;}    //左边电机向前走
  5.         #define Left_moto_back    {P1_3=1,P1_4=0;}    //左边电机向后转
  6.         #define Left_moto_Stop    {P1_3=0,P1_4=0;}    //左边电机停转                     
  7.         #define Right_moto_go     {P1_6=1,P1_7=0;}        //右边电机向前走
  8.         #define Right_moto_back   {P1_6=0,P1_7=1;}        //右边电机向后走
  9.         #define Right_moto_Stop   {P1_6=0,P1_7=0;}        //右边电机停转   
  10.   
  11.         #define  ECHO  P2_0                                   //超声波接口定义
  12.     #define  TRIG  P2_1                                   //超声波接口定义
  13.         #define Sevro_moto_pwm    P3_3         //接舵机信号端输入PWM信号调节速度
  14.     #define Left_1_led        P3_7         //P3_2接四路寻迹模块接口第一路输出信号即中控板上面标记为OUT1
  15.         #define Left_2_led        P3_4         //P3_3接四路寻迹模块接口第二路输出信号即中控板上面标记为OUT2        

  16.     #define Right_1_led       P3_5         //P3_4接四路寻迹模块接口第三路输出信号即中控板上面标记为OUT3
  17.         #define Right_2_led       P3_6         //P3_5接四路寻迹模块接口第四路输出信号即中控板上面标记为OUT4
  18.         #define LEDY                P2_3
  19.         #define LEDG                P2_2
  20.         #define BEEP                P2_7

  21.         #define left     'C'
  22.     #define right    'D'
  23.         #define up       'A'
  24.     #define down     'B'
  25.         #define stop     'F'
  26.         #define Car      '1'           //手机软件1号键
  27.         #define Car1     '2'           //手机软件2号键
  28.         #define Beep     '5'           //手机软件5号键

  29.         char code str[] =  "收到指令,向前!\n";
  30.         char code str1[] = "收到指令,向后!\n";
  31.         char code str2[] = "收到指令,向左!\n";
  32.         char code str3[] = "收到指令,向右!\n";
  33.         char code str4[] = "收到指令,停止!\n";
  34.         char code str7[] = "收到指令,报警!\n";

  35.            unsigned char pwm_val_turn  = 0;//变量定义
  36.         unsigned char push_val_turn =12;//舵机归中,产生约,1.5MS 信号
  37.         unsigned int  time=0;                    //时间变量
  38.         unsigned int  timer1=0;                    //时间变量
  39.     unsigned int  timer=0;                        //延时基准变量

  40.         unsigned long S=0;                                //计算出超声波距离值
  41.     unsigned long S1=0;
  42.         unsigned long S2=0;
  43.         unsigned long S3=0;
  44.         unsigned long S4=0;

  45.         bit  flag_REC=0;                                 //串行接收标去位
  46.         bit  flag    =0;  
  47.         bit  flag_xj =0;
  48.         bit  flag_bj =0;

  49.         unsigned char  i=0;
  50.         unsigned char  dat=0;
  51.   unsigned char  buff[5]=0;       //接收缓冲字节


  52.    
  53. /************************************************************************/        
  54. //延时函数        
  55.    void delay(unsigned int k)
  56. {   
  57.      unsigned int x,y;
  58.          for(x=0;x<k;x++)
  59.            for(y=0;y<2000;y++);
  60. }
  61. /************************************************************************/
  62. //前进
  63.      void  run(void)
  64. {
  65.    //push_val_turn=6;          //舵机归中
  66.          Left_moto_go ;   //左电机往前走
  67.          Right_moto_go ;  //右电机往前走
  68. }

  69. //后退
  70.      void  backrun(void)
  71. {
  72.         Left_moto_back ;   //左电机往后走
  73.         Right_moto_back ;  //右电机往后走
  74.   //push_val_turn=6;          //舵机归中
  75.          
  76. }
  77. //左转
  78.      void  leftrun(void)
  79. {
  80.          Left_moto_go ;   //左电机往前走
  81.          Right_moto_back ;  //右电机往前走
  82. }

  83. //右转
  84.      void  rightrun(void)
  85. {
  86.          Left_moto_go ;   //左电机往前走
  87.          Right_moto_back ;  //右电机往前走
  88. }
  89. //STOP
  90.      void  stoprun(void)
  91. {
  92.          Left_moto_Stop ;   //左电机往前走
  93.          Right_moto_Stop ;  //右电机往前走
  94. }
  95.                 void   whistle(void)
  96. {
  97.                 BEEP=0;
  98. }
  99. /************************************************************************/
  100.      void  StartModule()                       //启动测距信号
  101.    {
  102.           TRIG=1;                                       
  103.           _nop_();
  104.           _nop_();
  105.           _nop_();
  106.           _nop_();
  107.           _nop_();
  108.           _nop_();
  109.           _nop_();
  110.           _nop_();
  111.           _nop_();
  112.           _nop_();
  113.           _nop_();
  114.           _nop_();
  115.           _nop_();
  116.           _nop_();
  117.           _nop_();
  118.           _nop_();
  119.           _nop_();
  120.           _nop_();
  121.           _nop_();
  122.           _nop_();
  123.           _nop_();
  124.           TRIG=0;
  125.    }
  126. /***************************************************/
  127.           void Conut(void)                   //计算距离
  128.         {
  129.           while(!ECHO);                       //当RX为零时等待
  130.           TR0=1;                               //开启计数
  131.           while(ECHO);                           //当RX为1计数并等待
  132.           TR0=0;                                   //关闭计数
  133.           time=TH0*256+TL0;                   //读取脉宽长度
  134.           TH0=0;
  135.           TL0=0;
  136.           S=(time*1.7)/100;        //算出来是CM
  137.         }
  138. /************************************************************************/
  139. //字符串发送函数
  140.           void send_str( )
  141.                    // 传送字串
  142.     {
  143.             unsigned char i = 0;
  144.             while(str[i] != '\0')
  145.            {
  146.                 SBUF = str[i];
  147.                 while(!TI);                                // 等特数据传送
  148.                 TI = 0;                                        // 清除数据传送标志
  149.                 i++;                                        // 下一个字符
  150.            }        
  151.     }
  152.         
  153.                   void send_str1( )
  154.                    // 传送字串
  155.     {
  156.             unsigned char i = 0;
  157.             while(str1[i] != '\0')
  158.            {
  159.                 SBUF = str1[i];
  160.                 while(!TI);                                // 等特数据传送
  161.                 TI = 0;                                        // 清除数据传送标志
  162.                 i++;                                        // 下一个字符
  163.            }        
  164.     }        

  165.                           void send_str2( )
  166.                    // 传送字串
  167.     {
  168.             unsigned char i = 0;
  169.             while(str2[i] != '\0')
  170.            {
  171.                 SBUF = str2[i];
  172.                 while(!TI);                                // 等特数据传送
  173.                 TI = 0;                                        // 清除数据传送标志
  174.                 i++;                                        // 下一个字符
  175.            }        
  176.     }        
  177.                     
  178.         void send_str3()// 传送字串
  179. {
  180.         unsigned char i = 0;
  181.         while(str3[i] != '\0')
  182.         {
  183.                 SBUF = str3[i];
  184.                 while(!TI);                                // 等特数据传送
  185.                 TI = 0;                                        // 清除数据传送标志
  186.                 i++;                                        // 下一个字符
  187.         }        
  188. }        
  189.         void send_str4()// 传送字串
  190. {
  191.         unsigned char i = 0;
  192.         while(str4[i] != '\0')
  193.         {
  194.                 SBUF = str4[i];
  195.                 while(!TI);                                // 等特数据传送
  196.                 TI = 0;                                        // 清除数据传送标志
  197.                 i++;                                        // 下一个字符
  198.         }        
  199. }
  200.         void send_str7()// 传送字串
  201. {
  202.         unsigned char i = 0;
  203.         while(str7[i] != '\0')
  204.         {
  205.                 SBUF = str7[i];
  206.                 while(!TI);                                // 等特数据传送
  207.                 TI = 0;                                        // 清除数据传送标志
  208.                 i++;                                        // 下一个字符
  209.         }        
  210. }
  211. void  COMM( void )                       
  212.   {
  213.                   push_val_turn=4;          //舵机向左转90度
  214.                   timer=0;
  215.                   while(timer<=4000); //延时400MS让舵机转到其位置
  216.                   StartModule();          //启动超声波测距
  217.           Conut();                           //计算距离
  218.                   S2=S;  
  219.   
  220.                   push_val_turn=8;          //舵机向右转90度
  221.                   timer=0;
  222.                   while(timer<=4000); //延时400MS让舵机转到其位置
  223.                   StartModule();          //启动超声波测距
  224.           Conut();                          //计算距离
  225.                   S4=S;         
  226.         

  227.                   push_val_turn=6;          //舵机归中
  228.                   timer=0;
  229.                   while(timer<=4000); //延时400MS让舵机转到其位置
  230.                   StartModule();          //启动超声波测距
  231.           Conut();                          //计算距离
  232.                   S1=S;         

  233.           if((S2<20)||(S4<20)) //只要左右各有距离小于,20CM小车后退
  234.                   {
  235.                   backrun();                   //后退
  236.                   timer=0;
  237.                   while(timer<=4000);
  238.                   }
  239.                   
  240.                   if(S2>S4)                 
  241.                      {
  242.                                 rightrun();          //车的左边比车的右边距离小        右转        
  243.                         timer=0;
  244.                         while(timer<=4000);
  245.                      }                                      
  246.                        else
  247.                      {
  248.                        leftrun();                //车的左边比车的右边距离大        左转
  249.                        timer=0;
  250.                        while(timer<=4000);
  251.                      }                                    
  252. }
  253. /************************************************************************/
  254. /*                    PWM调制舵机信号                                 */
  255. /************************************************************************/
  256. /*                    左电机调速                                        */
  257. /*调节push_val_left的值改变电机转速,占空比            */
  258.                 void pwm_Servomoto(void)
  259. {  

  260.     if(pwm_val_turn<=push_val_turn)
  261.                Sevro_moto_pwm=1;
  262.         else
  263.                Sevro_moto_pwm=0;
  264.         if(pwm_val_turn>=200)
  265.         pwm_val_turn=0;

  266. }
  267. /***************************************************/
  268. ///*TIMER1中断服务子函数产生PWM信号*/
  269.          void time1()interrupt 3   using 2
  270. {        
  271.      TH1=(65536-100)/256;          //100US定时
  272.          TL1=(65536-100)%256;
  273.          timer++;                                  //定时器100US为准。在这个基础上延时
  274.          pwm_val_turn++;
  275.          pwm_Servomoto();
  276. }
  277. /************************************************************************/
  278. void sint() interrupt 4          //中断接收3个字节
  279. {

  280.     if(RI)                         //是否接收中断
  281.     {
  282.        RI=0;
  283.        dat=SBUF;
  284.        if(dat=='O'&&(i==0)) //接收数据第一帧
  285.          {
  286.             buff[i]=dat;
  287.             flag=1;        //开始接收数据
  288.          }
  289.        else
  290.       if(flag==1)
  291.      {
  292.       i++;
  293.       buff[i]=dat;
  294.       if(i>=2)
  295.       {i=0;flag=0;flag_REC=1 ;}  // 停止接收
  296.      }
  297.          }
  298. }
  299. /*********************************************************************/                 
  300. /*--主函数--*/
  301.         void main(void)
  302. {
  303.         TMOD=0x11;  
  304.     TH1=(65536-100)/256;          //100US定时
  305.         TL1=(65536-100)%256;
  306.         TH0=0;
  307.         TL0=0;

  308.     T2CON=0x34;
  309.         T2MOD=0x00;
  310.         RCAP2H=0xFF;
  311.         RCAP2L=0xDC;
  312.   SCON=0x50;  
  313.     PCON=0x00;

  314.   PS=1;
  315.         TR1=1;
  316.         ET1=1;
  317.         ES=1;
  318.   EA=1;  
  319.         
  320.         delay(100);
  321.     push_val_turn=6;          //舵机归中
  322.           BEEP=1;
  323.         while(1)                                                        /*无限循环*/
  324.         {
  325.                         //BEEP=1;
  326.                   while(flag_xj)                           //循线标志位
  327.                   {
  328.                                 LEDG=1;
  329.                                if(flag_REC==1)
  330.                                  {
  331.                                   stoprun();
  332.                                   break;
  333.                                  }
  334.                     
  335.                             //有信号为0  没有信号为1
  336.               if(Left_2_led==1&&Right_1_led==1)
  337.                           run();

  338.                           else
  339.                          {                           
  340.                             if(Right_1_led==1&&Left_2_led==0)                //右边检测到黑线
  341.                                   {         
  342.                                 leftrun();
  343.                                   }
  344.                                 
  345.                                 if(Left_2_led==1&&Right_1_led==0)            //左边检测到黑线
  346.                                   {
  347.                                     rightrun();
  348.                              }
  349.                                  if(Left_2_led==0&&Right_1_led==0)            //两边同时检测到黑线
  350.                                   {
  351.                                     stoprun();
  352.                              }
  353.                           }                                
  354.                   }

  355.                          while(flag_bj)                       /*无限循环*/
  356.            {
  357.                                 LEDY=1;
  358.                if(timer>=1000)          //100MS检测启动检测一次
  359.              {
  360.                timer=0;
  361.                    StartModule(); //启动检测
  362.            Conut();                  //计算距离
  363.            if(S<20)                  //距离小于20CM
  364.                    {
  365.                    stoprun();          //小车停止
  366.                    COMM();                   //方向函数
  367.                    }
  368.                    else
  369.                    if(S>30)                  //距离大于,30CM往前走
  370.                    run();
  371.              }

  372.                          if(flag_REC==1)
  373.                         {
  374.                           push_val_turn=6;          //舵机归中
  375.                           stoprun();
  376.                           break;
  377.                         }
  378.           }
  379.           if(flag_REC==1)                                    //
  380.            {
  381.                 flag_REC=0;
  382.                 if(buff[0]=='O'&&buff[1]=='N')        //第一个字节为O,第二个字节为N,第三个字节为控制码
  383.                         BEEP=1;
  384.                 switch(buff[2])
  385.              {
  386.                       case up :                                                    // 前进
  387.                           send_str( );
  388.                           flag_xj=0;
  389.                           flag_bj=0;
  390.                           run();
  391.                           break;

  392.                       case down:                                                // 后退
  393.                           send_str1( );
  394.                           flag_xj=0;
  395.                           flag_bj=0;
  396.                           backrun();
  397.                           break;

  398.                       case left:                                                // 左转
  399.                           send_str2( );
  400.                           flag_xj=0;
  401.                           flag_bj=0;
  402.                           leftrun();
  403.                           break;

  404.                       case right:                                                // 右转
  405.                           send_str3( );
  406.                           flag_xj=0;
  407.                           flag_bj=0;
  408.                           rightrun();
  409.                           break;

  410.                       case stop:                                                // 停止
  411.                           send_str4( );
  412.                           flag_xj=0;
  413.                           flag_bj=0;
  414.                           stoprun();
  415.                           break;

  416.                           case Car :                                                //                 
  417.                           flag_xj=1;
  418.                           break;

  419.                           case Car1 :                                                //                 
  420.                           flag_bj=1;
  421.                           break;
  422.                                 
  423.                                 case Beep:                                                //                 
  424.                                 send_str7( );
  425.                           flag_bj=0;
  426.                                 flag_xj=0;
  427.                                 whistle();
  428.                           break;
  429.              }                 
  430.          }
  431.         }
  432. }                                   
复制代码

所有资料51hei附件下载:
蓝牙小车.7z (3.88 MB, 下载次数: 193)

评分

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

查看全部评分

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

使用道具 举报

沙发
ID:1000242 发表于 2022-1-6 11:35 | 只看该作者
感谢楼主 非常具有借鉴价值
回复

使用道具 举报

板凳
ID:1010578 发表于 2022-3-15 14:42 | 只看该作者
可以给我一份原理图吗?
回复

使用道具 举报

地板
ID:1010578 发表于 2022-3-15 14:49 | 只看该作者
楼主做的非常棒
回复

使用道具 举报

5#
ID:1010578 发表于 2022-3-15 21:18 | 只看该作者
有没有原理图库
回复

使用道具 举报

6#
ID:1015712 发表于 2022-4-4 22:19 | 只看该作者
感谢,这个给予我很大的帮助
回复

使用道具 举报

7#
ID:971889 发表于 2022-4-13 23:40 来自手机 | 只看该作者
有没有封装库和元件库分享一下
回复

使用道具 举报

8#
ID:975773 发表于 2022-4-21 15:06 | 只看该作者
感谢楼主 非常具有借鉴价值
回复

使用道具 举报

9#
ID:297903 发表于 2022-4-22 12:16 | 只看该作者
好資料,謝謝分享!
回复

使用道具 举报

10#
ID:656359 发表于 2022-11-17 16:15 | 只看该作者
蓝牙模块是用哪呀一款
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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