#include<reg52.h>
typedef unsigned int uint;
typedef unsigned char uchar;
uchar Duty_2_left,Duty_2_right;
uchar i=0,j=0;
uchar flag; //用于循跡方向的判斷
sbit IN1 = P1^4;
sbit IN2 = P1^5;
sbit IN3 = P1^6;
sbit IN4 = P1^7;
sbit IN5 = P0^7;
sbit IN6 = P0^6;
sbit IN7 = P0^5;
sbit IN8 = P0^4;
sbit ENA = P3^3;
sbit ENB = P3^2;
sbit left=P2^0; //左右兩個傳感器
sbit right=P2^1;
//小車直行速度賦值
void forward_move()
{
Duty_2_left=20;
Duty_2_right=20;
IN1=1;
IN2=1;
IN3=0;
IN4=0;
IN5=1;
IN6=1;
IN7=0;
IN8=0;
}
//小車停止
void stop()
{ Duty_2_left=0;
Duty_2_right=0;
IN1=0;
IN2=0;
IN3=0;
IN4=0;
IN5=0;
IN6=0;
IN7=0;
IN8=0;
}
//小車左轉(zhuǎn)速度賦值(用于左邊傳感器檢測到黑線)
void Left_turning()
{
Duty_2_left=18;
Duty_2_right=20;
IN1=1; //兩個電機一個正轉(zhuǎn)一個反轉(zhuǎn)(或者一個正轉(zhuǎn)一個不轉(zhuǎn))
IN2=1;
IN3=0;
IN4=0;
IN5=0;
IN6=0;
IN7=1;
IN8=1;
}
//小車右轉(zhuǎn)速度賦值(用于右邊傳感器檢測到黑線)
void Right_turning()
{
Duty_2_left=18;
Duty_2_right=20;
IN1=0;
IN2=0;
IN3=1;
IN4=1;
IN5=1;
IN6=1;
IN7=0;
IN8=0;
}
//定時器0中斷初始化
void timer0init()
{
TMOD|=0x01;//定時器T0, 工作方式1, 16位
TH0=0xff;//定時 ff9c 0.1ms
TL0=0x9c;
EA=1; //開啟總中斷
ET0=1;//開啟中斷允許
TR0=1;//開啟定時器中斷
}
//定時器中斷服務函數(shù)
void timer0() interrupt 1
{
TH0=0xff;
TL0=0x9c;
i++;
j++;
if(i<=Duty_2_left)//設置左輪占空比,即左輪速度
ENA=1;
else
ENA=0;
if(j<=Duty_2_right)
ENB=1;
else
ENB=0;
if(i==100) //設置pwm周期=0.1ms*100=10ms,這樣開頭定義的變量正好表示占空比數(shù)值
{
i=0;//加到100后變?yōu)?,重新計數(shù)
}
if(j==100)
{
j=0;
}
}
//循跡模塊
void xunji()
{
if((left==0)&&(right==1))
{
flag = 0;//左邊檢測到黑線
}
else if((left==1)&&(right==0))
{
flag = 1;//右邊檢測到黑線
}
else if((left==1)&&(right==1))
{
flag = 3; //兩邊都沒檢測到黑線
}
else
{
flag = 4;
}
switch(flag)
{
case 0: Right_turning();break;
case 1: Left_turning();break;
case 3: forward_move();break;
case 4: forward_move();break;
default: forward_move();break;
}
}
void main()
{
timer0init();
//forward_move();
while(1)
{
xunji();
}
}
|