程序如下:
/*晶振:11.0592,输出的PWM直接给L298N以驱动电机,
通过调节(percent_l=90;)等号后的数值,与(Sum100)的比值,
为占空比,如上取90比100则输出PWM波占空比为9/10的高电平,
1/10的低电平,低电平时间越长则速度越慢。
要注意的是调节#define Sum100的值可以调节PWM的总周期,
调节#define tim?200的值可以调节定时器的定时周期。*/
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
#define MOTOR_C P1 //P1口作为电机的控制口。
#define BACK 0xfa //后退,0b1111 1010
#define FORWARD 0xf5 //前进,0b1111 0101
#define Sum 100 //总周期,为100倍的定时器时间大约27ms
#define tim 200 //初值数200约270us
sbit PWM_L=P1^0; //左电机前进
sbit PWM_R=P1^2; //右电机前进
sbit PWM_HL=P1^1; //左电机后退
sbit PWM_HR=P1^3; //右电机后退
void timer0_init(void);//定时器0初始化函数。
void timer1_init(void);//定时器1初始化函数。
void right(void); //前进右转弯函数。
void left(void); //前进左转弯函数。
void forward(void); //前进函数。
void stop(void); //停止
void Delayms(); //延时1ms
void Delay100ms(unsigned int d);//延时100ms
uchar percent_l=0; //(前进)左轮占空比。
uchar percent_r=0; //(前进)右轮占空比。
uchar percent_hl=0; //(后退)左轮占空比。
uchar percent_hr=0; //(后退)右轮占空比。
uchar run_time=0; //车轮运行一步的时间。
void main(void)
{
timer0_init();
timer1_init();
MOTOR_C=0x00;
//ENA=1;
//ENB=1;
while(1)
{
left();
Delay100ms(0.9);
right();
Delay100ms(0.9);
//back();
Delay100ms(0.9);
forward();
Delay100ms(0.9);
//stop();
}
}
void timer0_init(void)
{
TMOD=0X11;
TH0=(65536-tim)/256;
TL0=(65536-tim)%256;
EA=1;//开总中断。 0000
ET0=1;//开定时器0中断。
TR0=1;//启动定时器0。
}
void timer1_init(void)
{
TH1=(65536-tim)/256;
TL1=(65536-tim)%256;
ET1=1;
TR1=1;
}
/**************前进方向****/
void right(void)
{
percent_l=50;//左轮速度快,最好去50以上
percent_r=0;//右轮速度慢。
percent_hl=0;
percent_hr=0;
}
void left(void)
{
percent_l=0;//左轮速度慢。
percent_r=50;//右轮速度快。
percent_hl=0;
percent_hr=0;
}
void forward(void)
{
percent_l=70;//左轮同速度。
percent_r=70;//右轮同速度。
percent_hl=0;
percent_hr=0;
}
void stop(void)
{
percent_l=0;//左轮零速度。
percent_r=0;//右轮零速度。
percent_hl=0;
percent_hr=0;
}
/**************中断服务*******************/
void timer_0(void) interrupt 1 using 1
{
static uchar temp=0;//中断次数计数。
TR0=0;
if(temp<Sum)
{ //关总中断,屏蔽其他中断。
if(temp<percent_l)
{
PWM_L=1; //左电机高电平。
}
else
{
PWM_L=0; //左电机低电平。
}
if(temp<percent_r)
{
PWM_R=1; //右电机高电平。
}
else
{
PWM_R=0; //右电机低电平。
}
}
else
{temp=0;}
temp++;
TH0=(65536-tim)/256;
TL0=(65536-tim)%256; //实现计数。
TR0=1; //开总中断。
}
void timer1 ( void ) interrupt 3 using 2
{
static uchar temp1=0;
TR1=0; //关总中断,屏蔽其他中断。
if(temp1<Sum)
{
if(temp1<percent_hl)
{
PWM_HL=1;//左电机高电平。
}
else
{
PWM_HL=0;//左电机低电平。
}
if(temp1<percent_hr)
{
PWM_HR= 1;//右电机高电平。
}
else
{
PWM_HR= 0;//右电机低电平。
}
}
else
{
temp1=0;
}
temp1++;
TH1=(65536-tim)/256;
TL1=(65536-tim)%256; //实现计数。
TR1 = 1; //开总中断。
}
void Delayms(void)
{
unsigned char a,b,c;
for(c=1;c>0;c--)
for(b=23;b>0;b--)
for(a=13;a>0;a--);
}
void Delay100ms(unsigned int d)
{
unsigned int a,b,c;
for(c=d;c>0;c--)
for(b=60;b>0;b--)
for(a=130;a>0;a--);
}
|