最近在做一个类似超声波小车避障项目求大佬帮忙看看程序,设计一个小船,当超声波测距小于20舵机右转,继续前进如果距离减小则舵机左转,如果距离大于20则舵机置中间位
下面是我写的代码 (刚开始写 求放过)
#include<reg52.h>
#include<stdio.h>
#include<intrins.h>
#include <math.h>
typedef unsigned char uchar;
typedef unsigned int uint;
sbit Trig=P2^3; //控制端
sbit Echo=P2^4; //接收端
sbit PWM_OUT=P2^1; //PWM输出口
uint PWM_Value; //定义pwm值
uchar order=0;
unsigned char T0RH=0;
unsigned char T0RL=0;
uchar flag; //舵机按键标志
void Delay(unsigned int s); //延时函数声明
uchar flag; //舵机按键标志
/*延时函数*/
void Delay_us(unsigned char t)
{
while(--t);
} //大约延时t*2+5us 超声波模块用
void time_init()
{
EA=1;
TMOD=0x11;
TH0 = 0;
TL0 = 0;
ET0 = 1;
TR0 = 1;
PT0=1;
} //初始化定时器
void main()
{
unsigned int time,distance,last;
Trig=0;
Echo=0;
Delay_us(6000);
PWM_Value =1190; //pwm初值为1190中位
time_init();
while(1)
{
Trig=1;
Delay_us(5);
Trig=0;
while(Echo==0);
TR0=1;
while(Echo);
TR0=0;
time=TH0*256+TL0;
distance=(int)(time*0.017); //计算路程 单位为cm
if(distance<20) //如果距离小于20cm 舵机右转
{
flag = 1;
last=distance;
}
else
{
flag=0;
}
Delay_us(5);
if(distance<last)
{
flag=2;
}
else
{
flag=0;
}
}
}
/*****中断程序*******/
void timer0(void) interrupt 1
{
if(flag==1) PWM_Value += 1; //如果标志位1时,pwm的值加1
if(flag==2) PWM_Value -= 3; //如果标志位为2时,pwm减1
if(PWM_Value>=2500) //如果pwm的值大于2500
PWM_Value = 2500; //则保持在2500
if(PWM_Value<=500) //如果pwm的值小于500
PWM_Value=500; //则保持在500
switch(order)
{
case 1:PWM_OUT=1;
TH0=(65536-PWM_Value)>>8;
TL0=(uchar)(65536-PWM_Value);
break;
case 2:PWM_OUT=0;
TH0=(65536-(5000-PWM_Value))>>8;
TL0=(uchar)(65536-(5000-PWM_Value));
break;
case 3:
TH0=60536>>8;
TL0=(uchar)60536;
break;
case 4:
TH0=60536>>8;
TL0=(uchar)60536;
order=0;
break;
default: order=0;
break;
}
order++;
}
|