标题:
我的单片机pwm寻迹小车源程序
[打印本页]
作者:
俣戈
时间:
2017-10-23 20:40
标题:
我的单片机pwm寻迹小车源程序
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit Z1=P2^0; //左电机前进
sbit Z2=P2^1; //左电机后退
sbit Y1=P2^2; //右电机前进
sbit Y2=P2^3; //右电机后退
sbit ENA=P0^0;
sbit ENB=P0^1;
sbit L1=P1^0; //左1
sbit L2=P1^1; //左2
sbit R1=P1^2; //右1
sbit R2=P1^3; //右2
double a=0;
int aa=0,d=0,c=0;
uchar b,bb;
uchar pwm_val_left =0;
double push_val_left =0; //左电机占空比N/10
uchar pwm_val_right =0;
double push_val_right=0; //右电机占空比N/10
bit Right_moto_stp=1;
bit Left_moto_stp =1;
void run1(void) //前进函数
{
push_val_left =5.5; //PWM 调节参数1-20 1为最慢20是最快 改这个值可以改变其速度
push_val_right =5.5; //PWM 调节参数1-20 1为最慢20是最快 改这个值可以改变其速度
Z1=0;Z2=1;
Y1=0;Y2=1;
}
void run(void) //前进函数
{
push_val_left =20; //PWM 调节参数1-20 1为最慢20是最快 改这个值可以改变其速度
push_val_right =20; //PWM 调节参数1-20 1为最慢20是最快 改这个值可以改变其速度
Z1=0;Z2=1;
Y1=0;Y2=1;
}
void run2(void) //前进函数
{
push_val_left =9; //PWM 调节参数1-20 1为最慢20是最快 改这个值可以改变其速度
push_val_right =9; //PWM 调节参数1-20 1为最慢20是最快 改这个值可以改变其速度
Z1=0;Z2=1;
Y1=0;Y2=1;
}
void left(void) //直角左转函数
{
push_val_left =18;
push_val_right =18;
Z1=1;Z2=0;
Y1=0;Y2=1;
}
void left1(void) //左转函数
{
push_val_left =16;
push_val_right =16;
Z1=1;Z2=0;
Y1=0;Y2=1;
}
void left2(void) //小左转函数
{
push_val_left =19;
push_val_right =19;
Z1=1;Z2=1;
Y1=0;Y2=1;
}
void right(void) //直角右转函数
{
push_val_left =18;
push_val_right =18;
Z1=0;Z2=1;
Y1=1;Y2=0;
}
void right1(void) //右转函数
{
push_val_left =16;
push_val_right =16;
Z1=0;Z2=1;
Y1=1;Y2=0;
}
void right2(void) //小右转函数
{
push_val_left =19;
push_val_right =19;
Z1=0;Z2=1;
Y1=1;Y2=1;
}
void stop(void)
{
Z1=1;Z2=1;
Y1=1;Y2=1;
}
void pwm_out_left_moto(void) //左电机调速,调节push_val_left的值改变电机转速,占空比
{
if(Left_moto_stp)
{
{if(pwm_val_left<=push_val_left)
{ ENB=1;}
else
{ENB=0;}
}
{if(pwm_val_left>=20)
{pwm_val_left=0;}
}
}
else
{ENB=0;}
}
void pwm_out_right_moto(void) //右电机调速,调节push_val_left的值改变电机转速,占空比
{
if(Right_moto_stp)
{
if(pwm_val_right<=push_val_right)
{ENA=1;}
else
{ENA=0;}
if(pwm_val_right>=20)
{pwm_val_right=0;}
}
else
{ENA=0;}
}
void xunji()
{
if(L1==1&&L2==1&&R1==1&&R2==1)
a++;
if(L1==0&&L2==0&&R1==0&&R2==0)
{run();aa++;}
if((L1==1&&L2==0&&R1==0&&R2==0)||(L1==1&&L2==1&&R1==1&&R2==0)||(L1==1&&L2==1&&R1==0&&R2==0))
left1();
if((L1==0&&L2==0&&R1==0&&R2==1)||(L1==0&&L2==1&&R1==1&&R2==1)||(L1==0&&L2==0&&R1==1&&R2==1))
right1();
if(L1==0&&L2==1&&R1==0&&R2==0) left2();
if(L1==0&&L2==0&&R1==1&&R2==0) right2();
if((L1==1&&L2==1&&R1==1&&R2==1)&&a>=100)
{
stop(); a=0;
}
if(aa>=13000) { bb=1; aa=0; }
while(bb==1)
{
if(L1==0&&L2==0&&R1==0&&R2==0) run2();
if((L1==1&&L2==0&&R1==0&&R2==0)||(L1==1&&L2==1&&R1==1&&R2==0)||(L1==1&&L2==1&&R1==0&&R2==0))
left1();
if((L1==0&&L2==0&&R1==0&&R2==1)||(L1==0&&L2==1&&R1==1&&R2==1)||(L1==0&&L2==0&&R1==1&&R2==1))
right1();
if(L1==0&&L2==1&&R1==0&&R2==0) {left2();aa++;}
if(L1==0&&L2==0&&R1==1&&R2==0) {right2();aa++;}
while(aa>=700)
{
if(L1==0&&L2==0&&R1==0&&R2==0)
run();
if((L1==1&&L2==0&&R1==0&&R2==0)||(L1==1&&L2==1&&R1==1&&R2==0)||(L1==1&&L2==1&&R1==0&&R2==0))
left1();
if((L1==0&&L2==0&&R1==0&&R2==1)||(L1==0&&L2==1&&R1==1&&R2==1)||(L1==0&&L2==0&&R1==1&&R2==1))
right1();
if(L1==0&&L2==1&&R1==0&&R2==0) {left2();}
if(L1==0&&L2==0&&R1==1&&R2==0) right2();
if(L1==1&&L2==1&&R1==1&&R2==1) a++;
if((a>=60))
{
b=1;
}
while(b==1)
{
if(L1==0&&L2==0&&R1==0&&R2==0)
run1();
if((L1==1&&L2==0&&R1==0&&R2==0)||(L1==1&&L2==1&&R1==1&&R2==0)||(L1==1&&L2==1&&R1==0&&R2==0))
left();
if((L1==0&&L2==0&&R1==0&&R2==1)||(L1==0&&L2==1&&R1==1&&R2==1)||(L1==0&&L2==0&&R1==1&&R2==1))
right();
if(L1==0&&L2==1&&R1==0&&R2==0) {left2(); c++;}
if(L1==0&&L2==0&&R1==1&&R2==0) {right2();d++;}
while(c+d>=15000)
{
if(L1==0&&L2==0&&R1==0&&R2==0) run();
if((L1==1&&L2==0&&R1==0&&R2==0)||(L1==1&&L2==1&&R1==1&&R2==0)||(L1==1&&L2==1&&R1==0&&R2==0))
left1();
if((L1==0&&L2==0&&R1==0&&R2==1)||(L1==0&&L2==1&&R1==1&&R2==1)||(L1==0&&L2==0&&R1==1&&R2==1))
right1();
if(L1==0&&L2==1&&R1==0&&R2==0) left2();
if(L1==0&&L2==0&&R1==1&&R2==0) right2();
if(L1==1&&L2==1&&R1==1&&R2==1) stop();
}
if((L1==1&&L2==1&&R1==1&&R2==1))
{
stop(); a=0;
}
}
}
}
// if((a>=60))
// {
// b=1;
// }
// while(b==1)
// {
// if(L1==0&&L2==0&&R1==0&&R2==0)
// run1();
// if((L1==1&&L2==0&&R1==0&&R2==0)||(L1==1&&L2==1&&R1==1&&R2==0)||(L1==1&&L2==1&&R1==0&&R2==0))
// left();
// if((L1==0&&L2==0&&R1==0&&R2==1)||(L1==0&&L2==1&&R1==1&&R2==1)||(L1==0&&L2==0&&R1==1&&R2==1))
// right();
// if(L1==0&&L2==1&&R1==0&&R2==0) {left2(); c++;}
// if(L1==0&&L2==0&&R1==1&&R2==0) {right2();d++;}
//
// while(c+d>=15000)
// {
// if(L1==0&&L2==0&&R1==0&&R2==0) run();
// if((L1==1&&L2==0&&R1==0&&R2==0)||(L1==1&&L2==1&&R1==1&&R2==0)||(L1==1&&L2==1&&R1==0&&R2==0))
// left1();
// if((L1==0&&L2==0&&R1==0&&R2==1)||(L1==0&&L2==1&&R1==1&&R2==1)||(L1==0&&L2==0&&R1==1&&R2==1))
// right1();
// if(L1==0&&L2==1&&R1==0&&R2==0) left2();
// if(L1==0&&L2==0&&R1==1&&R2==0) right2();
// if(L1==1&&L2==1&&R1==1&&R2==1) stop();
// }
//
// if((L1==1&&L2==1&&R1==1&&R2==1))
// {
// stop(); a=0;
// }
//
// }
}
/***********TIMER0中断服务子函数产生PWM信号**********/
void timer0()interrupt 1 using 2
{
TH0=0XFC; //2Ms定时
TL0=0X30;
pwm_val_left++;
pwm_val_right++;
pwm_out_left_moto();
pwm_out_right_moto();
}
/***************************************************/
void main(void)
{
TMOD=0X01;
TH0= 0XFC; //2ms定时
TL0= 0X30;
TR0= 1;
ET0= 1;
EA = 1;
while(1) /*无限循环*/
{
xunji();
}
}
复制代码
作者:
平淡是真963
时间:
2017-10-24 22:52
楼主能分享一下电路图吗?
作者:
TYM
时间:
2017-11-16 15:42
楼主有电路图吗
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1