找回密码
 立即注册

QQ登录

只需一步,快速开始

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

智能小车超声波跟随的单片机程序源码

  [复制链接]
跳转到指定楼层
楼主
ID:370697 发表于 2018-7-13 09:54 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
智能小车超声波跟随

单片机源程序如下:
  1. #include<reg51.h>                              

  2. #define reload_count_1200bps 0xe8
  3. #define reload_count_2400bps 0xf4
  4. #define reload_count_4800bps 0xfa
  5. #define reload_count_9600bps 0xfd

  6. //定义智能小车电机驱动芯片L293D输入IO口            
  7. sbit IN1 = P1^3;                             
  8. sbit IN2 = P1^4;                           

  9. sbit IN3 = P1^5;                  
  10. sbit IN4 = P1^6;                           

  11. sbit EN1 = P1^2;                  
  12. sbit EN2 = P1^7;

  13. sbit BEEP_IO   = P2^3;                           //蜂鸣器定义

  14. unsigned char pwmval_left   = 0;                //变量定义                  
  15. unsigned char pwmval_right  = 0;

  16. unsigned char pwmval_left_init  = 10;           
  17. //左电机占空比调节 ,调节值在0到20之间,调节此值可调节小车速度。           
  18. unsigned char pwmval_right_init = 10;         
  19. //右电机占空比调节 ,调节值在0到20之间,调节此值可调节小车速度。           

  20. bit right_pwm = 1;                                     //右电机PWM开关,为1时打开   
  21. bit left_pwm  = 1;                                             //左电机PWM开关,为1时打开        

  22. unsigned char num = 0x00;
  23. unsigned char UART_REV_BUFFER;

  24. unsigned char one_frame_finished = 0;

  25. bit forward_flag = 0;
  26. bit backward_flag=0;
  27. bit left_flag    = 0;
  28. bit right_flag   = 0;
  29. bit back_flag    = 0;
  30. bit stop_flag    = 1;

  31. void delay(int In,int Out)                      //定义延时函数            
  32. {
  33. int i,j;
  34. for(i=0;i<In;i++)
  35. {
  36.   for(j=0;j<Out;j++)
  37.   {;}
  38. }
  39. }

  40. void forward(void)                                                 //前进
  41. {
  42. if(forward_flag == 0)
  43. {
  44.   ET0 = 0;
  45.   pwmval_right = 0;
  46.   pwmval_left  = 0;
  47.   pwmval_left_init  = 20;                  
  48.   pwmval_right_init = 20;  
  49.   ET0 = 1;

  50.   IN1 = 1;
  51.   IN2 = 0;                                      //左车轮的正转                 

  52.   IN3 = 1;
  53.   IN4 = 0;
  54. }                                              //右车轮的正转         
  55. forward_flag = 1;                  
  56. }


  57. void backward(void)                                                 //前进
  58. {
  59. if(backward_flag == 0)
  60. {
  61.   ET0 = 0;
  62.   pwmval_right = 0;
  63.   pwmval_left  = 0;
  64.   pwmval_left_init  = 20;                  
  65.   pwmval_right_init = 20;  
  66.   ET0 = 1;

  67.   IN1 = 0;
  68.   IN2 = 1;         //左车轮的正转                 

  69.   IN3 = 0;
  70.   IN4 = 1;
  71. }                                              //右车轮的正转         
  72. backward_flag = 1;                  
  73. }




  74. void stop(void)                                            //停车
  75. {
  76. IN1 = 0;
  77. IN2 = 0;                                       //左电机不动           

  78. IN3 = 0;
  79. IN4 = 0;                                       

  80. forward_flag       = 0;
  81. left_flag          = 0;
  82. right_flag         = 0;
  83. back_flag          = 0;
  84. }

  85. void right(void)                                        //向右           
  86. {
  87. if(right_flag == 0)
  88. {
  89.   ET0 = 0;         
  90.   pwmval_right = 0;
  91.   pwmval_left  = 0;
  92.   pwmval_left_init  = 20;                  
  93.   pwmval_right_init = 20;
  94.   ET0 = 1;  

  95.   IN1 = 1;
  96.   IN2 = 0;                                     //智能小车左车轮正转           

  97.   IN3 = 0;
  98.   IN4 = 1;                                     //智能小车右车轮反转        
  99. }   
  100. right_flag = 1;
  101. }

  102. void left(void)                                            //向左         
  103. {
  104. if(left_flag == 0)
  105. {
  106.   ET0 = 0;
  107.   pwmval_right = 0;
  108.   pwmval_left  = 0;
  109.   pwmval_left_init  = 20;                  
  110.   pwmval_right_init = 20;  
  111.   ET0 = 1;

  112.   IN1 = 0;
  113.   IN2 = 1;                                      

  114.   IN3 = 1;
  115.   IN4 = 0;                                       
  116. }
  117. left_flag = 1;
  118. }

  119. /************************************************************************/                                                         
  120. void left_moto(void)  //left speed adjust
  121. {  
  122. if(left_pwm)
  123. {
  124.   if(pwmval_left <= pwmval_left_init)
  125.   {
  126.    EN1 = 1;
  127.   }
  128.   else
  129.   {
  130.    EN1 = 0;
  131.   }
  132.   if(pwmval_left >= 20)
  133.   {
  134.    pwmval_left = 0;
  135.   }
  136. }
  137. else   
  138. {
  139.   EN1 = 0;                     
  140. }
  141. }

  142. /******************************************************************/
  143. void right_moto(void)
  144. {
  145. if(right_pwm)
  146. {
  147.   if(pwmval_right <= pwmval_right_init)                  
  148.   {
  149.    EN2 = 1;                                                            
  150.   }
  151.   else if(pwmval_right > pwmval_right_init)
  152.   {
  153.    EN2 = 0;
  154.   }
  155.   if(pwmval_right >= 20)
  156.   {
  157.    pwmval_right = 0;
  158.   }
  159. }
  160. else   
  161. {
  162.   EN2 = 0;                                                      
  163. }
  164. }

  165. void timer0()interrupt 1 using 2           //
  166. {
  167. TH0 = 0xfc;                                                  //1Ms定时           
  168. TL0 = 0x66;

  169. pwmval_left  = pwmval_left  + 1;
  170. pwmval_right = pwmval_right + 1;

  171. left_moto();
  172. right_moto();
  173. }

  174. void timer_init()
  175. {
  176. TMOD=0x01;
  177. TH0= 0xfc;                                               //1ms定时   
  178. TL0= 0x66;
  179. TR0= 1;
  180. ET0= 1;
  181. EA = 1;                                                                  //开总中断        
  182. }

  183. void serial_port_initial(char TH,char TL)
  184. {
  185. SCON = SCON | 0x50;                                      //0101,0000 8位可变波特率,无奇偶校验位
  186. TMOD = TMOD | 0x20;                                      //0011,0001 设置定时器1为8位自动重装记数器                  
  187. PCON = PCON | 0x00;

  188. TH1  = TH;                                               //设置定时器1自动重装数                 
  189. TL1  = TL;
  190.         
  191. ES   = 1;                                                //允许串口中断           
  192. EA   = 1;                                                //开总中断   
  193. TR1  = 1;                                                //开定时器1                                                      
  194. }

  195. void send_UART(unsigned char i)                                          //发送一节函数                  
  196. {
  197. ES = 0;                                                  //关串 口中断                    
  198. TI = 0;                                                  //清零串口发送完成中断请求标志                 
  199. SBUF = i;
  200. while(TI==0);                                           // 等特数据传送  
  201. TI = 0;                                                  // 清除数据传送标志
  202. ES = 1;
  203. }

  204. char UARTReceive(void)
  205. {
  206. char ch;
  207. ch = SBUF;        
  208. return (ch);                                            //暂存接收到的数据                  
  209. }

  210. void UART_Interrupr_Receive(void) interrupt 4
  211. {
  212. ES = 0;
  213. if(RI)                                                  //接引起的中断处理程序           
  214. {
  215.   UART_REV_BUFFER = UARTReceive();  
  216.   RI = 0;
  217.   ES = 1;
  218.   one_frame_finished = 1;
  219. }
  220. }




  221. void PROCESS(void)
  222. {
  223. if(one_frame_finished == 1)
  224. {
  225.   send_UART(UART_REV_BUFFER);        

  226.   if(UART_REV_BUFFER == 0x31)
  227.   {
  228.   stop();
  229.   }
  230.   else if(UART_REV_BUFFER == 0x32)
  231.   {
  232.   left();
  233.   delay(80,100);
  234.    stop();
  235.   }
  236.   else if(UART_REV_BUFFER == 0x33)
  237.   {
  238.    right();
  239.    delay(80,100);
  240.    stop();
  241.   }
  242.   else if(UART_REV_BUFFER == 0x34)
  243.   {
  244.                 forward();
  245.                 delay(200,100);
  246.                 stop();

  247.   }
  248.         else if(UART_REV_BUFFER==0x35)
  249.         {
  250.            
  251.                  backward();
  252.                 delay(100,100);
  253.                 stop();
  254.         }
  255.         
  256.   else
  257.   {
  258.    stop();
  259.   }
  260. one_frame_finished = 0;
  261. }




  262. //==================Test=====================
  263. /*right();
  264. delay(500,100);

  265. left();
  266. delay(500,100);

  267.   backward();
  268. delay(500,100);
  269. */

  270. //forward();
  271. //delay(500,100);








  272. }

  273. void main(void)
  274. {
  275. delay(10,10);
  276. timer_init();
  277. serial_port_initial(reload_count_9600bps,reload_count_9600bps);

  278. BEEP_IO = 0;
  279. delay(100,100);
  280. BEEP_IO = 1;
  281.         

  282. while(1)
  283. {
  284.   PROCESS();
  285. }                     
  286. }
复制代码

所有资料51hei提供下载:
智能小车超声波跟随程序.zip (35.23 KB, 下载次数: 122)


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

使用道具 举报

沙发
ID:373222 发表于 2018-12-22 23:25 | 只看该作者
请问是什么型号得超声波模块?
回复

使用道具 举报

板凳
ID:489798 发表于 2019-3-13 20:35 | 只看该作者
你好,可以分享一下小车电路图吗?
回复

使用道具 举报

地板
ID:428001 发表于 2019-3-13 23:05 | 只看该作者
什么是超声波跟随?
回复

使用道具 举报

5#
ID:563654 发表于 2019-11-20 16:46 | 只看该作者
谢谢大佬,要是有电路图就更加完美了
回复

使用道具 举报

6#
ID:672942 发表于 2019-12-24 21:58 | 只看该作者
小车安装好了,下载程序试试
回复

使用道具 举报

7#
ID:397735 发表于 2020-3-3 14:56 | 只看该作者
谢谢分享
回复

使用道具 举报

8#
ID:709735 发表于 2020-3-17 08:57 | 只看该作者
您好,可以您这个程序,超声波接在哪呢
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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