找回密码
 立即注册

QQ登录

只需一步,快速开始

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

D2-6循迹小车制作资料

[复制链接]
跳转到指定楼层
楼主
ID:243552 发表于 2017-11-23 07:49 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
D2-6 小车制作说明

一、功能介绍:
   该产品是D2系列小车的最新版本,带有4路红外线传感器,用于循迹避障功能,带有蓝牙模块的串口接口,可以连接蓝牙模块实现无线遥控,电机驱动部分
使用的是2个电机驱动的专用集成电路L9110S,相比以前使用三极管驱动电机只能前进,现在D2-6小车也可以控制后退了。小车PCB上带有一个功能按钮,可
以通过按键切换到不同的功能。

二、装配说明:

   装配时应该按照先装配电子元件部分,后装配机械传动部分的顺序进行。装配电子元件时,先装配贴片电子元件,再装配直插的电子元件。下面先介绍电子元件部分的装配。


单片机源程序如下:
  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. ……………………

  379. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
D2-6循迹小车资料1.rar (1.17 MB, 下载次数: 36)
D2-6小车图文制作教程.docx (13.08 MB, 下载次数: 22)




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

使用道具 举报

沙发
ID:257043 发表于 2017-12-4 09:37 | 只看该作者
好资料,51黑有你更精彩!!!
回复

使用道具 举报

板凳
ID:257060 发表于 2017-12-4 09:47 | 只看该作者
大神好厉害
回复

使用道具 举报

地板
ID:921294 发表于 2021-6-11 09:54 | 只看该作者
非常感谢这位朋友的分享,因为在PDD上买了一套散件,商家的广告上说提供C语言程序,这一家到货后却不提供C语言程序,百般的东扯西拉,就是不提供,真的没有办法了。要学习没办法了,我想网络上可能有相近的,找了一下,还真的有,原先打算扔掉了,现在还没有做,先看着资料慢慢做。
有图片不知道怎么上传
回复

使用道具 举报

5#
ID:932168 发表于 2021-6-19 13:15 | 只看该作者
谁能根据这个程序和电路板画一个原理图呢?
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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