找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5533|回复: 0
收起左侧

51单片机舵机循黑线小车程序

[复制链接]
ID:442141 发表于 2018-12-8 15:01 | 显示全部楼层 |阅读模式
单片机源程序如下:
  1.    #include <reg52.h>
  2. sbit pwm = P2^0;    //定义舵机p20

  3. sbit ENA = P3^6;   //定义驱动模块
  4. sbit ENB = P3^7;   //
  5. sbit IN1 = P3^0;
  6. sbit IN2 = P3^1;
  7. sbit IN3 = P3^2;
  8. sbit IN4 = P3^3;   //定义驱动模       

  9. /*定义光电管,光电管检测到黑线输出高电平,否则输出低电平*/                  
  10. sbit zuoz = P2^7;  //定义最左边 光电
  11. sbit zuo = P2^6;        //定义中左边 光电
  12. sbit you = P2^5;        //定义中右边 光电
  13. sbit youy = P2^4;  //定义最右边光电模块  


  14. unsigned int         sum1 = 0; //定义几个光电管的和1
  15. unsigned int         sum2= 0;  //定义几个光电管的和2
  16. unsigned int         i ;

  17. void zhengzhuan();            //前进
  18. void tingzhi();            //停止
  19. void youzhuan();
  20. void zuozhuan();
  21. void quansu();
  22. void InitTimer();   
  23. typedef unsigned int uint;
  24. typedef unsigned char uchar;
  25. void delay_ms(uint x)
  26. {
  27.         uint i;
  28.         while(x--)
  29.         for(i=0;i<125;i++);
  30. }
  31. void delay(int z)//延时函数,调节电机转速
  32. {
  33.     int i,j;
  34.         for(i=2;i>0;i--)
  35.         for(j=z;j>0;j--);       
  36. }


  37. void InitTimer(void)
  38. {
  39.         TMOD=0x11;//开定时器0,1
  40.         TH0=-18432/256;//定时20MS,20MS为一个周期
  41.         TL0=-18432%256;
  42.         TH1=-1382/256;//定时1.5MS,这时舵机处于0度
  43.         TL1=-1382%256;
  44.         EA=1;//开总断
  45.         TR0=1;//开定时器0
  46.         ET0=1;
  47.         TR1=1;//开定时器1
  48.         ET1=1;
  49. }

  50.                            //输出PWM信号
  51. uint pwm_value=1382;                     //初值为1.5ms
  52. uint value[]={1150,1290,1382,1474,1580,};//定义1.2ms,1.4ms,1.5ms,1.6ms,1.75ms;

  53. void main()
  54. {

  55.          while(1)
  56.    {
  57.          uint j;
  58.         InitTimer();
  59.         pwm_value=1382;
  60.     sum1=zuoz&zuo&you&youy;
  61.         sum2=zuoz|zuo|you|youy;

  62.    if(zuoz==1&&zuo==0)
  63.                  j=0;
  64.    else if(zuo==1&&you==0&&zuoz==0)
  65.          j=1;
  66.    else if(you==1&&zuo==0&&youy==0)
  67.          j=2;
  68.    else if(youy==1&&you==0)
  69.          j=3 ;
  70.    else if(sum1==1) //所有光电管输出高电平,停止
  71.                  j=4;
  72.    else if(sum2==0)  //所有光电管输出低电平,前进
  73.          j=5;
  74.    else  j= 6 ;
  75.                  switch(j)
  76.                  {

  77.                     case 0: pwm_value=value[4]; delay_ms(100);break;    //舵机输出小偏转角度 。高电平1.3ms
  78.                           case 1: pwm_value=value[3]; delay_ms(50);break;
  79.                         case 2: pwm_value=value[1]; delay_ms(50);break;
  80.                          case 3: pwm_value=value[0]; delay_ms(100);break;
  81.                         case 4: pwm_value=value[2]; delay_ms(50);break;
  82.                         case 5: pwm_value=value[2]; delay_ms(50);break;
  83.                          default : break;
  84.                  
  85.                  }
  86.    
  87.                    while((zuoz==1)&&(zuo==0))//判断当左边光电管遇到黑线,
  88.                 {                                                        //右边和前边的光电管遇到白线时左转
  89.                         zuozhuan();//调用左转函数
  90.                 }
  91.                 while((zuoz==0)&&(zuo==1)&&(you==0))//判断当右边光电管遇到黑线,
  92.                 {                                                        //左边和前边的光电管遇到白线时右转       
  93.                     zhengzhuan();//
  94.                 }
  95.                 while((zuo==0)&&(you==1)&&(youy==0))//判断当左边光电管遇到黑线,右边光电管也遇到黑线
  96.                 {                                                        //前边的光电管遇到白线时停止
  97.                      zhengzhuan();//调用停止函数
  98.                 }
  99.             while((you==0)&&(youy==1))

  100.                 {       
  101.                       youzhuan();
  102.             }

  103.             while((zuo==0)&&(zuoz==0)&&(you==0)&&(youy==0))       

  104.                 {       
  105.                      zhengzhuan();
  106.                 }
  107.                 while((zuo==1)&&(zuoz=1)&&(you==1)&&(youy==1))
  108.                 {
  109.                     tingzhi();

  110.                
  111.                 }
  112. }

  113. }
  114.   /*以下调用函数*/




  115. void timer0(void) interrupt 1//定时器0中断函数
  116. {
  117.         pwm=1;
  118.         TH0=-18432/256;
  119.         TL0=-18432%256;
  120.         TR1=1;
  121. }

  122. void timer1(void) interrupt 3//定时器1中断函数
  123. {
  124.         pwm=0;
  125.         TH1=-pwm_value/256;
  126.         TL1=-pwm_value%256;
  127.         TR1=0;
  128. }


  129. void tingzhi()
  130. {

  131.    ENA=1;
  132.    ENB=1;
  133.    IN1=0;
  134.    IN2=0;
  135.    IN3=0;
  136.    IN4=0;
  137.   }

  138. void zhengzhuan()//左右轮协同前进子函数
  139. {        ENA=1;
  140.     ENB=1;
  141.         IN1=1;
  142.         IN2=0;
  143.         IN3=1;
  144.         IN4=0;
  145.         delay(10-1);//pwm调速
  146.         IN1=0;
  147.     IN2=0;
  148.         IN3=0;
  149.         IN4=0;
  150.         delay(1);
  151. }
  152. void zuozhuan()//左右轮协同左转子函数
  153. {        ENA=1;
  154.     ENB=1;
  155.         IN1=0;
  156.         IN2=0;
  157.         IN3=1;
  158.         IN4=0;
  159.         delay(10-1);//pwm调速
  160.         IN1=0;
  161.     IN2=0;
  162.         IN3=0;
  163.         IN4=0;
  164.         delay(1);
  165. }
  166. void youzhuan()//左右轮协同右转子函数
  167. {        ENA=1;
  168.     ENB=1;
  169.         IN1=1;
  170.         IN2=0;
  171.         IN3=0;
  172.         IN4=0;
  173.         delay(10-1);//pwm调速
  174.         IN1=0;
  175.     IN2=0;
  176.         IN3=0;
  177.         IN4=0;
  178.         delay(1);
  179. }
  180. void quansu()
  181. {
  182.   ENA=1;
  183.   ENB=1;
  184.   IN1=1;
  185.   IN2=0;
  186.   IN3=1;
  187.   IN4=0;


  188. }
复制代码

所有资料51hei提供下载:
sad.zip (1.54 KB, 下载次数: 20)
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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