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;
}
/*
**优先级 先是超声波发射方波 判断没有障碍后 红外扫描,后外扫描后电机转动。
**
*/
#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里面判断的是什么?