joe1 发表于 2021-7-8 21:57:42

超声波避障

麻烦来一个超声波避障的单片机程序啊,网上找到的运行不了;希望有注释。在下小白一枚。

君苏依寂 发表于 2021-7-8 21:57:43

#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define barrierDis 15      //距离障碍物的距离
uint sum;
float L;
sbit LED = P0^0;
sbit Trig = P1^1;           //超声波模块的TRIG
sbit Echo = P1^2;           //超声波模块的ECHO
sbit motorDriver_1 =P2^1;//控制第一个电机,从单片机出来后接L298n模块的IN1
sbit motorDriver_2 =P2^2;//控制第一个电机,从单片机出来后接L298n模块的IN2
sbit motorDriver_3 =P2^3;//控制第二个电机,从单片机出来后接L298n模块的IN3
sbit motorDriver_4 =P2^4;//控制第二个电机,从单片机出来后接L298n模块的IN4
sbit servorControl =P1^0;//舵机的控制引脚
uchar flag=0;
uchar control=5;
uchar servorTime=0;
uchar lFlag=0;//左方向是否有障碍的标志
uchar rFlag=0;//右方向是否有障碍的标志
void delay(uchar time){       //延迟函数
        uchar i;
        for(;time>0;time--){
                for(i=0;i<255;i++);
        }
}
void stop(){       //小车停止
        motorDriver_1=0;
        motorDriver_2=0;
        motorDriver_3=0;
        motorDriver_4=0;
}
void turnLeft(){                //小车向左转
        motorDriver_1=1;
        motorDriver_2=0;
        motorDriver_3=0;
        motorDriver_4=0;
}                                               //小车向右转
void turnRight(){
        motorDriver_1=0;
        motorDriver_2=0;
        motorDriver_3=1;
        motorDriver_4=0;
}
void turnUp(){                          //小车向前走
        motorDriver_1=1;
        motorDriver_2=0;
        motorDriver_3=1;
        motorDriver_4=0;
}
void turnDown(){                  //小车向后走
        motorDriver_1=0;
        motorDriver_2=1;
        motorDriver_3=0;
        motorDriver_4=1;
}
void openHc(){
   Trig=1;
   _nop_();
   _nop_();
   _nop_();
   _nop_();
   _nop_();
   _nop_();
   _nop_();
   _nop_();
   _nop_();
   _nop_();
   _nop_();
   _nop_();
   _nop_();
   Trig=0;
}
uchar getDistance(){//利用超声波模块判断有无障碍物
        TH0=0;
        TL0=0;
        openHc();
        while(!Echo);
        TR0=1;
        while(Echo);
        TR0=0;
        sum=TH0*256+TL0;
        L=(sum*1.78)/100;
        if(L<barrierDis&&flag==0){
                LED=0;
                return 0;
        }
        else{
                LED=1;
                flag=0;
                return 1;
        }
}
void main(){
                LED=1;
                EA=1;
                ET0=1;
                ET1=1;
                TMOD=0x11;
                TH1=0xff;
          TL1=0x9c;
                servorTime=0;
                while(1){
                       stop();       
                       control=15;//控制舵机使超声波模块正对前方
                       servorTime=0;
                       TR1=1;
                       delay(200);
                       TR1=0;
                       turnUp();
                       LED=0;
                       delay(200);
                       LED=1;
                       while(getDistance()==1); //向前行驶,直到前方有障碍物
                       do{
                          stop();
                                control=22;           //使舵机向左摆动
                                servorTime=0;
                                TR1=1;
                               delay(200);
                                TR1=0;
                                rFlag=getDistance();
                               control=5;               //使舵机向右摆动
                                servorTime=0;
                                TR1=1;
                               delay(200);
                                TR1=0;
                                lFlag=getDistance();
                                turnDown();
                                delay(220);
                                delay(220);
                                delay(220);
                        }while(lFlag==0&&rFlag==0);
                       if(rFlag==1&&lFlag==0)        //左侧没有障碍物
                               turnLeft();
                       else if(rFlag==0&&lFlag==1)//右侧没有障碍物
                               turnRight();
                       else if(rFlag==1&&lFlag==1)//两侧都没有障碍物,默认向左走
                               turnLeft();
                       delay(220);
                       delay(220);
                       delay(200);
                }
}
void T1_int(void) interrupt 3{          //产生舵机所需要的脉冲
                TH1=0xff;
                TL1= 0x9c;
                servorTime++;
                if(servorTime<=control)
                        servorControl=1;
                else
                        servorControl=0;
                if(servorTime>=200)
                        servorTime=0;
}
void T0_int(void) interrupt 1{          //超声波超出测量范围
                flag=1;
}


人造人 发表于 2021-7-8 22:21:05

单片机中的程序和硬件是一一对应的

joe1 发表于 2021-7-9 08:01:42

人造人 发表于 2021-7-8 22:21
单片机中的程序和硬件是一一对应的

老师让我找网上的程序学习;我只想找一个可以运行的.

joe1 发表于 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;
}

}

joe1 发表于 2021-7-9 08:03:43

joe1 发表于 2021-7-9 08:03
#include
#define uchar unsigned char
#define uint unsigned int


这是我找得代码,运行不出来

joe1 发表于 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;
}

}

人造人 发表于 2021-7-9 21:15:41

joe1 发表于 2021-7-9 08:01
老师让我找网上的程序学习;我只想找一个可以运行的.

"单片机中的程序和硬件是一一对应的"
"我只想找一个可以运行的."

joe1 发表于 2021-7-11 17:49:21

人造人 发表于 2021-7-9 21:15
"单片机中的程序和硬件是一一对应的"
"我只想找一个可以运行的."

wp231957 发表于 2021-7-11 18:08:08

joe1 发表于 2021-7-11 17:49


首先你得有一个硬件,然后再研究和这个硬件相匹配的代码

骚年¥学编程 发表于 2021-7-13 07:49:39

学编程需要知道的 两个 网站一个是国外的github 一个国内的 码云    你可以在上面找一下有没有你需要的

joe1 发表于 2021-7-13 19:31:46

君苏依寂 发表于 2021-7-12 13:00


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

Kayko 发表于 2021-7-14 09:45:35

{:10_257:}

王逗比666 发表于 2021-7-14 10:28:14

单片机的代码和硬件是对应的,根据你硬件的不同引脚和IO的位置和地址也不同,所以操纵地址的代码也是不一样的,除非你找到的代码针对的开发板或者你自己做的板子的原理图IO分布位置一样否则是不能直接拿来用的
页: [1]
查看完整版本: 超声波避障