鱼C论坛

 找回密码
 立即注册
查看: 3109|回复: 13

[已解决]超声波避障

[复制链接]
发表于 2021-7-8 21:57:42 | 显示全部楼层 |阅读模式
30鱼币
麻烦来一个超声波避障的单片机程序啊,网上找到的运行不了;希望有注释。在下小白一枚。
最佳答案
2021-7-8 21:57:43
  1. #include<reg52.h>
  2. #include<intrins.h>
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. #define barrierDis 15      //距离障碍物的距离
  6. uint sum;
  7. float L;
  8. sbit LED = P0^0;
  9. sbit Trig = P1^1;           //超声波模块的TRIG
  10. sbit Echo = P1^2;           //超声波模块的ECHO
  11. sbit motorDriver_1 =P2^1;  //控制第一个电机,从单片机出来后接L298n模块的IN1
  12. sbit motorDriver_2 =P2^2;  //控制第一个电机,从单片机出来后接L298n模块的IN2
  13. sbit motorDriver_3 =P2^3;  //控制第二个电机,从单片机出来后接L298n模块的IN3
  14. sbit motorDriver_4 =P2^4;  //控制第二个电机,从单片机出来后接L298n模块的IN4
  15. sbit servorControl =P1^0;  //舵机的控制引脚
  16. uchar flag=0;
  17. uchar control=5;
  18. uchar servorTime=0;
  19. uchar lFlag=0;//左方向是否有障碍的标志
  20. uchar rFlag=0;//右方向是否有障碍的标志
  21. void delay(uchar time){         //延迟函数
  22.         uchar i;
  23.         for(;time>0;time--){
  24.                 for(i=0;i<255;i++);
  25.         }
  26. }
  27. void stop(){         //小车停止
  28.         motorDriver_1=0;
  29.         motorDriver_2=0;
  30.         motorDriver_3=0;
  31.         motorDriver_4=0;
  32. }
  33. void turnLeft(){                //小车向左转
  34.         motorDriver_1=1;
  35.         motorDriver_2=0;
  36.         motorDriver_3=0;
  37.         motorDriver_4=0;
  38. }                                                 //小车向右转
  39. void turnRight(){
  40.         motorDriver_1=0;
  41.         motorDriver_2=0;
  42.         motorDriver_3=1;
  43.         motorDriver_4=0;
  44. }
  45. void turnUp(){                          //小车向前走
  46.         motorDriver_1=1;
  47.         motorDriver_2=0;
  48.         motorDriver_3=1;
  49.         motorDriver_4=0;
  50. }
  51. void turnDown(){                  //小车向后走
  52.         motorDriver_1=0;
  53.         motorDriver_2=1;
  54.         motorDriver_3=0;
  55.         motorDriver_4=1;
  56. }
  57. void openHc(){
  58.    Trig=1;
  59.    _nop_();
  60.    _nop_();
  61.    _nop_();
  62.    _nop_();
  63.    _nop_();
  64.    _nop_();
  65.    _nop_();
  66.    _nop_();
  67.    _nop_();
  68.    _nop_();
  69.    _nop_();
  70.    _nop_();
  71.    _nop_();
  72.    Trig=0;
  73. }
  74. uchar getDistance(){  //利用超声波模块判断有无障碍物
  75.         TH0=0;
  76.         TL0=0;
  77.         openHc();
  78.         while(!Echo);
  79.         TR0=1;
  80.         while(Echo);
  81.         TR0=0;
  82.         sum=TH0*256+TL0;
  83.         L=(sum*1.78)/100;
  84.         if(L<barrierDis&&flag==0){
  85.                 LED=0;
  86.                 return 0;
  87.         }
  88.         else{
  89.                 LED=1;
  90.                 flag=0;
  91.                 return 1;
  92.         }
  93. }
  94. void main(){
  95.                 LED=1;
  96.                 EA=1;
  97.                 ET0=1;
  98.                 ET1=1;
  99.                 TMOD=0x11;
  100.                 TH1=0xff;
  101.             TL1=0x9c;
  102.                 servorTime=0;
  103.                 while(1){
  104.                          stop();         
  105.                          control=15;//控制舵机使超声波模块正对前方
  106.                          servorTime=0;
  107.                          TR1=1;
  108.                          delay(200);
  109.                          TR1=0;
  110.                          turnUp();
  111.                          LED=0;
  112.                          delay(200);
  113.                          LED=1;
  114.                          while(getDistance()==1); //向前行驶,直到前方有障碍物
  115.                          do{
  116.                             stop();
  117.                                 control=22;           //使舵机向左摆动
  118.                                 servorTime=0;
  119.                                 TR1=1;
  120.                                  delay(200);
  121.                                 TR1=0;
  122.                                 rFlag=getDistance();
  123.                                  control=5;                 //使舵机向右摆动
  124.                                 servorTime=0;
  125.                                 TR1=1;
  126.                                  delay(200);
  127.                                 TR1=0;
  128.                                 lFlag=getDistance();
  129.                                 turnDown();
  130.                                 delay(220);
  131.                                 delay(220);
  132.                                 delay(220);
  133.                         }while(lFlag==0&&rFlag==0);
  134.                          if(rFlag==1&&lFlag==0)        //左侧没有障碍物
  135.                                  turnLeft();
  136.                          else if(rFlag==0&&lFlag==1)//右侧没有障碍物
  137.                                  turnRight();
  138.                          else if(rFlag==1&&lFlag==1)//两侧都没有障碍物,默认向左走
  139.                                  turnLeft();
  140.                          delay(220);
  141.                          delay(220);
  142.                          delay(200);
  143.                 }
  144. }
  145. void T1_int(void) interrupt 3{          //产生舵机所需要的脉冲
  146.                 TH1=0xff;
  147.                 TL1= 0x9c;
  148.                 servorTime++;
  149.                 if(servorTime<=control)
  150.                         servorControl=1;
  151.                 else
  152.                         servorControl=0;
  153.                 if(servorTime>=200)
  154.                         servorTime=0;
  155. }
  156. void T0_int(void) interrupt 1{          //超声波超出测量范围
  157.                 flag=1;
  158. }


