久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

標題: 52單片機的避障小車代碼 [打印本頁]

作者: 小李子尾插    時間: 2021-8-3 15:44
標題: 52單片機的避障小車代碼
利用52單片機做的一個避障小車,還有一些地方不足,供參考
  1. #include<reg52.h>
  2. #include<intrins.h>

  3. #define uchar unsigned char
  4. #define obstructionDis 20   //到障礙物距離

  5. sbit LED = P0^0;            //距離小于20就亮
  6. sbit Trig = P1^1;                //TRIG用來發送方波
  7. sbit Echo = P1^2;                //ECHO用來接收方波
  8. sbit Motor_1 = P2^1;                   //控制第一個電機正反轉
  9. sbit Motor_2 = P2^2;                  
  10. sbit Motor_3 = P2^3;                   //控制第二個電機正反轉
  11. sbit Motor_4 = P2^4;                  
  12. sbit servoMotors = P1^0;    //PWM控制舵機引腳

  13. float L = 0;
  14. uchar sum;
  15. uchar Motor_pwm = 0;
  16. uchar Servor = 5;           //設置舵機占空比
  17. uchar servorTime = 0;
  18. uchar ifLeft = 0;           //左方向是否有障礙物
  19. uchar ifRight = 0;          //右方向是否有障礙物

  20. void delay(uchar time)      //延時函數
  21. {         
  22.         uchar i;
  23.         for(;time > 0;time--){
  24.                 for(i = 0;i < 255;i++);
  25.         }
  26. }

  27. void turnLeft()                        //左
  28. {
  29.         Motor_1 = 1;
  30.         Motor_2 = 0;
  31.         Motor_3 = 0;
  32.         Motor_4 = 0;
  33. }

  34. void turnRight()            //右
  35. {
  36.         Motor_1 = 0;
  37.         Motor_2 = 0;
  38.         Motor_3 = 1;
  39.         Motor_4 = 0;
  40. }

  41. void turnUp()                            //前
  42. {
  43.         Motor_1 = 1;
  44.         Motor_2 = 0;
  45.         Motor_3 = 1;
  46.         Motor_4 = 0;
  47. }

  48. void turnDown()                                  //后
  49. {
  50.         Motor_1 = 0;
  51.         Motor_2 = 1;
  52.         Motor_3 = 0;
  53.         Motor_4 = 1;
  54. }
  55. //發射超聲波測距波形
  56. void openHc()
  57. {
  58.     Trig = 1;
  59.     _nop_();                                  //1us,一共20us
  60.     _nop_();_nop_();_nop_();
  61.     _nop_();_nop_();_nop_();
  62.     _nop_();_nop_();_nop_();
  63.     _nop_();_nop_();_nop_();
  64.     _nop_();_nop_();_nop_();
  65.     _nop_();_nop_();_nop_();
  66.     _nop_();
  67.         Trig = 0;
  68. }
  69. //超聲波
  70. uchar getDistance()                  
  71. {
  72.         TH0 = 0;
  73.         TL0 = 0;
  74.         openHc();                        //發送一個方波信號,
  75.         while(!Echo);                    //等于0一直循環,直到Echo為高電平,信號反彈回來
  76.         TR0 = 1;                         //開啟定時器
  77.         while(Echo);     
  78.         TR0 = 0;
  79.         sum = TH0*256 + TL0;    //高八位加低八位組成16位
  80.         L = (sum*1.78)/100;     //L為距離
  81.         if(L < obstructionDis){  //如果距離小于20
  82.                 LED = 1;
  83.                 return 0;
  84.         }else{
  85.                 LED = 0;
  86.                 return 1;
  87.         }
  88. }
  89. //控制舵機方向
  90. void control()
  91. {
  92.                 Servor = 21;                          //舵機向左擺動
  93.                 servorTime = 0;                   //從0開始計數
  94.                 TR1 = 1;                          //開啟T1,舵機開始工作
  95.                 delay(200);                        //等待
  96.                 TR1 = 0;
  97.                 delay(3000);
  98.                 if(getDistance() == 0){
  99.                         turnLeft();
  100.                         delay(200);        
  101.                         delay(200);
  102.                 }
  103.                 Servor = 13;                //超聲波正對前方
  104.                 servorTime = 0;
  105.                 TR1 = 1;                  //定時器T1開始工(T1用來控制舵機)
  106.                 delay(200);         //等待中斷
  107.                 TR1 = 0;            //關閉定時器
  108.                 delay(3000);
  109.                 if(getDistance() == 0){
  110.                         turnDown();
  111.                         delay(200);
  112.                         delay(200);
  113.                         delay(100);
  114.                         turnRight();
  115.                         delay(200);
  116.                         delay(200);
  117.                 }               
  118.                 Servor = 5;                         //舵機向右
  119.                 servorTime = 0;      
  120.                 TR1 = 1;            
  121.                 delay(200);
  122.                 TR1 = 0;
  123.                 delay(3000);
  124.                 if(getDistance() == 0){
  125.                         turnRight();
  126.                         delay(200);
  127.                         delay(200);
  128.                 }        
  129.                 Servor = 13;                //超聲波正對前方
  130.                 servorTime = 0;
  131.                 TR1 = 1;                  //定時器T1開始工(T1用來控制舵機)
  132.                 delay(200);         //等待中斷
  133.                 TR1 = 0;            //關閉定時器
  134.                 delay(3000);
  135.                 if(getDistance() == 0){
  136.                         turnDown();
  137.                         delay(200);
  138.                         delay(200);
  139.                         delay(100);
  140.                         turnRight();
  141.                         delay(200);
  142.                         delay(200);
  143.                 }
  144. }
  145. //初始化
  146. void Init()
  147. {
  148.         LED = 1;                              //LED先亮
  149.         EA = 1;
  150.         ET1 = 1;
  151.         TMOD |= 0x10;                    //00000001,方式1
  152.         TH1 = (65536 - 100)/256;                     //65436,100us
  153.         TL1 = (65536 - 100)%256;
  154. }
  155. //主程序
  156. void main()
  157. {
  158.         Init();
  159.         servorTime = 0;
  160.         while(1){                        //如果返回的是1,則說明沒有障礙物所以一直向前        
  161.                 turnUp();
  162.                 if(getDistance() == 1){
  163.                         control();
  164.                 }else{
  165.                         turnDown();
  166.                         delay(200);
  167.                         delay(200);
  168.                         delay(100);
  169.                         control();
  170.                         break;
  171.                 }
  172.         }
  173. }
  174. //T1中斷
  175. void T1_int() interrupt 3          //產生舵機所用脈常(輸出PWM信號)
  176. {        
  177.         TH1 = 0xff;                //重新賦值
  178.         TL1 = 0x9c;
  179.         servorTime++;              //用來計數中斷次數,加一次就代表100us
  180.         if(servorTime <= Servor){   
  181.                 servoMotors = 1;       //舵機旋轉
  182.         }else{
  183.                 servoMotors = 0;       //舵機停止
  184.         }
  185.         if(servorTime >= 100){             //加到100舵機就停止
  186.                 servorTime = 0;          //舵機停
  187.         }
  188. }

