超声波避障小车
#include <reg52.h>#define uchar unsigned char
#define uintunsigned int
sbit Trig = P3^2 ; //超声波TX管脚
sbit Echo = P3^3 ; //超声波EX管脚
sbit pwm= P3^7;//PWM信号输出口
sbit IN1=P1^0; //定义电机驱动信号输出端
sbit IN2=P1^1; //定义电机驱动信号输出端
sbit IN3=P1^2; //定义电机驱动信号输出端
sbit IN4=P1^3; //定义电机驱动信号输出端
uchar count; //0.5ms计数次数
uchar jd; //转动的角度
uint time,S,S1,S2,S3,S4,S5; //距离变量 ,从左到右为各个方向距离变量180度舵机转5个方位
void DelayUs2x(uchar t) //延时函数
{
while(--t);
}
void DelayMs(uint t)
{
while(t--)
{
//大致延时1mS
DelayUs2x(245);
DelayUs2x(245);
}
}
/********************************************************************
* 名称 :qian()
* 功能 : 两个电机前进。34为左电机
***********************************************************************/
void qian()
{
IN1=0;
IN2=1;
IN3=1;
IN4=0;
}
/********************************************************************
* 名称 :ting()
* 功能 : 两个电机停止。
***********************************************************************/
voidting()
{
IN1=0;
IN2=0;
IN3=0;
IN4=0;
}
/********************************************************************
* 名称 :hou()
* 功能 : 两个电机后退。
***********************************************************************/
void hou()
{
IN1=1;
IN2=0;
IN3=0;
IN4=1;
}
/********************************************************************
* 名称 :manyou()
* 功能 : 右停左前。
***********************************************************************/
voidmanyou()
{
IN1=0;
IN2=1;
IN3=0;
IN4=0;
}
/********************************************************************
* 名称 :kuaiyou()
* 功能 : 右前左后。
***********************************************************************/
voidkuaiyou()
{
IN1=0;
IN2=1;
IN3=0;
IN4=1;
}
/********************************************************************
* 名称 :manzuo()
* 功能 : 左停右前。
***********************************************************************/
voidmanzuo()
{
IN1=0;
IN2=0;
IN3=1;
IN4=0;
}
/********************************************************************
* 名称 :kuaizuo()
* 功能 : 右后左前。
***********************************************************************/
voidkuaizuo()
{
IN1=1;
IN2=0;
IN3=1;
IN4=0;
}
/*------------------------------------------------
定时器1初始化
------------------------------------------------*/
void Timer1Init(void)//500微秒@11.0592MHz
{
TMOD = 0x10;
TH1 = 0x0FE;
TL1 = 0x33;
EA = 1;
ET1 = 1;
TR1 = 1;
}
/*------------------------------------------------
定时器0初始化子程序
------------------------------------------------*/
void Init_Timer0(void)
{
TMOD |= 0x01; //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响
}
void chaoshengbo ()
{
TR0=0; //定时器开关
TH0=0;
TL0=0;
Trig=0;
Echo=0;
Trig=1;
DelayUs2x(20);
Trig=0;
while(Echo==0); //等待Echo回波引脚变高电平
TR0=1; //定时器0开关打开
while(Echo); //等待
time=TH0*256+TL0;
S=time*0.0172;//厘米
if(S>400)S=400;
}
/*------------------------------------------------
主函数
------------------------------------------------*/
main()
{
jd=3;
count=0;
Timer1Init(); //初始化定时器
Init_Timer0();
while(1)
{
chaoshengbo();
if (S>25)
{
qian();
}
else
{
ting();
jd=5;count=0;
DelayMs(600);
chaoshengbo();
S5=S;
jd=4;count=0;
DelayMs(600);
chaoshengbo();
S4=S;
jd=3;count=0;
DelayMs(600);
chaoshengbo();
S3=S;
jd=2;count=0;
DelayMs(600);
chaoshengbo();
S2=S;
jd=1;count=0;
DelayMs(600);
chaoshengbo();
S1=S;
jd=3;count=0;
DelayMs(600);
if(S3<25)
{
hou();
DelayMs(300);
}
if((S5>25||S4>25)&&(S3<=25||S2<=25))
{
manyou();
DelayMs(600);
}
else if((S3>25||S2>25)&&(S5<=25||S4<=25))
{
manzuo();
DelayMs(600);
}
else
{
hou();
DelayMs(300);
if(S5>S5||S4>S4){kuaiyou();
}
else {
kuaizuo();
}
DelayMs(600);
}
}
}
}
/*------------------------------------------------
定时器中断子程序
------------------------------------------------*/
void Time1_Int() interrupt 3
{
TH1 = 0xFE;
TL1 = 0x33;
if(count< jd)pwm=1;
else pwm=0;
count++;
count%=40;
}
这是51单片机的吧,你这一堆没头没脑的代码是想表达什么意思呢 Z.W 发表于 2018-11-30 22:06
哈哈,是的。点错了,不好意思啊。感谢指教!
后半部分写的是超声波的算法。这个需要将超声波避障器安装 ...
你打算把超声波模块装在哪个位置太低的话 有可能被小车自身硬件干扰太高的话又无法检测到小块的障碍物 或者你是打算只在车头位置安装但是如果就车头的话 并不需要五个方向的数据啊 记得初中的时候老师讲过,然鹅,啥都记不住了 请楼主对每一行代码进行解释说明,就更完美了! ………… 留块钱吃早饭 发表于 2018-11-29 23:39
记得初中的时候老师讲过,然鹅,啥都记不住了
这么优秀的吗 不明觉厉~~ 不明觉厉~~ 这是51单片机的代码然而小车类的代码网上一搜一大堆 你这个有什么特殊之处吗 这是啥板的代码