|
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit Left_moto_pwm =P1^6; //接驅(qū)動模塊ENA 使能端,輸入PWM信號調(diào)節(jié)速度
sbit Right_moto_pwm =P1^5; //接驅(qū)動模塊ENB
sbit P21=P1^0; //接電機IN1
sbit P22=P1^1; //接電機IN2
sbit P23=P1^2; //接電機IN3
sbit P24=P1^3; //接電機IN4
sbit EchoPin=P3^6; //超聲波管腳定義
sbit TrigPin=P3^7;
uchar pwm_val_left =0;//變量定義
uchar pwm_val_right =0;//變量定義
uchar push_val_left =0;//左電機占空比N/10
uchar push_val_right=0;//右電機占空比N/10
uint distance;
uint count;
void delayus(uint i) //延時秒函數(shù)
{
while(i--);
}
/*******************************************
延時函數(shù)
********************************************/
void delay(uint z) //延時函數(shù)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
/************************************************************************/
/* PWM調(diào)制電機轉(zhuǎn)速 */
/************************************************************************/
/* 左電機調(diào)速 */
/*調(diào)節(jié)push_val_left的值改變電機轉(zhuǎn)速,占空比 */
void pwm_out_left_moto(void)
{
if(pwm_val_left<=push_val_left)
Left_moto_pwm=1;
else
Left_moto_pwm=0;
if(pwm_val_left>=10)
pwm_val_left=0;
}
/******************************************************************/
/* 右電機調(diào)速 */
void pwm_out_right_moto(void)
{
if(pwm_val_right<=push_val_right)
Right_moto_pwm=1;
else
Right_moto_pwm=0;
if(pwm_val_right>=10)
pwm_val_right=0;
}
/***************************************************/
/************************************************************************/
void run(void) //前進函數(shù)
{
push_val_left =3; //PWM 調(diào)節(jié)參數(shù)1-10 1為最慢,10是最快 改這個值可以改變其速度
push_val_right =3; //PWM 調(diào)節(jié)參數(shù)1-10 1為最慢,10是最快 改這個值可以改變其速度
P21=1;
P22=0;
P23=1;
P24=0;
}
/*********************************************************/
void stop(void) //停止函數(shù)
{
P21=1;
P22=1;
P23=1;
P24=1;
}
/************************************************************************/
void left()//左轉(zhuǎn)函數(shù)
{
push_val_left =2; //PWM 調(diào)節(jié)參數(shù)1-10 1為最慢,10是最快 改這個值可以改變其速度
push_val_right =4; //PWM 調(diào)節(jié)參數(shù)1-10 1為最慢,10是最快 改這個值可以改變其速度
P21=0;
P22=1;
P23=1;
P24=0;
}
/************************************************************************/
void right()//右轉(zhuǎn)函數(shù)
{
push_val_left =4; //PWM 調(diào)節(jié)參數(shù)1-10 1為最慢,10是最快 改這個值可以改變其速度
push_val_right =2; //PWM 調(diào)節(jié)參數(shù)1-10 1為最慢,10是最快 改這個值可以改變其速度
P21=1;
P22=0;
P23=0;
P24=1;
}
/************************************************************************/
void spin_right()//原地右轉(zhuǎn)函數(shù)
{
push_val_left =3; //PWM 調(diào)節(jié)參數(shù)1-10 1為最慢,10是最快 改這個值可以改變其速度
push_val_right =3; //PWM 調(diào)節(jié)參數(shù)1-10 1為最慢,10是最快 改這個值可以改變其速度
P21=1;
P22=0;
P23=0;
P24=1;
}
/************************************************************************/
void spin_left()//原地左轉(zhuǎn)函數(shù)
{
push_val_left =3; //PWM 調(diào)節(jié)參數(shù)1-10 1為最慢,10是最快 改這個值可以改變其速度
push_val_right =3; //PWM 調(diào)節(jié)參數(shù)1-10 1為最慢,10是最快 改這個值可以改變其速度
P21=0;
P22=1;
P23=1;
P24=0;
}
/************************************************************************/
void back()//后退函數(shù)
{
push_val_left =3; //PWM 調(diào)節(jié)參數(shù)1-10 1為最慢,10是最快 改這個值可以改變其速度
push_val_right =3; //PWM 調(diào)節(jié)參數(shù)1-10 1為最慢,10是最快 改這個值可以改變其速度
P21=0;
P22=1;
P23=0;
P24=1;
}
/************************************************************************/
///*TIMER0中斷服務(wù)子函數(shù)產(chǎn)生PWM信號*/
void timer0()interrupt 1
{
TH0=(65536-800)/256; //1MS定時
TL0=(65536-800)%256;
pwm_val_left++;
pwm_val_right++;
pwm_out_left_moto();
pwm_out_right_moto();
}
void timer1()interrupt 3
{
count++;
TH1=(65536-100)/256; //100us
TL1=(65536-100)%256;
}
void ultrasonic_trigger()
{
TrigPin=1;
delayus(15);
TrigPin=0;
}
int measure_Distance()
{
uint distance;
uchar l;
uint h,y;
ultrasonic_trigger();
while(!EchoPin); //觸發(fā)超聲波測距后,等待電平變?yōu)楦唠娖剑嫊r開始
TR1=1;
while(EchoPin); //超聲波回波后,等待電平變成低電平,計時結(jié)束
TR1=0;
l=TL1;
h=TH1;
y=(h<<8)+1;
y=y-0xfce0; //us部分 fc66
distance=y+100*count; //計算總時間,us部分+計時器計數(shù)的次數(shù)(每次100us)
TL1=0xe0; //66
TH1=0xfc;
distance=distance/58; //換算公式:us/58=cm 即0.017us=cm
TrigPin=0;
count=0;
return distance;
}
/***************************************************
主函數(shù)
***************************************************/
void main(void)
{
TMOD=0X01;
TH0=(65536-800)/256;
TL0=(66536-800)%256;
EA=1;
ET0=1;
TR0=1;
TMOD|=0x10; //定時器1工作方式
TH1=(65536-800)/256; //1ms定時,裝入初值
TL1=(66536-800)%256;
ET1=1; //允許T1中斷
TrigPin=0; //初始化超聲波管腳
while(1)
{
measure_Distance();
delayus(100);
if(distance>35)
{
run();
}
else if(distance>=25&&distance<=35)
{
run();
}
else if(distance<25)
{
spin_right();
stop();
delayus(100);
measure_Distance();
delayus(100);
if (distance>=25)
{
run();
}
else if (distance<25)
{
spin_left();
stop();
delayus(100);
if (distance>=25)
{
run();
}
else if(distance<25)
{
spin_left();
stop();
delayus(100);
}
}
}
}
}
|
|