好友
阅读权限10
听众
最后登录1970-1-1
|
Z.W
发表于 2018-11-29 23:05
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned 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()
* 功能 : 两个电机停止。
***********************************************************************/
void ting()
{
IN1=0;
IN2=0;
IN3=0;
IN4=0;
}
/********************************************************************
* 名称 :hou()
* 功能 : 两个电机后退。
***********************************************************************/
void hou()
{
IN1=1;
IN2=0;
IN3=0;
IN4=1;
}
/********************************************************************
* 名称 :manyou()
* 功能 : 右停左前。
***********************************************************************/
void manyou()
{
IN1=0;
IN2=1;
IN3=0;
IN4=0;
}
/********************************************************************
* 名称 :kuaiyou()
* 功能 : 右前左后。
***********************************************************************/
void kuaiyou()
{
IN1=0;
IN2=1;
IN3=0;
IN4=1;
}
/********************************************************************
* 名称 :manzuo()
* 功能 : 左停右前。
***********************************************************************/
void manzuo()
{
IN1=0;
IN2=0;
IN3=1;
IN4=0;
}
/********************************************************************
* 名称 :kuaizuo()
* 功能 : 右后左前。
***********************************************************************/
void kuaizuo()
{
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;
}
|
免费评分
-
查看全部评分
|
发帖前要善用【论坛搜索】功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。 |
|
|
|
|