復制代碼


作者: 艾爾文    時間: 2021-9-4 17:29
博主,程序能運行嗎?我看起來有點懵




歡迎光臨 (http://m.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 成人欧美一区二区三区黑人孕妇 | 中文字幕一区二区视频 | 九九亚洲| 国产免费一区二区三区 | 免费一区在线观看 | 欧美日韩亚| 欧美区在线| 日日淫 | 精品久久久久久久久久 | 亚洲国产成人精品女人久久久 | 国产免费一区二区 | 日韩在线观看精品 | 亚洲精品视频在线看 | 国产成人精品一区二区三 | 99福利| 亚洲精品在线看 | 中文字幕一区二区三区四区五区 | 一区二区视频在线 | 亚洲 欧美 日韩 在线 | www.99re| 欧美日韩在线观看一区 | 精品乱码一区二区 | 中文字幕在线视频免费观看 | 一区二区三区四区在线视频 | 成人免费网站 | 欧美成人一区二区三区 | 国产成人福利视频在线观看 | 日韩最新网址 | 亚洲欧美视频在线观看 | 国产精品日韩一区二区 | 四虎成人免费电影 | 国产女人与拘做视频免费 | 欧美一级毛片久久99精品蜜桃 | 久久手机视频 | 精品国产久 | 国产日韩精品一区二区 | 国产第一亚洲 | 欧美人妇做爰xxxⅹ性高电影 | 日韩精品视频在线观看一区二区三区 | 日韩欧美精品 | 91精品国产91久久久久青草 |