|
#include <reg52.h> //包含52系統(tǒng)頭文件
#define uint unsigned int
#define uchar unsigned char
#define Leftmotogo {IN1=0,IN2=1;} //左電機(jī)向前zou
#define LeftmotoStop {EN1=0;IN1=0,IN2=0;} //左邊電機(jī)停轉(zhuǎn)
#define Rightmotogo {IN3=1,IN4=0;} //右邊電機(jī)向前走
#define RightmotoStop {EN2=0;IN3=0,IN4=0;} //右邊電機(jī)停轉(zhuǎn)
sbit IN1=P1^2; //
sbit IN2=P1^3; //
sbit IN3=P1^6; //
sbit IN4=P1^7; //
sbit EN1=P1^4; //使能
sbit EN2=P1^5; //使能
sbit key4=P3^7;
sbit beep=P2^3;
sbit Leftled=P3^3; //左循跡紅外傳感器
sbit Rightled=P3^2; //右循跡紅外傳感器
sbit Left_2_led=P3^4; //左避障紅外傳感器
sbit Right_2_led=P3^5;
uchar pwmleft =0;//變量定義
uchar pwmright =0;
uchar pushleft =6;// 左電機(jī)占空比N/20 //速度調(diào)節(jié)變量 0-20。。。0最小,20最大
uchar pushright=6;// 右電機(jī)占空比N/20
// 大家可以根據(jù)循跡效果修改以上兩個(gè)數(shù)值
bit RightPWMON=1; //右電機(jī)PWM開關(guān)
bit LeftPWMON =1; //左電機(jī)PWM開關(guān)
void delayms(uint xms)
{
uint i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
void run()
{
pushleft=6; //速度調(diào)節(jié)變量 0-20。。。0最小,20最大
pushright=6;
Leftmotogo ; //左電機(jī)往前走
Rightmotogo ; //右電機(jī)往前走
}
void leftrun()
{
pushleft=5;
pushright=5;
Rightmotogo ; //右電機(jī)往前走
LeftmotoStop ; //左電機(jī)停止
}
void rightrun()
{
pushleft=5;
pushright=5;
Leftmotogo; //左電機(jī)往前走
RightmotoStop; //右電機(jī)往前走
}
void stop()
{
LeftmotoStop;
RightmotoStop;
}
// PWM調(diào)制電機(jī)轉(zhuǎn)速 左電機(jī)調(diào)速
/*調(diào)節(jié)push_val_left的值改變電機(jī)轉(zhuǎn)速,占空比*/
void pwmoutleftmoto()
{
if(LeftPWMON)
{
if(pwmleft<=pushleft)
{
EN1=1;
}
else EN1=0;
if(pwmleft>=20)
pwmleft=0;
}
else EN1=0; //若未開啟PWM則EN1=0 左電機(jī) 停止
}
/* 右電機(jī)調(diào)速 */
void pwmoutrightmoto()
{
if(RightPWMON)
{
if(pwmright<=pushright) //20ms內(nèi)電平信號(hào) 111 111 0000 0000 0000 00
{
EN2=1; //占空比6:20
}
else EN2=0;
if(pwmright>=20)
pwmright=0;
}
else EN2=0; //若未開啟PWM則EN2=0 右電機(jī) 停止
}
void timer0() interrupt 1 //TIMER0中斷服務(wù)子函數(shù)產(chǎn)生PWM信號(hào)
{
TH0=0XFC; //1Ms定時(shí)
TL0=0X66;
pwmleft++;
pwmright++;
pwmoutleftmoto();
pwmoutrightmoto();
}
void keyscan() //按鍵掃描函數(shù)
{
A: if(key4==0) //判斷是否有按下信號(hào)
{
delayms(10); //延時(shí)10ms
if(key4==0) //再次判斷是否按下
{
beep=0; //蜂鳴器響
while(!key4); //判斷是否松開按鍵
beep=1; //蜂鳴器停止
}
else goto A; //跳轉(zhuǎn)到A重新檢測(cè)
}
else goto A; //跳轉(zhuǎn)到A重新檢測(cè)
}
void main()
{
P1=0X00; //關(guān)電機(jī)
keyscan(); //按鍵啟動(dòng)檢測(cè)
delayms(1000);//1s后啟動(dòng)
TMOD=0X01;
TH0= 0XFC; //1ms定時(shí)
TL0= 0X66;
TR0= 1;
ET0= 1;
EA = 1;
while(1) //無限循環(huán)
{
if(Left_2_led==0||Right_2_led==0) {stop();}
if(Leftled==0&&Rightled==0) run(); //調(diào)用前進(jìn)函數(shù)
else if(Leftled==1&&Rightled==0)/*左邊檢測(cè)到黑線*/ leftrun(); //調(diào)用小車左轉(zhuǎn)函數(shù)
else if(Rightled==1&&Leftled==0)/*右邊檢測(cè)到黑線*/rightrun();//調(diào)用小車右轉(zhuǎn)函數(shù)
else stop();
}
}
|
|