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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3029|回復: 1
打印 上一主題 下一主題
收起左側

52單片機的避障小車代碼

[復制鏈接]
跳轉到指定樓層
樓主
ID:958624 發表于 2021-8-3 15:44 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
利用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. }

復制代碼

評分

參與人數 1黑幣 +30 收起 理由
admin + 30 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

沙發
ID:869305 發表于 2021-9-4 17:29 | 只看該作者
博主,程序能運行嗎?我看起來有點懵
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产精品2 | 伊人久久一区二区 | 日日夜夜免费精品视频 | 狠狠热视频 | 免费一区二区 | 欧美精品一区二区三区四区五区 | 欧洲毛片 | 免费精品 | 中文亚洲视频 | 久久不卡 | 国产激情视频网站 | 人人人人干 | 久久91精品国产一区二区三区 | 欧美日韩精品影院 | 久久午夜精品福利一区二区 | 色噜噜狠狠色综合中国 | 日韩欧美在 | 亚洲福利在线观看 | 国产九一精品 | 毛片免费看的 | 精品毛片视频 | 亚洲三级视频 | 999国产精品视频免费 | 在线播放国产一区二区三区 | 午夜精品福利视频 | 国产91丝袜在线播放 | 欧美在线观看网站 | 亚洲欧美在线视频 | 日韩久久精品 | 四虎永久免费影院 | 欧美中国少妇xxx性高请视频 | 亚洲欧美自拍偷拍视频 | 国产人成精品一区二区三 | 99久久婷婷国产综合精品首页 | 欧美国产视频 | 男人的天堂视频网站 | 天堂在线www | av在线一区二区三区 | 中文字幕亚洲一区二区va在线 | 91亚洲国产成人久久精品网站 | caoporn视频 |