找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 6054|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

51單片機(jī)舵機(jī)循黑線小車程序

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:442141 發(fā)表于 2018-12-8 15:01 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
單片機(jī)源程序如下:
  1.    #include <reg52.h>
  2. sbit pwm = P2^0;    //定義舵機(jī)p20

  3. sbit ENA = P3^6;   //定義驅(qū)動(dòng)模塊
  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;   //定義驅(qū)動(dòng)模       

  9. /*定義光電管,光電管檢測(cè)到黑線輸出高電平,否則輸出低電平*/                  
  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; //定義幾個(gè)光電管的和1
  15. unsigned int         sum2= 0;  //定義幾個(gè)光電管的和2
  16. unsigned int         i ;

  17. void zhengzhuan();            //前進(jìn)
  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)//延時(shí)函數(shù),調(diào)節(jié)電機(jī)轉(zhuǎn)速
  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;//開定時(shí)器0,1
  40.         TH0=-18432/256;//定時(shí)20MS,20MS為一個(gè)周期
  41.         TL0=-18432%256;
  42.         TH1=-1382/256;//定時(shí)1.5MS,這時(shí)舵機(jī)處于0度
  43.         TL1=-1382%256;
  44.         EA=1;//開總斷
  45.         TR0=1;//開定時(shí)器0
  46.         ET0=1;
  47.         TR1=1;//開定時(shí)器1
  48.         ET1=1;
  49. }

  50.                            //輸出PWM信號(hào)
  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)  //所有光電管輸出低電平,前進(jìn)
  73.          j=5;
  74.    else  j= 6 ;
  75.                  switch(j)
  76.                  {

  77.                     case 0: pwm_value=value[4]; delay_ms(100);break;    //舵機(jī)輸出小偏轉(zhuǎn)角度 。高電平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))//判斷當(dāng)左邊光電管遇到黑線,
  88.                 {                                                        //右邊和前邊的光電管遇到白線時(shí)左轉(zhuǎn)
  89.                         zuozhuan();//調(diào)用左轉(zhuǎn)函數(shù)
  90.                 }
  91.                 while((zuoz==0)&&(zuo==1)&&(you==0))//判斷當(dāng)右邊光電管遇到黑線,
  92.                 {                                                        //左邊和前邊的光電管遇到白線時(shí)右轉(zhuǎn)       
  93.                     zhengzhuan();//
  94.                 }
  95.                 while((zuo==0)&&(you==1)&&(youy==0))//判斷當(dāng)左邊光電管遇到黑線,右邊光電管也遇到黑線
  96.                 {                                                        //前邊的光電管遇到白線時(shí)停止
  97.                      zhengzhuan();//調(diào)用停止函數(shù)
  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.   /*以下調(diào)用函數(shù)*/




  115. void timer0(void) interrupt 1//定時(shí)器0中斷函數(shù)
  116. {
  117.         pwm=1;
  118.         TH0=-18432/256;
  119.         TL0=-18432%256;
  120.         TR1=1;
  121. }

  122. void timer1(void) interrupt 3//定時(shí)器1中斷函數(shù)
  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()//左右輪協(xié)同前進(jìn)子函數(shù)
  139. {        ENA=1;
  140.     ENB=1;
  141.         IN1=1;
  142.         IN2=0;
  143.         IN3=1;
  144.         IN4=0;
  145.         delay(10-1);//pwm調(diào)速
  146.         IN1=0;
  147.     IN2=0;
  148.         IN3=0;
  149.         IN4=0;
  150.         delay(1);
  151. }
  152. void zuozhuan()//左右輪協(xié)同左轉(zhuǎn)子函數(shù)
  153. {        ENA=1;
  154.     ENB=1;
  155.         IN1=0;
  156.         IN2=0;
  157.         IN3=1;
  158.         IN4=0;
  159.         delay(10-1);//pwm調(diào)速
  160.         IN1=0;
  161.     IN2=0;
  162.         IN3=0;
  163.         IN4=0;
  164.         delay(1);
  165. }
  166. void youzhuan()//左右輪協(xié)同右轉(zhuǎn)子函數(shù)
  167. {        ENA=1;
  168.     ENB=1;
  169.         IN1=1;
  170.         IN2=0;
  171.         IN3=0;
  172.         IN4=0;
  173.         delay(10-1);//pwm調(diào)速
  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. }
復(fù)制代碼

所有資料51hei提供下載:
sad.zip (1.54 KB, 下載次數(shù): 20)


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表