#include "reg52.h"
#include "main.h"
#include "distance_measure.h"
#define TIMER_DELAY (500) //定时器定时500us=0.5ms
uint counter = 0; //计数
uchar PWM[4]={8,8,8,8};
uchar motor_max=5; //pwm最大值
//四路马达
// 1 3
// 2 4
sbit ENA = P1^5;
sbit motor1 = P1^4;
sbit motor2 = P1^3;
sbit motor3 = P1^2;
sbit motor4 = P1^1;
sbit ENB = P1^0;
//STC89系列单片机延时1ms
void delay_ms(unsigned int x)
{
char j=0;
while(x--)
for(j=0;j<125;j++)
;
}
//定时器初始化
void timer_init()
{
//AUXR &= 0x7F; //定时器时钟12T模式
TMOD &= 0xF0; //设置定时器模式:定时器0方式1
TMOD |= 0x01; //设置定时器模式:定时器0方式1
EA=1; //开总中断
TH0=(65535-TIMER_DELAY)/256; //设置初值
TL0=(65535-TIMER_DELAY)%256;
ET0=1; //启用定时器中断
TR0=1; //开启
}
//T0中断服务子程序
void timer0_isr() interrupt 1
{
TH0=(65535-TIMER_DELAY)/256; //重新赋值
TL0=(65535-TIMER_DELAY)%256;
counter ++;
//计数累加1ms清零
if(counter == 20)
{
counter = 0;
}
//比较输出PWM
motor1 = PWM[0] > counter;
motor2 = PWM[1] > counter;
motor3 = PWM[2] > counter;
motor4 = PWM[3] > counter;
}
void motor_up() //前进
{
PWM[0]=motor_max;
PWM[1]=0;
PWM[2]=motor_max;
PWM[3]=0;
}
void motor_stop() //后退
{
PWM[0]=0;
PWM[1]=motor_max;
PWM[2]=0;
PWM[3]=motor_max;
}
void motor_left() //左转
{
PWM[0]=motor_max;
PWM[1]=0;
PWM[2]=0;
PWM[3]=0;
}
void motor_right() //右转
{
PWM[0]=0;
PWM[1]=0;
PWM[2]=motor_max;
PWM[3]=0;
}
void main()
{
timer_init(); //定时器初始化
ENA=1;
ENB=1;
motor_up();
while(1)
{
if(get_distance() <= 50) //判断是否有障碍物
{
delay_ms(10); //消抖
if(get_distance() <= 50) //确实有障碍物
{
motor_left();
delay_ms(500);
}
}
else
{
motor_up();
}
}
}
|