/********************引脚定义*********************/
#include "reg51.h"
typedef unsigned int uint;
typedef unsigned char uchar;
#define Duty_cycle 35 //占空间
#define Cycle 100 //PWM周期
sbit sensor_1 = P1^1; //红外检测
sbit sensor_2 = P1^1;
sbit sensor_3 = P1^3;
sbit Motor_1H = P2^0; //电机驱动控制信号
sbit Motor_1L = P2^1;
sbit Motor_2H = P2^2;
sbit Motor_2L = P2^3;
sbit En_pwm1 = P2^4; //使能信号(RWM)
sbit En_pwm2 = P2^5;
uchar timer1; //定义变量
/***************主函数*********************/
void mian( )
{
TimelConfig();//定时器初始化
while(1)
{
if(Sensor_1==0 && Sensor_2==1 && Semsor_3==0) //状态:轨迹居中
Go_Straight(); //向前
else if(Sensor_1==0 && Sensor_2==0 && Semsor_3==1) //偏左
Turn_Right(); //右转
else if(Sensor_1==1 && Sensor_2==0 && Semsor_3==0) //偏右
Turn_left(); //左转
else if(Sensor_1==0 && Sensor_2==0 && Semsor_3==0) //偏离轨道
Go_Back(); //后退
else Go_Straight( ); //前进
}
}
/**************设置定时器***********/
void Time1Config()
{
TMOD|= 0x10; //设置定时计数器T1工作在模式1
/***定时器赋初始值, 12MHZ下定时0.5ms***/
TH1 = 0xFE;
TL1 = 0x0c;
ET1 = 1; //开启定时器1中断
EA = 1;
TR1 = 1; //开启定时器
}
/********************定时器1的中断函数********************/
void Time1(void) interrupt 3 //3 为定时器1的中断号
{
timer1++;
if(timer1>Cyc1e) //PWM周期为100*0.5ms
{
timer1=0;
}
if(timer1 < Duty_cyc1e) //改变Duty_cyc1e这个值可以改变直流电机的速度
{
En_pwm1=1;
En_pwm2=1;
}
e1se
{
En_pwm1=0;
En_pwm2=0;
}
TH1 = 0xFE; //重新赋初值
TL1 = 0x0c;
} |