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

QQ登錄

只需一步,快速開始

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

小車直線行駛單片機(jī)編程

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:583531 發(fā)表于 2019-7-13 16:19 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
小車直線行駛編程部分

單片機(jī)源程序如下:
  1. #include "REG52.H"
  2. #include <intrins.h>   //包含nop等系統(tǒng)函數(shù)
  3. #include <stdio.h>

  4. #define uint unsigned int
  5. #define uchar unsigned char



  6. //按鍵引腳定義
  7. sbit key = P2^0;

  8. //定義電機(jī)引腳
  9. sbit Left_motor_go=P2^4;           //左電機(jī)前進(jìn)AIN2
  10. sbit Left_motor_back=P2^3;           //左電機(jī)后退AIN1
  11. sbit Right_motor_go=P2^1;           //右電機(jī)前進(jìn)BIN2
  12. sbit Right_motor_back=P2^2;           //右電機(jī)后退BIN1

  13. sbit TrackSensorLeftPin2  =  P1^1;   
  14. sbit TrackSensorLeftPin1  =  P1^0;   
  15. sbit TrackSensorRightPin1 =  P1^2;   
  16. sbit TrackSensorRightPin2 =  P1^3;  

  17. //紅外傳感器采集的數(shù)據(jù)變量
  18. uchar SensorValue1;
  19. uchar SensorValue2;
  20. uchar SensorValue3;
  21. uchar SensorValue4;

  22. //定義角度值
  23. int myangle = 0;//舵機(jī)角度定義
  24. int servo_p = 0;

  25. //定義舵機(jī)引腳
  26. sbit ServoPin=P0^6;

  27. uchar pwm_val_left  =0;//變量定義
  28. uchar pwm_val_right =0;
  29. uchar set_pwm_val_left = 0;
  30. uchar set_pwm_val_right = 0;

  31. sbit LED1 = P2^5;
  32. sbit LED2 = P2^6;

  33. /*
  34. *   毫秒級(jí)延時(shí)
  35. */
  36. void delay(uint xms)                               
  37. {
  38.         uint i,j;
  39.         for(i=xms;i>0;i--)                     
  40.                 for(j=120;j>0;j--);
  41. }



  42. /*
  43. *   舵機(jī)函數(shù)
  44. */
  45. void set_angle(int angle)
  46. {
  47.     if(angle > 18)
  48.         angle = 18;
  49.     if(angle < 8)
  50.         angle = 8;
  51.     myangle = angle;
  52. }

  53. /*
  54. *   電機(jī)運(yùn)行程序,僅支持電機(jī)正轉(zhuǎn)
  55. */
  56. void run(uchar left_speed,uchar right_speed)
  57. {
  58.     if(left_speed >100)
  59.         left_speed = 100;
  60.     if(right_speed >100)
  61.         right_speed = 100;
  62.         set_pwm_val_left = left_speed;
  63.         set_pwm_val_right = right_speed;
  64.           return;
  65. }

  66. /*
  67. *   傳感器值獲取函數(shù),將引腳值賦值給變量以防止誤寫引腳狀態(tài)。
  68. */
  69. void get_sensor(void)
  70. {
  71.     SensorValue1 = TrackSensorLeftPin1;
  72.     SensorValue2 = TrackSensorLeftPin2;
  73.     SensorValue3 = TrackSensorRightPin1;
  74.     SensorValue4 = TrackSensorRightPin2;   
  75. }

  76. /*
  77. *   發(fā)車按鍵,調(diào)用此函數(shù),若按鍵未按下,則程序一直死在此函數(shù)
  78. */
  79. void key_scan(void)
  80. {
  81.         while (key!=0);       //當(dāng)按鍵沒有被按下一直循環(huán)
  82.           while (key==0)        //當(dāng)按鍵被按下時(shí)
  83.           {
  84.             delay(10);                //延時(shí)10ms
  85.             if (key==0)         //第二次判斷按鍵是否被按下
  86.             {   
  87.                       delay(100);   
  88.                       while (key==0);   //判斷按鍵是否被松開   
  89.             }   
  90.           }
  91. }

  92. /*
  93. *   初始化函數(shù)
  94. */
  95. void init(void)
  96. {
  97.     //定時(shí)器0控制車速
  98.     TMOD|=0X01;  //定時(shí)器0工作方式1
  99.     TH0=0XFF;    //100us定時(shí),裝入初值
  100.     TL0=0XA3;
  101.     TR0=1;                 //啟動(dòng)T0工作
  102.     ET0=1;                 //允許T0中斷
  103.     EA =1;             //開總中斷
  104.    
  105.     //舵機(jī)引腳初始化為高電平
  106.     Left_motor_back = 0;    //關(guān)反向電橋
  107.     Right_motor_back = 0;   
  108.    
  109.     ServoPin=1; //舵機(jī)電平拉高

  110.     set_angle(13);  //舵機(jī)初始狀態(tài)對(duì)正
  111. }

  112. /*
  113. *   方波生成邏輯
  114. */
  115. void timer0() interrupt 1  
  116. {
  117.         TH0=0XFF;                         //100Us定時(shí)
  118.         TL0=0XA3;
  119.         servo_p++;
  120.         //舵機(jī)處理部分
  121.         if(servo_p <= myangle)
  122.         {
  123.                 ServoPin=1;
  124.         }               
  125.         else if(servo_p < 200)
  126.         {
  127.                 ServoPin=0;
  128.         }
  129.         else
  130.         {
  131.                 servo_p = 0;
  132.         }
  133.         pwm_val_left++;
  134.         if(pwm_val_left<set_pwm_val_left)
  135.         {
  136.                 Left_motor_go = 1;
  137.         }
  138.         else if(pwm_val_left<100)
  139.         {
  140.                 Left_motor_go = 0;
  141.         }
  142.         else
  143.         {
  144.                 pwm_val_left = 0;
  145.         }

  146.         pwm_val_right++;
  147.         if(pwm_val_right<set_pwm_val_right)
  148.         {
  149.                 Right_motor_go = 1;
  150.         }
  151.         else if(pwm_val_right<100)
  152.         {
  153.                 Right_motor_go = 0;
  154.         }
  155.         else
  156.         {
  157.                 pwm_val_right = 0;
  158.         }
  159. }





  160. //簡(jiǎn)單實(shí)現(xiàn)循跡樣例
  161. void sensor_adjust(void)
  162. {
  163.     //更新傳感器狀態(tài),必須有
  164.     get_sensor();

  165.     if((SensorValue2 == 1)&&(SensorValue3 == 1))
  166.     {
  167.         set_angle(13);
  168.     }
  169.             if((SensorValue2 == 1)&&(SensorValue3 == 1)&&(SensorValue1 == 1)&&(SensorValue4 == 1))
  170.     {
  171.         set_angle(13);
  172.                 run(0,0);
  173.     }

  174.     if(SensorValue1 == 1)
  175.     {
  176.         if(SensorValue2 == 1)
  177.             set_angle(12);
  178.         else
  179.             set_angle(11);
  180.     }
  181.     else if(SensorValue2 == 1)
  182.     {
  183.         set_angle(12);
  184.     }
  185.     else if(SensorValue3 == 1)
  186.     {
  187.         set_angle(14);
  188.     }
  189.     else if(SensorValue4 == 1)
  190.     {
  191.         if(SensorValue3 == 1)
  192.             set_angle(13);
  193.         else
  194.             set_angle(14);
  195.     }
  196. }


  197. void main()
  198. {
  199.     init();
  200.     key_scan();
  201.         run(35,35);
  202.         //調(diào)用按鍵掃描函數(shù)
  203.     while(1)
  204.     {               
  205.                 sensor_adjust();
  206.         }
  207. }
復(fù)制代碼

程序51hei提供下載:
第三.zip (31.16 KB, 下載次數(shù): 6)


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

使用道具 舉報(bào)

沙發(fā)
ID:1 發(fā)表于 2019-7-13 23:40 | 只看該作者
本帖需要重新編輯補(bǔ)全電路原理圖,源碼,詳細(xì)說明與圖片即可獲得100+黑幣(帖子下方有編輯按鈕)
回復(fù)

使用道具 舉報(bào)

板凳
ID:363259 發(fā)表于 2019-10-9 09:34 | 只看該作者
學(xué)習(xí)參考一下
回復(fù)

使用道具 舉報(bào)

地板
ID:622547 發(fā)表于 2019-10-11 20:52 | 只看該作者
學(xué)習(xí)了
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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