很瞌睡 2022-09-27 17:12 采纳率: 50%
浏览 102
已结题

基于51单片机hc05控制小车无响应

**通过hc05蓝牙模块来控制小车的前进方向和避障功能,程序编译0错误0警告,但是烧录到51上面用spp蓝牙串口发送数据小车没有反应

img


**
程序如下

#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char 
#define uint  unsigned int 
 sbit IN1=P2^4;  
 sbit IN2=P2^3;  
 sbit IN3=P2^2; 
 sbit IN4=P2^1;
 sbit ENA=P2^5;
 sbit ENB=P2^0;
 sbit Echo = P0^6;                                  
 sbit Trig = P0^7;                                   
 sbit DJ = P0^5;
 uint stime = 0;                                 
 uint timer = 0;                                 
 uint S = 0;                                            
 uchar flag =0;                                                        
uchar PWMA,PWMB;
uint counter;
uchar i,j;
uchar jiaodu;
void delayms(uint ms)
{
    uint msi,msj;
    for(msi = 0;msi < ms;msi++)
        for(msj = 0;msj < 112;msj++);
}
void stop() 
{ 
  IN1=0;
  IN2=0;
  IN3=0;
  IN4=0; 
}

void turnleft() 
{ 
 IN1=1; 
 IN2=0; 
 PWMA = 25;
 IN3=1; 
 IN4=0;
 PWMB = 25; 
} 
void turnright()  
{ 
 IN1=0; 
 IN2=1;
 PWMA = 25; 
 IN3=0; 
 IN4=1;
 PWMB = 25; 
} 
void back() 
{ 
 IN1=1; 
 IN2=0;
 PWMA = 25; 
 IN3=0; 
 IN4=1; 
 PWMB = 25;
} 
void straight() 
{ 
 IN1=0; 
 IN2=1; 
 PWMA = 25;
 IN3=1; 
 IN4=0; 
 PWMB = 25;
}
void timer_init(){
    TMOD|=0x11;               
    TH0=0;
    TL0=0;          
    TH1=0xFE;                       
    TL1=0x33;
    ET0=1;                  
    ET1=1;                          
    TR1=1;                          
    EA=1;
    jiaodu=3;  
}
void hcsr04()
{
    Trig=1;                       
    _nop_(); 
    _nop_(); 
    _nop_(); 
    _nop_(); 
    _nop_();
    _nop_(); 
    _nop_(); 
    _nop_(); 
    _nop_(); 
    _nop_(); 
    _nop_();                       
    Trig=0;
    while(!Echo);               
    TR0=1;                          
    while(Echo);                    
    TR0=0;                            
}
void distance(void)
{
    stime=TH0*256+TL0;         
    TH0=0;
    TL0=0;                                 
    S=(stime*1.8)/100;      
}
void compare_distance()
{
     if(jiaodu ==3 && S >= 15)
    {
        straight();
        hcsr04();
        distance();
    }
    else if(jiaodu ==3 && S < 15)
    {
        stop();
        jiaodu = 2;
        delayms(200);
        hcsr04();
        distance();
    }
    if(jiaodu == 2 && S >=15)
    {
        turnright();
        delayms(500);
        jiaodu =3;
        delayms(200);
        hcsr04();
        distance();
    }
    else if(jiaodu == 2 && S < 15)
    {
        jiaodu = 4;
        delayms(200);
        hcsr04();
        distance();
    }
    if(jiaodu == 4 && S >=15)
    {
        turnleft();
        delayms(500);
        jiaodu =3;
        delayms(200);
        hcsr04();
        distance();
    }
    else if(jiaodu == 4 && S <15)
    {
        jiaodu =3;
        delayms(200);
        hcsr04();
        distance();
    }
}
void run(){
        hcsr04();                       
        distance();                    
       compare_distance();    
}
void Tmr1_isr() interrupt 3 
{
    TH1=0xFE;                          
    TL1=0x33;
    i++;
    j++;
    counter++;
  if(counter <= jiaodu) DJ = 1;
    if(counter > jiaodu && counter <= 40) DJ = 0;
    if(counter > 40) counter = 0;
    if(i < PWMA)
    {
        ENA = 1;
    }
    else
    {
        ENA = 0;
        if(i >= 100)
        {
            i = 0;
        }
    }
    if(j < PWMB)
    {
        ENB = 1;
    }
    else
    {
        ENB = 0;
        if(j >= 100)
        {
            j = 0;
        }
    }
}

void Tmr0_isr() interrupt 1  
{
    flag=1;                                    
}
 
void usartinit() 
{ 
 SCON=0X50; 
 TMOD=0X20; 
 PCON=0X80; 
 TH1=0XFA; 
 TL1=0XFA; 
 ES=1; 
 EA=1; 
 TR1=1; 
 ET1 = 0; 
} 
void main() 
{ 
 usartinit();
 timer_init(); 
 while(1);
} 
void usart()interrupt 4 
{  
uchar res; 
if(RI==1) 
 { 
    RI=0; 
    IN1=0; 
    IN2=0; 
    IN3=0; 
    IN4=0; 
    res=SBUF; 
switch(res) 
  { 
 case('1'):turnleft();
 break; 
 case('2'):turnright();
 break; 
 case('3'):back();
 break; 
 case('4'):straight();
 break;
 case('5'):run();
 break; 
 case('0'):stop();
 break; 
  } 
 } 
}

  • 写回答

4条回答 默认 最新

  • The_All 2022-09-27 18:41
    关注

    定时器的问题 定时器1使用重复

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 10月5日
  • 已采纳回答 9月27日
  • 创建了问题 9月27日

悬赏问题

  • ¥15 javaFX利用scene builder的fxml文件进行开发时的label setText方法未生效问题
  • ¥15 notepad++ 自动补全提示,如输入汉字"人名",就会出现"张三","李四"
  • ¥15 如何用matlab实现PSO算法与两种智能优化算法在30维和50维问题上的性能比较?
  • ¥15 在qt的QGraphicsView和QGraphicsScene中遇到的问题
  • ¥50 如何完美解决谷歌礼品卡支付不被检测
  • ¥15 nslt的可用模型,或者其他可以进行推理的现有模型
  • ¥15 arduino上连sim900a实现连接mqtt服务器
  • ¥15 vncviewer7.0安装后如何正确注册License许可证,激活使用
  • ¥15 phython如何实现以下功能?查找同一用户名的消费金额合并2
  • ¥66 关于人体营养与饮食规划的线性规划模型