找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机程序,五路循迹+差速转向

[复制链接]
跳转到指定楼层
楼主
ID:353347 发表于 2018-6-21 01:33 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
五路循迹+差速转向

单片机源程序如下:

  1. #include <reg52.h>
  2. #include "intrins.h"
  3. #include "math.h"
  4. #include "car.h"
  5. /***********************延时函数**************************/
  6. void delay(unsigned int i)
  7. {
  8.         while(i--);
  9. }
  10. /***********************直走函数**************************/
  11. void run(unsigned int x)
  12. {
  13.           push_val_left=11+x;         //速度调节变量 0-30   0<=x<=25
  14.         push_val_right=9+x; //占空比  5+x/30

  15. }
  16. /***********************左拐1函数**************************/
  17. void leftrun1()       
  18. {         
  19.             push_val_left=15;                 
  20.          push_val_right=35;                //最大30,下同

  21. }
  22. /***********************左拐2函数**************************/
  23. void leftrun2()
  24. {         
  25.            push_val_left=20;                 
  26.                 push_val_right=45;               
  27. }
  28. ///***********************左拐3函数**************************/
  29. // void leftrun3()
  30. //{         
  31. //   push_val_left=6;                 
  32. //         push_val_right=17;               
  33. //}

  34. /***********************右拐1函数**************************/
  35. void  rightrun1()
  36. {
  37.          push_val_left=35;                  
  38.          push_val_right=15;                  
  39.                 
  40. }
  41. /***********************右拐2函数**************************/
  42. void  rightrun2()
  43. {                                                          
  44.          push_val_left=45;                  
  45.          push_val_right=20;                 
  46. }
  47. ///***********************右拐3函数**************************/
  48. //void  rightrun3()
  49. //{                                                          
  50. //         push_val_left=17;                  
  51. //         push_val_right=6;                 
  52. //}
  53. /***********************走函数**************************/
  54. void  go()                       
  55. {
  56.      left_right_go;
  57. }
  58. /***********************停函数**************************/
  59. void stop()
  60. {
  61.      left_right_stop;
  62. }
  63. /***************PWM调制电机转速函数********************/
  64. //                左电机调速                                       
  65. void pwm_out_left_moto()
  66. {  
  67.      if(Left_PWM_ON)
  68.      {
  69.           if(pwm_val_left<=push_val_left)       
  70.               {
  71.                    EN1=1;                           
  72.               }
  73.               else
  74.               {
  75.                    EN1=0;
  76.           }
  77.           if(pwm_val_left>=100)           //30为占空比的分母   可以自己修改。(此处牵一发而动全身)
  78.               pwm_val_left=0;
  79.      }
  80.         else   
  81.         {
  82.                   EN1=0;   //若未开启PWM则EN1=0 左电机 停止
  83.         }
  84. }                       
  85. /***************PWM调制电机转速函数********************/
  86. //                右电机调速                                       
  87.                
  88. void pwm_out_right_moto()
  89. {
  90.     if(Right_PWM_ON)
  91.     {
  92.         if(pwm_val_right<=push_val_right)        // pwm_val_right从零开始加push_val_right为占空比分子
  93.             {                                                                        //分子越大,高电平时间越长
  94.                 EN2=1;                                                        
  95.         }
  96.             else
  97.             {
  98.                 EN2=0;
  99.         }
  100.             if(pwm_val_right>=100)
  101.             pwm_val_right=0;                   //加到30清零
  102.     }
  103.     else   
  104.     {
  105.         EN2=0;          //若未开启PWM则EN2=0 右电机 停止
  106.     }
  107. }
  108. /***************定时器、电机初始化********************/
  109. void tminite()
  110. {
  111.                 IN1=1;IN2=0;   
  112.     IN3=1;IN4=0;  
  113.                 TMOD=0x02;
  114.     TH0=0x9c;  //1ms定时
  115.     TL0=0x9c;
  116.     TR0=1;
  117.     ET0=1;
  118.                 EA=1;            //开总中断       
  119. }
  120. /***************TIMER0中断服务子函数产生PWM信号********************/
  121. void timer0() interrupt 1
  122. {
  123.         pwm_val_left++;
  124.         pwm_val_right++;
  125.         pwm_out_left_moto();
  126.         pwm_out_right_moto();
  127. }
  128. void Xunji()
  129. {
  130.         switch(P1|0xe0)           //111 00000
  131.         {
  132.                 case 0xe0:                                                                                //111 00000
  133.                 case 0xe4:run(30);break;                        //111 00100
  134.                 case 0xe2:leftrun1();break;                //111 00010
  135.                 case 0xe1:leftrun2();break;                //111 00001
  136.                 case 0xe8:rightrun1();break;        //111 01000
  137.                 case 0xf0:rightrun2();break;        //111 10000
  138.                 case 0xff:stop();break;                                //111 11111
  139.                 default:go();break;
  140. //                delay(500);
  141.         }
  142. }
  143. void R_G_Kaiguan()
  144. {
  145.         if(kg)
  146.                 P0=table[temp1]; //如果开关未按下,显示红色的值
  147.         else
  148.                 P0=table[temp2];        //如果开关按下,显示绿色的值

  149. }


  150. /***************主函数********************/
  151. void main(void)
  152. {
  153.         unsigned long i=0;
  154.         unsigned long j=0;
  155.         delay(6000);//初始化延时
  156.         temp1=0;//计数值初始化
  157.         temp2=0;
  158.         while(!guang);
  159.         tminite();//定时器、电机初始化
  160.         while(1)
  161.         {
  162.                 Xunji();
  163.                 R_G_Kaiguan();
  164.                 i++;
  165.                 j++;
  166.                 if(i>8000)
  167.                 {
  168.                         temp1++;
  169.                         i=0;
  170.                 }
  171.                 if(j>9000)
  172.                 {
  173.                         temp2++;
  174.                         j=0;
  175.                 }
  176.                 if(temp1>=7)
  177.                         temp1=7;       
  178.                 if(temp2>=5)
  179.                         temp2=5;       
  180.          }
  181. }
  182.                        

复制代码

所有资料51hei提供下载:
car.rar (135.57 KB, 下载次数: 24)


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

使用道具 举报

沙发
ID:385480 发表于 2018-8-17 13:09 | 只看该作者
大家不要下载了,里面就一个主函数,其他函数都没有,没有任何参考价值
回复

使用道具 举报

板凳
ID:498374 发表于 2019-3-26 00:21 | 只看该作者
故事不公开 发表于 2018-8-17 13:09
大家不要下载了,里面就一个主函数,其他函数都没有,没有任何参考价值

就是说这里没有其他的.h文件,就算下载了也不能用,是吗?
回复

使用道具 举报

地板
ID:828562 发表于 2020-10-12 00:47 | 只看该作者
故事不公开 发表于 2018-8-17 13:09
大家不要下载了,里面就一个主函数,其他函数都没有,没有任何参考价值

什么主函数,代码中的car.h的函数是什么
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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