复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-7-8 21:57:43 | 显示全部楼层    本楼为最佳答案   
  1. #include<reg52.h>
  2. #include<intrins.h>
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. #define barrierDis 15      //距离障碍物的距离
  6. uint sum;
  7. float L;
  8. sbit LED = P0^0;
  9. sbit Trig = P1^1;           //超声波模块的TRIG
  10. sbit Echo = P1^2;           //超声波模块的ECHO
  11. sbit motorDriver_1 =P2^1;  //控制第一个电机,从单片机出来后接L298n模块的IN1
  12. sbit motorDriver_2 =P2^2;  //控制第一个电机,从单片机出来后接L298n模块的IN2
  13. sbit motorDriver_3 =P2^3;  //控制第二个电机,从单片机出来后接L298n模块的IN3
  14. sbit motorDriver_4 =P2^4;  //控制第二个电机,从单片机出来后接L298n模块的IN4
  15. sbit servorControl =P1^0;  //舵机的控制引脚
  16. uchar flag=0;
  17. uchar control=5;
  18. uchar servorTime=0;
  19. uchar lFlag=0;//左方向是否有障碍的标志
  20. uchar rFlag=0;//右方向是否有障碍的标志
  21. void delay(uchar time){         //延迟函数
  22.         uchar i;
  23.         for(;time>0;time--){
  24.                 for(i=0;i<255;i++);
  25.         }
  26. }
  27. void stop(){         //小车停止
  28.         motorDriver_1=0;
  29.         motorDriver_2=0;
  30.         motorDriver_3=0;
  31.         motorDriver_4=0;
  32. }
  33. void turnLeft(){                //小车向左转
  34.         motorDriver_1=1;
  35.         motorDriver_2=0;
  36.         motorDriver_3=0;
  37.         motorDriver_4=0;
  38. }                                                 //小车向右转
  39. void turnRight(){
  40.         motorDriver_1=0;
  41.         motorDriver_2=0;
  42.         motorDriver_3=1;
  43.         motorDriver_4=0;
  44. }
  45. void turnUp(){                          //小车向前走
  46.         motorDriver_1=1;
  47.         motorDriver_2=0;
  48.         motorDriver_3=1;
  49.         motorDriver_4=0;
  50. }
  51. void turnDown(){                  //小车向后走
  52.         motorDriver_1=0;
  53.         motorDriver_2=1;
  54.         motorDriver_3=0;
  55.         motorDriver_4=1;
  56. }
  57. void openHc(){
  58.    Trig=1;
  59.    _nop_();
  60.    _nop_();
  61.    _nop_();
  62.    _nop_();
  63.    _nop_();
  64.    _nop_();
  65.    _nop_();
  66.    _nop_();
  67.    _nop_();
  68.    _nop_();
  69.    _nop_();
  70.    _nop_();
  71.    _nop_();
  72.    Trig=0;
  73. }
  74. uchar getDistance(){  //利用超声波模块判断有无障碍物
  75.         TH0=0;
  76.         TL0=0;
  77.         openHc();
  78.         while(!Echo);
  79.         TR0=1;
  80.         while(Echo);
  81.         TR0=0;
  82.         sum=TH0*256+TL0;
  83.         L=(sum*1.78)/100;
  84.         if(L<barrierDis&&flag==0){
  85.                 LED=0;
  86.                 return 0;
  87.         }
  88.         else{
  89.                 LED=1;
  90.                 flag=0;
  91.                 return 1;
  92.         }
  93. }
  94. void main(){
  95.                 LED=1;
  96.                 EA=1;
  97.                 ET0=1;
  98.                 ET1=1;
  99.                 TMOD=0x11;
  100.                 TH1=0xff;
  101.             TL1=0x9c;
  102.                 servorTime=0;
  103.                 while(1){
  104.                          stop();         
  105.                          control=15;//控制舵机使超声波模块正对前方
  106.                          servorTime=0;
  107.                          TR1=1;
  108.                          delay(200);
  109.                          TR1=0;
  110.                          turnUp();
  111.                          LED=0;
  112.                          delay(200);
  113.                          LED=1;
  114.                          while(getDistance()==1); //向前行驶,直到前方有障碍物
  115.                          do{
  116.                             stop();
  117.                                 control=22;           //使舵机向左摆动
  118.                                 servorTime=0;
  119.                                 TR1=1;
  120.                                  delay(200);
  121.                                 TR1=0;
  122.                                 rFlag=getDistance();
  123.                                  control=5;                 //使舵机向右摆动
  124.                                 servorTime=0;
  125.                                 TR1=1;
  126.                                  delay(200);
  127.                                 TR1=0;
  128.                                 lFlag=getDistance();
  129.                                 turnDown();
  130.                                 delay(220);
  131.                                 delay(220);
  132.                                 delay(220);
  133.                         }while(lFlag==0&&rFlag==0);
  134.                          if(rFlag==1&&lFlag==0)        //左侧没有障碍物
  135.                                  turnLeft();
  136.                          else if(rFlag==0&&lFlag==1)//右侧没有障碍物
  137.                                  turnRight();
  138.                          else if(rFlag==1&&lFlag==1)//两侧都没有障碍物,默认向左走
  139.                                  turnLeft();
  140.                          delay(220);
  141.                          delay(220);
  142.                          delay(200);
  143.                 }
  144. }
  145. void T1_int(void) interrupt 3{          //产生舵机所需要的脉冲
  146.                 TH1=0xff;
  147.                 TL1= 0x9c;
  148.                 servorTime++;
  149.                 if(servorTime<=control)
  150.                         servorControl=1;
  151.                 else
  152.                         servorControl=0;
  153.                 if(servorTime>=200)
  154.                         servorTime=0;
  155. }
  156. void T0_int(void) interrupt 1{          //超声波超出测量范围
  157.                 flag=1;
  158. }


