微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 用51单片机做了个自动往返小车,车放到跑道上很多功能不能实现

用51单片机做了个自动往返小车,车放到跑道上很多功能不能实现

时间:10-02 整理:3721RD 点击:

程序如下,求大神帮忙看看是程序问题还是硬件问题,急急急,在此谢过!
#include "car.h"

void forward_1()
{
        In1=0;
        In2=1;
}
void back_1()
{
        In1=1;
        In2=0;
}
void forward_2()
{
         In3=0;
         In4=1;
}
void back_2()
{
         In3=1;
         In4=0;
}
void stop()
{
         EN1=0;
         EN2=0;
}
void go_straight()
{
         forward_1();
         forward_2();
}
void turn_right()
{
         forward_1();
         back_2();                                                                                                                                         
}
void turn_left()
{
         forward_2();
         back_1();
}

void timer1_init(void)        //定时器1
{
         TMOD=0x10;//定时器1 工作方式1
         TH1=(65536-50003)/256;         //20ms溢出一次
         TL1=(65536-50003)%256;                                                                                                                        
         EA=1;
         ET1=1;
         TR1=1;
}
void timer0_init(void)
{
         TMOD=0x01;//定时器1 工作方式1
         TH0=(65536-50)/256;         //20ms溢出一次
         TL0=(65536-50)%256;                                                                                                                        
         EA=1;
         ET0=1;
         TR0=1;
}

void INT0_init(void)
{ EA=1; EX0=1; IT0=1;//下降沿触发 }
void INT1_init(void)
{ EA=1; EX1=1; IT1=1;//下降沿触发 }
void int0()interrupt 0         //外部中断0
{ if(hw1==0) { delay_50us(100);//延时消抖 if(hw1==0) { num_front++; } } }                        

void main()
{
        //Init();
        PT1=1;
//        PX1=1;
        INT0_init()        ;
//        INT1_init()        ;         
        timer1_init();
        timer0_init();
        TMOD=0x11;        
        go_straight();
    percent=high_speed;                 
        while(1)
        {
            if(num_front==3||num_front==9)         //DE区减速
                {
                        go_straight();
                        percent=low_speed;
                }
                if(num_front==4||num_front==10)         //EF区稍微加速
                {
                        go_straight();
                        percent=mid_speed;
                }
//                if(num_front==5)        //FG区减速至停车
//                {
//                        go_straight();
//                        percent=low_speed;
//                        delay_50ms(40);
//                }
                if(num_front==6)
                {        
                        turn_right();  //小车调头
                        percent=high_speed;
                        delay_50ms(10);
                        stop();
                         percent=0;
                        delay_50ms(50);
                        percent=high_speed;
                        go_straight();        
                }        
           if(num_front==12)   // 小车返回终点,停下
           {
                 stop();
                 percent=0;
           }
        }
}

void timer1 ()interrupt 3          //中断函数,每50ms红外转向
{
        TH1=(65536-50003)/256;         //50ms溢出一次
    TL1=(65536-50003)%256;
        if(hw3==0)          //右边的红外
        {
          delay_50us(100);//延时消抖
          while(hw3==0)
          {
                EN1=1;
                EN2=1;
                percent=low_speed;
                turn_left();
          }
        if(hw3==1)
        {
          delay_50us(100);//延时消抖        
                if(hw3==1)
          {
                EN1=1;
                EN2=1;
                go_straight();
          }
        }
   }
   else if(hw4==0)          //左边的红外
        {
          delay_50us(100);//延时消抖
          while(hw4==0)
          {
                EN1=1;
                EN2=1;
                percent=low_speed;
                turn_right();
          }
        if(hw4==1)
        {
        delay_50us(100);
        if(hw4==1)
          {
                  EN1=1;
                EN2=1;
                go_straight();
          }
        }
  }
}
void timer0 ()interrupt 1
{
//         TF2=0;
         TH0=(65536-50)/256;         //20ms溢出一次
         TL0=(65536-50)%256;
        if(count>100)
        {
                count=0;
        }
        if(count>percent)
        {
                EN1=0;
                EN2=0;
                count++;
        }
        else if(count<=percent)
        {
                EN1=1;
                EN2=1;
                count++;
        }
}为啥车子跑着跑着就停了呢,我后来在程序里面删去了停止的命令以后还是这样,但是指示灯都是亮着的?

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

网站地图

Top