用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++;
}
}为啥车子跑着跑着就停了呢,我后来在程序里面删去了停止的命令以后还是这样,但是指示灯都是亮着的?