复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-7-8 22:21:05 | 显示全部楼层
单片机中的程序和硬件是一一对应的
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-7-9 08:01:42 | 显示全部楼层
人造人 发表于 2021-7-8 22:21
单片机中的程序和硬件是一一对应的

老师让我找网上的程序学习;我只想找一个可以运行的.
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-7-9 08:03:11 | 显示全部楼层
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit left_forward=P1^0;        sbit left_backward=P1^1;
sbit right_forward=P1^2;        sbit right_backward=P1^3;
sbit TRIG=P2^0;        sbit ECHO=P2^1;
uint distance,count=0,flag=0;
void delay_ms(uint k);        void lint(void);//初始化
void right(uint ms);                void left(uint ms);
void forward(void);                void stop(void);
void emit(void);
int main(void)
{
        lint();
        stop();
        while(1)
        {
                emit();
                if(distance<30)
                {
                        right(500);
                        stop();
                        count++;
                }
                else
                {
                        forward();
                }
                if(count==2)
                {
                        count=0;left(1500);
                        stop();
                }
        }
}
void emit(void)//超声波
{
        TRIG=0;
        TRIG=1;
        delay_ms(1);
        TRIG=0;
        while(!ECHO);
        TR0=1;
        while(ECHO);
        TR0=0;
        if(flag)
        {
                flag=0;
                distance=300;
        }
        else
        {
                distance=(TH0<8)|TL0;
                distance=distance*1.7/100;
        }
        TH0=0;
        TL0=0;
}
void interrupt_timer0(void)interrupt 1
{
        TH0=0;
        TL0=0;
        flag=1;
}
void delay_ms(uint k)
{
        uint j,i;
        for(i=0;i<k;i++)
                for(j=0;j<125;j++);
}
void lint(void)//计时器
{
        TMOD=0x01;
        TH0=0;
        TL0=0;
        ET0=1;EA=1;TR0=0;
}
void right(uint ms)
{
        left_forward=0;right_forward=1;left_backward=1;right_backward=1;delay_ms(ms);
}
void left(uint ms)
{
        left_forward=1;right_forward=0;left_backward=1;right_backward=1;delay_ms(ms);
}

