標(biāo)題:
智能四路循跡小車過直角的單片機(jī)源程序
[打印本頁]
作者:
稻草君
時(shí)間:
2017-10-25 22:23
標(biāo)題:
智能四路循跡小車過直角的單片機(jī)源程序
單片機(jī)源程序如下:
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
#define Right_moto_pwm P3^0; //ENA
#define Left_moto_pwm P3^1; //ENB
///////////////////////////
sbit P22=P2^2; // 左前車輪
sbit P23=P2^3; // 左后車輪
sbit P24=P2^4; //右前車輪
sbit P25=P2^5; //右后車輪
////////////////////////////////
sbit P10=P1^0;// 紅1外
sbit P11=P1^1; //紅2外
sbit P12=P1^2; // 紅3外
sbit P13=P1^3;//紅4外
/////////////////////////////////
sbit P20=P3^0;
sbit P21=P3^1;
uchar pwm_val_left =0;
double push_val_left =0; //左電機(jī)占空比N/10
double pwm_val_right =0;
uchar push_val_right=0; //右電機(jī)占空比N/10
bit Right_moto_stp=1;
bit Left_moto_stp =1;
double time=0;
int flag=0;
void stop(void)
{
P22=1;
P23=1;
P24=1;
P25=1;
}
void run(void)
{
push_val_left =16;//PWM 調(diào)節(jié)參數(shù)1-20 1為最慢20是最快 改這個(gè)值可以改變其速度
push_val_right =16;//} //PWM 調(diào)節(jié)參數(shù)1-20 1為最慢20是最快 改這個(gè)值可以改變其速度
P22=0;
P23=1;
P24=0;
P25=1;
}
void run1(void)
{
push_val_left =7;
push_val_right =7;
P22=0;
P23=1;
P24=0;
P25=1;
}
void left(void) //左轉(zhuǎn)
{
push_val_left =20;
push_val_right =20;
P22=1;
P23=1;
P24=0;
P25=1;
}
void left1(void) //左轉(zhuǎn)
{
push_val_left =20;
push_val_right =19;
P22=1;
P23=0;
P24=0;
P25=1;
}
void right(void) //右轉(zhuǎn)
{
push_val_left =18;
push_val_right =18;
P22=0;
P23=1;
P24=1;
P25=1;
}
void right1(void) //右轉(zhuǎn)
{
push_val_left =20;
push_val_right =19;
P22=0;
P23=1;
P24=1;
P25=0;
}
void pwm_out_left_moto(void) //左電機(jī)調(diào)速,調(diào)節(jié)push_val_left的值改變電機(jī)轉(zhuǎn)速,占空比
{ //右轉(zhuǎn)
if(Left_moto_stp)
{
{if(pwm_val_left<=push_val_left)
{
P21=1; //ENB
}
else
{P21=0;}
}
{if(pwm_val_left>=20)
{pwm_val_left=0;}
}
}
else
{P21=0;}
}
/////////////////////////////////////////////////
void pwm_out_right_moto(void) //右電機(jī)調(diào)速,調(diào)節(jié)push_val_left的值改變電機(jī)轉(zhuǎn)速,占空比
{ //左轉(zhuǎn)
if(Right_moto_stp)
{
if(pwm_val_right<=push_val_right)
{P20=1;}
else
{P20=0;}
if(pwm_val_right>=20)
{pwm_val_right=0;}
}
else
{P20=0;}
}
void xunji()
{
if(P10==0&&P11==0&&P12==0&&P13==0)
{
if(flag==1)
run1();
else
run();
}
else
if((P10==1&&P11==1&&P12==0&&P13==0)||(P10==1&&P11==1&&P12==1&&P13==0)||(P10==1&&P11==0&&P12==0&&P13==0)||(P10==0&&P11==1&&P12==0&&P13==0)) //zuozhuan
{ if(flag==1)
left1(); //zuozhuan
else
left();
}
else
if((P10==0&&P11==0&&P12==0&&P13==1)||(P10==0&&P11==0&&P12==1&&P13==0)||(P10==0&&P11==0&&P12==1&&P13==1)||(P10==0&&P11==1&&P12==1&&P13==1))
{ if(flag==1) //youzhuan
right1();
else
right();
}
else
if((P10==1&&P11==0&&P12==1&&P13==0)||(P10==0&&P11==1&&P12==0&&P13==1)||(P10==0&&P11==1&&P12==1&&P13==0)||(P10==1&&P11==0&&P12==0&&P13==1)||(P10==1&&P11==1&&P12==0&&P13==1)||(P10==1&&P11==0&&P12==1&&P13==1))
{
run1();
}
else
if(P10==1&&P11==1&&P12==1&&P13==1)
{
if(flag==1)
run1();
else
stop();
}
}
void timer0()interrupt 1 using 2
{
TR1=0;
TH0=0xFC; //2Ms定時(shí)
TL0=0x30;
pwm_val_left++;
pwm_val_right++;
pwm_out_left_moto();
pwm_out_right_moto();
//xunji();
if(P10==0&&P11==0&&P12==0&&P13==0)
{
if(flag==1)
run1();
else
run();
}
else
if((P10==1&&P11==1&&P12==0&&P13==0)||(P10==1&&P11==1&&P12==1&&P13==0)||(P10==1&&P11==0&&P12==0&&P13==0)||(P10==0&&P11==1&&P12==0&&P13==0)) //zuozhuan
{ if(flag==1)
left1(); //zuozhuan
else
left();
}
else
if((P10==0&&P11==0&&P12==0&&P13==1)||(P10==0&&P11==0&&P12==1&&P13==0)||(P10==0&&P11==0&&P12==1&&P13==1)||(P10==0&&P11==1&&P12==1&&P13==1))
{ if(flag==1) //youzhuan
right1();
else
right();
}
else
if((P10==1&&P11==0&&P12==1&&P13==0)||(P10==0&&P11==1&&P12==0&&P13==1)||(P10==0&&P11==1&&P12==1&&P13==0)||(P10==1&&P11==0&&P12==0&&P13==1)||(P10==1&&P11==1&&P12==0&&P13==1)||(P10==1&&P11==0&&P12==1&&P13==1))
{
run1();
}
else
if(P10==1&&P11==1&&P12==1&&P13==1)
{
if(flag==1)
run1();
else
stop();
}
TR1=1;
}
void timer1() interrupt 3
{
TR1=1 ;
TH1=0xFC; //2Ms定時(shí)
TL1=0x30;
time++;
if(time<23000)
{
flag=0;
}
if(time>23000&&time<53000)
{
flag=1;
}
if(time>53000)
flag=0;
}
/***************************************************/
void main(void)
{
TMOD=0X21;
TH0= 0xFC; //2ms定時(shí)
TL0= 0x30;
TH1= 0xFC; //2ms定時(shí)
TL1= 0x30;
TR0= 1;
ET0= 1;
ET1= 1;
EA = 1;
while(1) /*無限循環(huán)*/
{
// xunji();
if(P10==1&&P11==1&&P12==1&&P13==1&&flag==0)//全滅
{
stop();
}
}
}
復(fù)制代碼
作者:
逗比不逗_
時(shí)間:
2018-4-25 20:15
本帖最后由 逗比不逗_ 于 2018-4-29 14:46 編輯
不錯(cuò)哦
作者:
haide1998
時(shí)間:
2024-5-5 09:30
路過學(xué)習(xí),謝謝分享!
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1