微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 51单片机做的小车

51单片机做的小车

时间:10-02 整理:3721RD 点击:
小车根据红外线寻迹,超声波检测到30厘米内有障碍就停下来。但是下载代码后小车检测到障碍并不能停下来,而且红外寻迹有反应,但是小车并不能寻迹,这是什么原因呢?下面是我的代码
/*
**优先级  先是超声波发射方波  判断没有障碍后 红外扫描,后外扫描后电机转动。
**
*/
#include<reg52.h>
#include <intrins.h>
#define uchar  unsigned char
#define  uint  unsigned int
sbit  fa1=P1^0;     //电机
sbit  fa2=P1^1;
sbit  fa3=P1^2;
sbit  fa4=P1^3;
sbit key1=P1^4;     //红外线
sbit key2=P1^5;
sbit key3=P1^6;
sbit key4=P1^7;
uint s,time;               //s距离
sbit  TX=P3^0;
sbit  RX=P3^1;
uchar F;    //标志位
void timer_Count(void);
void delay10us() {
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
}
void delay (uint z)
{
uint  x,y;
for (x=z;x>0;x--)
   for(y=110;y>0;y--);
}
void  StartModule() //超声波发射方波               
  {
      TX=1;                                
      delay10us();
      delay10us();
      TX=0;
  }
void  jisuan(void)  //计算距离
{   
    uchar b;
     time=TH0*256+TL0;
     TH0=0;
     TL0=0;
     timer_Count();
     b=(time*1.7)/100;   
}
  void PWM(uchar gao_num,uchar di_num)           //PWM信号变速
  {
     uchar i;
    for(i=0;i<di_num;i++)
    {
        fa1=0;fa2=0;fa3=0;fa4=0;
        delay10us();
    }
    for(i=0;i<gao_num;i++)
    {
        fa1=1;fa2=1;fa3=1;fa4=1;
        delay10us();
    }
        
  }
void keyscan(void)//红外扫描判断转向
{   

    if(key1==0&&key4==0)
         F = 0;
     else if(key1==0&&key4 == 1)//右边
        F=1;     
    else                    //左边
       F=2;   
}
void Forword()   //前
{
    fa1=1;
    fa2=1;
    fa3=1;
    fa4=1;
    PWM(1,3);
}
void stop()     //停止
{
    fa1=0;
    fa2=0;
    fa3=0;
    fa4=0;
    PWM(0,0);
}
void left()    //左
{
    fa1=1;
    fa2=0;
    fa3=1;
    fa4=0;
    PWM(1,3);
}
void right()   //右
{
    fa1=0;
    fa2=1;
    fa3=0;
    fa4=1;   
    PWM(1,3);
}
void main()
{         
    TMOD=0X01;    //初始化
    EA=1;
    ET0=1;
    TH0=0;
    TL0=0;
    while(1)
{   
    StartModule();                //超声波扫描
    timer_Count();
    jisuan();
    if(s>30)
    {
        keyscan();
        if(F==0)
        Forword();
        else if(F==1)
        right();
        else if(F==2)
        left();
    }
    else
        stop();
        delay(5);
}
}
void timer_Count(void)
{   
    while(!RX);
    TR0=1;
    while(RX);
    TR0=0;
}

我觉得,你的程序中这个定时器函数因为用到的是while函数,这样写可能造成主程序的里面的其他执行不正常。

void timer_Count(void)
{   
    while(!RX);
    TR0=1;
    while(RX);
    TR0=0;
}能跳出来吗?

你这个程序里面s都没有操作过,你white里面判断的是什么?

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top