void forward(void)
{
        left_forward=0;right_forward=0;left_backward=0;right_backward=0;
}
void stop(void)
{
        left_forward=1;right_forward=1;left_backward=1;right_backward=1;
}

}
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-7-9 08:03:43 | 显示全部楼层
joe1 发表于 2021-7-9 08:03
#include
#define uchar unsigned char
#define uint unsigned int

这是我找得代码,运行不出来
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-7-9 08:04:17 | 显示全部楼层
joe1 发表于 2021-7-9 08:01
老师让我找网上的程序学习;我只想找一个可以运行的.

#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit left_forward=P1^0;        sbit left_backward=P1^1;
sbit right_forward=P1^2;        sbit right_backward=P1^3;
sbit TRIG=P2^0;        sbit ECHO=P2^1;
uint distance,count=0,flag=0;
void delay_ms(uint k);        void lint(void);//初始化
void right(uint ms);                void left(uint ms);
void forward(void);                void stop(void);
void emit(void);
int main(void)
{
        lint();
        stop();
        while(1)
        {
                emit();
                if(distance<30)
                {
                        right(500);
                        stop();
                        count++;
                }
                else
                {
                        forward();
                }
                if(count==2)
                {
                        count=0;left(1500);
                        stop();
                }
        }
}
void emit(void)//超声波
{
        TRIG=0;
        TRIG=1;
        delay_ms(1);
        TRIG=0;
        while(!ECHO);
        TR0=1;
        while(ECHO);
        TR0=0;
        if(flag)
        {
                flag=0;
                distance=300;
        }
        else
        {
                distance=(TH0<8)|TL0;
                distance=distance*1.7/100;
        }
        TH0=0;
        TL0=0;
}
void interrupt_timer0(void)interrupt 1
{
        TH0=0;
        TL0=0;
        flag=1;
}
void delay_ms(uint k)
{
        uint j,i;
        for(i=0;i<k;i++)
                for(j=0;j<125;j++);
}
void lint(void)//计时器
{
        TMOD=0x01;
        TH0=0;
        TL0=0;
        ET0=1;EA=1;TR0=0;
}
void right(uint ms)
{
        left_forward=0;right_forward=1;left_backward=1;right_backward=1;delay_ms(ms);
}
void left(uint ms)
{
        left_forward=1;right_forward=0;left_backward=1;right_backward=1;delay_ms(ms);
}

void forward(void)
{
        left_forward=0;right_forward=0;left_backward=0;right_backward=0;
}
void stop(void)
{
        left_forward=1;right_forward=1;left_backward=1;right_backward=1;
}

}
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-7-9 21:15:41 | 显示全部楼层
joe1 发表于 2021-7-9 08:01
老师让我找网上的程序学习;我只想找一个可以运行的.

"单片机中的程序和硬件是一一对应的"
"我只想找一个可以运行的."
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-7-11 17:49:21 | 显示全部楼层
人造人 发表于 2021-7-9 21:15
"单片机中的程序和硬件是一一对应的"
"我只想找一个可以运行的."

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-7-11 18:08:08 From FishC Mobile | 显示全部楼层
joe1 发表于 2021-7-11 17:49

首先你得有一个硬件,然后再研究和这个硬件相匹配的代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-7-13 07:49:39 | 显示全部楼层
学编程需要知道的 两个 网站  一个是国外的github 一个国内的 码云    你可以在上面找一下有没有你需要的
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-7-13 19:31:46 | 显示全部楼层

RAMXIZE(256)
* * * FATAL ERROR L210: I/O ERROR ON INPUT FILE:
        EXCEPTION 0021H:PATH OR FILE NOT FOUND
        FILE: C:\KEIL\C51\LTB\C51FPS.LTB
Target not created

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-7-14 09:45:35 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-7-14 10:28:14 | 显示全部楼层
单片机的代码和硬件是对应的,根据你硬件的不同引脚和IO的位置和地址也不同,所以操纵地址的代码也是不一样的,除非你找到的代码针对的开发板或者你自己做的板子的原理图IO分布位置一样否则是不能直接拿来用的
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-2 16:45

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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