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