找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2237|回复: 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 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:869305 发表于 2021-9-4 17:29 | 显示全部楼层
博主,程序能运行吗?我看起来有点懵
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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