小车可以实现循迹(可以过直角,弯路,前进后退等情况以及PWNM调速等)
如想了解接线的请私聊作者
由于小车的情况比较复杂要考虑的东西很多,有时候接线不合适都跑不起来
如果遇到问题请私聊作者
话不多说直接上代码吧:
//以下为代码段
#include"reg51.h"
#include "intrins.h"
typedef unsigned int u16;
typedef unsigned char u8;
sbit HIN1=P1^4;// P1.0ê?3?pwm
sbit HIN2=P3^0;// P1.1ê?3?pwm
sbit HIN3=P1^6;// P1.2ê?3?pwm
sbit HIN4=P1^7;// P1.3ê?3?pwm
sbit QIN1=P1^0;// P1.4ê?3?pwm
sbit QIN2=P1^1;// P1.5ê?3?pwm
sbit QIN3=P1^2;// P1.6ê?3?pwm
sbit QIN4=P1^3;// P1.7ê?3?pwm
sbit IRIN=P3^2; // oìía?ú?a3.2 ?D??0
sbit k1=P2^0; //?°?£?£?ék1??
sbit k2=P2^1; //?°?£?£?ék2??
sbit k3=P2^2; //?°?£?£?ék3??
sbit k4=P2^4; //?°?£?£?ék4??
sbit k5=P2^5; //?°?£?£?ék5??
u8 time,i;
u16 count,count2,count3,count4; //pwm????±è£¨?ù?è′óD?£?
//u8 z=0, x=0;
/********?ù±??óê±oˉêy*******/
void delay(int u)
{
while(u--);
}
void minrun()
{
count=30;
count2=30;
count3=0;
count4=0;
}
void run()
{
count=35;
count2=35;
count3=0;
count4=0;
}
void right()
{
count=0;//óò×a
count2=40;//zou?y′?
count3=60;//you·′
count4=0;
}
void Lefet()
{
count=30;
count2=0;
count3=0;
count4=50;
}
void back()
{
count=0;
count2=0;
count3=50;
count4=50;
}
void stop()
{
count=0;
count2=0;
count3=0;
count4=0;
}
void Lefet1()
{
count=60;
count2=0;
count3=0;
count4=40;
}
void lefet_1()
{
count=60;//
count2=0;
count3=0;
count4=40;
}
void right_1()
{
count=0;
count2=60;
count3=40;
count4=0;
}
void lefet_2()
{
count=65;
count2=0;
count3=0;
count4=40;
}
void right_2()
{
count=0;
count2=40;
count3=60;
count4=0;
}
void xunji()
{
u8 m;
if(k1==1&&k2==1&&k4==1&&k4==1&&k5==1)//??óD?ì2aμ?oú??
{m=0;}
if(k1==1&&k2==1&&k3==0&&k4==1&&k5==1)//?D???ì2aμ?oú??
{m=1;}
if(k1==1&&k2==0&&k3==1&&k4==1&&k5==1)//?¢μ÷ ×ó
{m=2;}
if(k1==1&&k2==1&&k3==1&&k4==0&&k5==1)//?¢μ÷ óò
{m=3;}
if(k1==0&&k2==1&&k3==1&&k4==1&&k5==1)//
{m=4;}
if(k1==1&&k2==1&&k3==1&&k4==1&&k5==0)//′ó·ùóò×a
{m=5;}
if(k1==0&&k3==0&&k4==1&&k5==1)//?±?? ×ó
{m=6;}
if(k1==1&&k2==1&&k3==0&&k5==0)//?±?? óò
{m=7;}
/*
if(k1==0&&k2==0&&k3==1&&k4==1&&k5==1)
{m=8;}
if(k1==1&&k2==1&&k3==1&&k4==0&&k5==0)
{m=9;}
if(k1==1&&k2==1&&k3==1&&k4==1&&k5==0)
{m=10;}
*/
switch(m)
{
//case (0):lefet_2();break;
case (1):run();break;
case (2):Lefet();delay(200);break;//?¢μ÷
case (3):right();delay(200);break;//?¢μ÷
//case (4):Lefet1();delay(900);break;//′ó·ù×ó×a
//case (5):right();delay(900);break;//′ó·ù?èóò×a
case (6):lefet_1();delay(900);break;//?±?? ×ó×a
case (7):right_1();delay(900);break;//?±?? óò×a
//case (8):lefet_2();delay(200);break;
//case (9):right_2();delay(200);break;
//case (10):right_2();delay(900);break;
//default :run();delay(500);stop();break;
}
}
/*******************
* 1|?ü£o′ò?aDèòaó?μ?μ??D??
* ó?μ?μ??D??£o?¨ê±?÷0?¢1 1¤×÷·?ê?1 16???¨ê±?÷?£ê?
* ía2?????0
*********************/
void timer()
{
TMOD=0x11;//?¨ê±?÷01¤×÷·?ê?1
TH0=0xff;//(65536-10)/256;//?33??μ?¨ê±
TL0=0xf7;//(65536-10)%256;//0.01ms
TH1=0;
TL1=0;
EA=1;//?a×ü?D??
ET0=1;//?a?¨ê±?÷0?D??
ET1=1;
TR0=1;//???ˉ?¨ê±?÷0
IT0=1;
EX0=1;
IRIN=1;
}
/*******?÷oˉêy********/
void main()
{
timer(); //μ÷ó??D??′ò?aoˉêy
while(1)
{
xunji();
//back();
//run();
//Lefet();
//right();
// delay(3000);
//xunji();
}
}
/****?¨ê±?÷0ò?3?à?ó?pwmμ÷4??μ??úμ??ù?è***/
void tim0() interrupt 1
{
//TR0=0;//?33??μê±£?1?±??¨ê±?÷
TH0=0xff;//(65536-10)/256;//?33??μ?¨ê±
TL0=0xf7;//(65536-10)%256;//0.01ms£?òò?aò????ü?ú1us
//TR0=1;//′ò?a?¨ê±?÷
i++;
if(i>=100) //1khz
i=0;
if(i<=count) //????±è%30,?é??
{
QIN2=0;
HIN4=0;
}
else
{
QIN2=1;
HIN4=1;
}
if(i<=count2) //????±è%30,?é??
{
QIN4=0;
HIN2=0;
}
else
{
QIN4=1;
HIN2=1;
}
if(i<=count3) //????±è%30,?é??
{
QIN1=0;
HIN3=0;
}
else
{
QIN1=1;
HIN3=1;
}
if(i<=count4) //????±è%30,?é??
{
QIN3=0;
HIN1=0;
}
else
{
QIN3=1;
HIN1=1;
}
}
注释出现乱码了,然后下面我在以文本的形式编一下:
#include"reg51.h" #include "intrins.h" typedef ?unsigned int ?u16; typedef ?unsigned char u8;
sbit HIN1=P1^4;// ?P1.0ê?3?pwm sbit HIN2=P3^0;// ?P1.1ê?3?pwm sbit HIN3=P1^6;// ?P1.2ê?3?pwm sbit HIN4=P1^7;// ?P1.3ê?3?pwm
sbit QIN1=P1^0;// ?P1.4ê?3?pwm sbit QIN2=P1^1;// ?P1.5ê?3?pwm sbit QIN3=P1^2;// ?P1.6ê?3?pwm sbit QIN4=P1^3;// ?P1.7ê?3?pwm
sbit IRIN=P3^2; ?// oìía?ú?a3.2 ?D??0
sbit k1=P2^0; ? ?//?°?£?£?ék1?? sbit k2=P2^1; ? ?//?°?£?£?ék2?? sbit k3=P2^2; ? ?//?°?£?£?ék3?? sbit k4=P2^4; ? ?//?°?£?£?ék4?? sbit k5=P2^5; ? ?//?°?£?£?ék5??
u8 time,i; u16 count,count2,count3,count4; ?//pwm????±è£¨?ù?è′óD?£? //u8 z=0, x=0;
/********?ù±??óê±oˉêy*******/ void delay(int u) { ? ?while(u--); }
void minrun() { ?? ??? ?count=30; ?? ? ?count2=30; ?? ? ?count3=0; ?? ? ?count4=0; }
void run() { ? count=35; ?? ?count2=35; ? count3=0; ? count4=0; }
void right() { ? ?count=0;//óò×a ?? ? count2=40;//zou?y′? ?? ? count3=60;//you·′ ?? ? count4=0;
}
? void Lefet() { ? ?count=30; ?? ? count2=0; ?? ? count3=0; ?? ? count4=50; }
void back() { ? count=0; ? count2=0; ?? ?count3=50; ?? ?count4=50; }
void stop() { ? count=0; ?? ?count2=0; ?? ?count3=0; ?? ?count4=0;
}
void Lefet1() { ? ?count=60; ?? ? count2=0; ?? ? count3=0; ?? ? count4=40; }
void lefet_1() { ? ?count=60;// ?? ? count2=0; ?? ? count3=0; ?? ?count4=40; ?? ? }
void right_1() { ? ? count=0; ?? ? ?count2=60; ?? ? ?count3=40; ?? ? ?count4=0;
}
void lefet_2() { ? ? count=65; ?? ? ?count2=0; ?? ? ?count3=0; ?? ? ?count4=40; } void right_2() { ? ? count=0; ?? ? ?count2=40; ?? ? ?count3=60; ?? ? ?count4=0;
}?? ?
void xunji() { ?? ?u8 m; ?? ?if(k1==1&&k2==1&&k4==1&&k4==1&&k5==1)//??óD?ì2aμ?oú?? ?? ?{m=0;} ?? ? ?? ?if(k1==1&&k2==1&&k3==0&&k4==1&&k5==1)//?D???ì2aμ?oú?? ?? ?{m=1;} ?? ? ?? ?if(k1==1&&k2==0&&k3==1&&k4==1&&k5==1)//?¢μ÷ ?×ó ?? ?{m=2;} ?? ?if(k1==1&&k2==1&&k3==1&&k4==0&&k5==1)//?¢μ÷ ?óò ?? ?{m=3;} ?? ? ?? ?if(k1==0&&k2==1&&k3==1&&k4==1&&k5==1)// ?? ?{m=4;} ?? ?if(k1==1&&k2==1&&k3==1&&k4==1&&k5==0)//′ó·ùóò×a ?? ?{m=5;} ?? ? ?? ?if(k1==0&&k3==0&&k4==1&&k5==1)//?±?? ?×ó ?? ?{m=6;} ?? ?if(k1==1&&k2==1&&k3==0&&k5==0)//?±?? ?óò ?? ?{m=7;} ?? ? ?? ? ?? ? ?? ?/* ?? ?if(k1==0&&k2==0&&k3==1&&k4==1&&k5==1) ?? ?{m=8;} ?? ?if(k1==1&&k2==1&&k3==1&&k4==0&&k5==0) ?? ?{m=9;} ?? ?if(k1==1&&k2==1&&k3==1&&k4==1&&k5==0) ?? ?{m=10;} ?? ?*/ ?? ? ?? ? ?? ? ?? ? ? switch(m) ?? ?{ ?? ??? ?//case (0):lefet_2();break; ?? ??? ?case (1):run();break; ?? ??? ?case (2):Lefet();delay(200);break;//?¢μ÷ ? ?? ??? ?case (3):right();delay(200);break;//?¢μ÷ ?? ??? ? ?? ??? ?//case (4):Lefet1();delay(900);break;//′ó·ù×ó×a ?? ??? ?//case (5):right();delay(900);break;//′ó·ù?èóò×a ?? ??? ? ?? ??? ?case (6):lefet_1();delay(900);break;//?±?? ?×ó×a ?? ??? ?case (7):right_1();delay(900);break;//?±?? ?óò×a ?? ??? ? ?? ??? ?//case (8):lefet_2();delay(200);break; ?? ??? ?//case (9):right_2();delay(200);break; ?? ??? ?//case (10):right_2();delay(900);break; ?? ??? ? ?? ??? ? ?? ??? ?//default :run();delay(500);stop();break; ?? ?}?? ? }
/******************* * 1|?ü£o′ò?aDèòaó?μ?μ??D?? * ó?μ?μ??D??£o?¨ê±?÷0?¢1 1¤×÷·?ê?1 16???¨ê±?÷?£ê? * ía2?????0 *********************/ void timer() { ??? ?TMOD=0x11;//?¨ê±?÷01¤×÷·?ê?1 ?? ?TH0=0xff;//(65536-10)/256;//?33??μ?¨ê± ?? ?TL0=0xf7;//(65536-10)%256;//0.01ms ?? ?TH1=0; ?? ?TL1=0; ?? ?EA=1;//?a×ü?D?? ?? ?ET0=1;//?a?¨ê±?÷0?D?? ?? ?ET1=1; ?? ?TR0=1;//???ˉ?¨ê±?÷0? ?? ?IT0=1; ? EX0=1; ? IRIN=1; }
/*******?÷oˉêy********/ void main() {?? ??? ? ??? ?timer(); ? //μ÷ó??D??′ò?aoˉêy
?? ?while(1) ?? ?{ ? ?? ??? ? ?? ??? ?xunji(); ?? ??? ? ?? ??? ? ?? ??? ? ?? ??? ?//back(); ? ? //run(); ?? ??? ? //Lefet(); ?? ??? ?//right(); ? ?// delay(3000);?? ??? ? ?? ??? ?//xunji(); ?? ?} }
/****?¨ê±?÷0ò?3?à?ó?pwmμ÷4??μ??úμ??ù?è***/ void tim0() interrupt 1 { ?? ?//TR0=0;//?33??μê±£?1?±??¨ê±?÷ ?? ?TH0=0xff;//(65536-10)/256;//?33??μ?¨ê± ?? ?TL0=0xf7;//(65536-10)%256;//0.01ms£?òò?aò????ü?ú1us ?? ?//TR0=1;//′ò?a?¨ê±?÷ ?? ?i++; ?? ?if(i>=100) ?//1khz ?? ??? ?i=0; ?? ??? ?? ?? ?if(i<=count) ? //????±è%30,?é?? ?? ?{ ?? ??? ?QIN2=0;? ?? ??? ?HIN4=0; ?? ?} ? ?? ?else ?? ?{ ?? ??? ?QIN2=1; ?? ?? ??? ?HIN4=1; ?? ?}
?? ? if(i<=count2) ? //????±è%30,?é?? ?? ?{ ?? ??? ?QIN4=0;? ?? ??? ?HIN2=0;? ?? ?} ? ?? ? ?else? ?? ?{? ?? ? ? ?QIN4=1; ?? ? ? ?HIN2=1; ?? ?}
?? ?if(i<=count3) ? //????±è%30,?é?? ?? ?{?? ? ?? ??? ??? ?QIN1=0;? ?? ? ? ?HIN3=0; ?? ?} ? ?? ?else? ?? ?{ ?? ? ? ?QIN1=1; ?? ?? ? ? ?HIN3=1; ?? ?} ?? ? ?? ?if(i<=count4) ? //????±è%30,?é?? ?? ?{ ?? ? ? ?QIN3=0;? ?? ? ? ?HIN1=0;? ?? ?} ? ?? ?else? ?? ?{? ?? ? ? ?QIN3=1; ?? ? ? ?HIN1=1; ?? ?}? ?? ? }
?
?
?有问题请私聊博主哦
|