找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 194|回复: 2
打印 上一主题 下一主题
收起左侧

大佬帮忙看一下,我这个代码到底哪里写错了?智能小车它一直运行的非常卡顿

[复制链接]
跳转到指定楼层
楼主
ID:1164343 发表于 2025-12-27 19:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include <reg52.h>
#include <intrins.h>


sbit Trig2 = P2^5;   
sbit Echo2 = P2^4;   
sbit Trig1 = P2^7;
sbit Echo1 = P2^6;
sbit Trig3 = P2^3;
sbit Echo3 = P2^2;
sbit AIN1 = P0^0;
sbit AIN2 = P0^1;
sbit PWMA = P1^0;
sbit BIN1 = P0^2;
sbit BIN2 = P0^3;
sbit PWMB = P1^1;

sbit AIN1_Front = P0^5;
sbit AIN2_Front = P0^4;
sbit PWMA_Front = P1^2;
sbit BIN1_Front = P0^7;
sbit BIN2_Front = P0^6;
sbit PWMB_Front = P1^3;


#define STOP_DISTANCE 20  
#define MAX_DISTANCE 400


void Delay10us(unsigned int us)
        {
    while(us--) {
        _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
        _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
    }
}

void Timer0_Init(void)
        {
    TMOD &= 0xF0;
    TMOD |= 0x01;   
    TH0 = 0;        
    TL0 = 0;
    ET0 = 0;        
    TR0 = 0;        
}
        void Delay_ms(unsigned int ms) {
    unsigned int i, j;
   
    for(i = 0; i < ms; i++) {
        for(j = 0; j < 120; j++) {
        }
    }
}
void Delay_ms(unsigned int ms);
unsigned int Get_Distance2(void);
unsigned int Get_Distance1(void);
unsigned int Get_Distance3(void);
void Motor_Stop(void);
void Turn1(void);
void Turn3(void);
void Motor_Forward(void);


unsigned int Get_Distance2(void) {
    unsigned int time_val = 0;
    unsigned int timeout = 50000;

    Trig2 = 1;
    Delay10us(2);   
    Trig2 = 0;

    while(!Echo2 && timeout--) {
        if(timeout == 0) return MAX_DISTANCE;
    }

    TR0 = 1;
    TH0 = 0;
    TL0 = 0;
    timeout = 50000;

    while(Echo2 && timeout--) {
        if(timeout == 0) {
            TR0 = 0;
            return MAX_DISTANCE;
        }
    }
    TR0 = 0;

    time_val = (TH0 << 8) | TL0;
    TH0 = 0;
    TL0 = 0;

    time_val = time_val / 63;
    if(time_val > MAX_DISTANCE) time_val = MAX_DISTANCE;
    return time_val;
}

unsigned int Get_Distance1 (void) {
    unsigned int time_val = 0;
    unsigned int timeout = 50000;
   
    Trig1 = 1;
    Delay10us(2);
    Trig1 = 0;
   
    while(!Echo1 && timeout) {
        timeout--;
    }
    if(timeout == 0) {
        TR0 = 0;
        return MAX_DISTANCE;
    }
   
    TH0 = 0; TL0 = 0; TF0 = 0;
    TR0 = 1;
   
    timeout = 50000;
    while(Echo1 && timeout) {
        timeout--;
    }
    TR0 = 0;
   
    time_val = (TH0 << 8) | TL0;
    TH0 = 0; TL0 = 0;
   
    time_val = time_val / 63;
   
    if(time_val > MAX_DISTANCE)
        time_val = MAX_DISTANCE;
   
    return time_val;
}

unsigned int Get_Distance3(void) {
    unsigned int time_val = 0;
    unsigned int timeout = 50000;
   
    Trig3 = 1;
    Delay10us(2);
    Trig3 = 0;
   
    while(!Echo3 && timeout) {
        timeout--;
    }
    if(timeout == 0) {
        TR0 = 0;
        return MAX_DISTANCE;
    }
   
    TH0 = 0; TL0 = 0; TF0 = 0;
    TR0 = 1;
   
    timeout = 50000;
    while(Echo3 && timeout) {
        timeout--;
    }
    TR0 = 0;
   
    time_val = (TH0 << 8) | TL0;
    TH0 = 0; TL0 = 0;
   
    time_val = time_val / 63;  
   
    if(time_val > MAX_DISTANCE)
        time_val = MAX_DISTANCE;
   
    return time_val;
}


void Turn1(void) {
   
    AIN1 = 0; AIN2 = 0; PWMA = 0;   
    BIN1 = 1; BIN2 = 0; PWMB = 1;   
   
    AIN1_Front = 0; AIN2_Front = 1; PWMA_Front = 1;  
    BIN1_Front = 1; BIN2_Front = 0; PWMB_Front = 1;  
}


void Turn3(void) {
   
    AIN1 = 1; AIN2 = 0; PWMA = 1;   
    BIN1 = 0; BIN2 = 0; PWMB = 0;   
   
   
    AIN1_Front = 1; AIN2_Front = 0; PWMA_Front = 1;  
    BIN1_Front = 0; BIN2_Front = 1; PWMB_Front = 1;  
}
void Motor_Forward(void) {
   
    AIN1 = 1; AIN2 = 0; PWMA = 1;
    BIN1 = 1; BIN2 = 0; PWMB = 1;
   
    AIN1_Front = 1; AIN2_Front = 0; PWMA_Front = 1;
    BIN1_Front = 1; BIN2_Front = 0; PWMB_Front = 1;
}
void Motor_Stop(void)
        {
    AIN1 = 0; AIN2 = 0;   
    BIN1 = 0; BIN2 = 0;   
    PWMA = 0; PWMB = 0;   
   
    AIN1_Front = 0; AIN2_Front = 0;   
    BIN1_Front = 0; BIN2_Front = 0;   
    PWMA_Front = 0; PWMB_Front = 0;   
}

void main(void) {
    unsigned int dist1, dist2, dist3;  
   
    Timer0_Init();      
    Motor_Stop();      
    Delay_ms(1000);     
   
    while(1) {
        dist2 = Get_Distance2();   
        Delay_ms(30);               
        dist1 = Get_Distance1();  
        Delay_ms(30);               
        dist3 = Get_Distance3();
        Delay_ms(30);            
        
        if(dist2 < STOP_DISTANCE) {
            Motor_Stop();           
            Delay_ms(200);         
            
            if(dist1 > dist3) {
              
                Turn1();     
                Delay_ms(400);      
                Motor_Stop();      
                Delay_ms(100);   
            } else {
                Turn3();      
                Delay_ms(400);   
                Motor_Stop();      
                Delay_ms(100);  
            }
            
            Motor_Forward();      
            Delay_ms(500);         
            
        } else if(dist1 < (STOP_DISTANCE / 2))
                                {
            Turn3();           
            Delay_ms(100);         
            
        } else if(dist3 < (STOP_DISTANCE / 2))
                                {
            Turn1();         
            Delay_ms(100);        
            
        } else {
            Motor_Forward();      
        }
        Delay_ms(100);         
    }
}
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:857072 发表于 2025-12-28 08:38 来自触屏版 | 只看该作者
Delay_ms()不要用了就好99%了。
回复

使用道具 举报

板凳
ID:1164343 发表于 2025-12-28 13:46 | 只看该作者
能具体讲一下是哪个有问题吗
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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