最近在做一個類似超聲波小車避障項目求大佬幫忙看看程序,設計一個小船,當超聲波測距小于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++;
}
|