|
|
程序如下:
/*晶振:11.0592,輸出的PWM直接給L298N以驅(qū)動(dòng)電機(jī),
通過(guò)調(diào)節(jié)(percent_l=90;)等號(hào)后的數(shù)值,與(Sum100)的比值,
為占空比,如上取90比100則輸出PWM波占空比為9/10的高電平,
1/10的低電平,低電平時(shí)間越長(zhǎng)則速度越慢。
要注意的是調(diào)節(jié)#define Sum100的值可以調(diào)節(jié)PWM的總周期,
調(diào)節(jié)#define tim?200的值可以調(diào)節(jié)定時(shí)器的定時(shí)周期。*/
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
#define MOTOR_C P1 //P1口作為電機(jī)的控制口。
#define BACK 0xfa //后退,0b1111 1010
#define FORWARD 0xf5 //前進(jìn),0b1111 0101
#define Sum 100 //總周期,為100倍的定時(shí)器時(shí)間大約27ms
#define tim 200 //初值數(shù)200約270us
sbit PWM_L=P1^0; //左電機(jī)前進(jìn)
sbit PWM_R=P1^2; //右電機(jī)前進(jìn)
sbit PWM_HL=P1^1; //左電機(jī)后退
sbit PWM_HR=P1^3; //右電機(jī)后退
void timer0_init(void);//定時(shí)器0初始化函數(shù)。
void timer1_init(void);//定時(shí)器1初始化函數(shù)。
void right(void); //前進(jìn)右轉(zhuǎn)彎函數(shù)。
void left(void); //前進(jìn)左轉(zhuǎn)彎函數(shù)。
void forward(void); //前進(jìn)函數(shù)。
void stop(void); //停止
void Delayms(); //延時(shí)1ms
void Delay100ms(unsigned int d);//延時(shí)100ms
uchar percent_l=0; //(前進(jìn))左輪占空比。
uchar percent_r=0; //(前進(jìn))右輪占空比。
uchar percent_hl=0; //(后退)左輪占空比。
uchar percent_hr=0; //(后退)右輪占空比。
uchar run_time=0; //車輪運(yùn)行一步的時(shí)間。
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;//開(kāi)總中斷。 0000
ET0=1;//開(kāi)定時(shí)器0中斷。
TR0=1;//啟動(dòng)定時(shí)器0。
}
void timer1_init(void)
{
TH1=(65536-tim)/256;
TL1=(65536-tim)%256;
ET1=1;
TR1=1;
}
/**************前進(jìn)方向****/
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;
}
/**************中斷服務(wù)*******************/
void timer_0(void) interrupt 1 using 1
{
static uchar temp=0;//中斷次數(shù)計(jì)數(shù)。
TR0=0;
if(temp<Sum)
{ //關(guān)總中斷,屏蔽其他中斷。
if(temp<percent_l)
{
PWM_L=1; //左電機(jī)高電平。
}
else
{
PWM_L=0; //左電機(jī)低電平。
}
if(temp<percent_r)
{
PWM_R=1; //右電機(jī)高電平。
}
else
{
PWM_R=0; //右電機(jī)低電平。
}
}
else
{temp=0;}
temp++;
TH0=(65536-tim)/256;
TL0=(65536-tim)%256; //實(shí)現(xiàn)計(jì)數(shù)。
TR0=1; //開(kāi)總中斷。
}
void timer1 ( void ) interrupt 3 using 2
{
static uchar temp1=0;
TR1=0; //關(guān)總中斷,屏蔽其他中斷。
if(temp1<Sum)
{
if(temp1<percent_hl)
{
PWM_HL=1;//左電機(jī)高電平。
}
else
{
PWM_HL=0;//左電機(jī)低電平。
}
if(temp1<percent_hr)
{
PWM_HR= 1;//右電機(jī)高電平。
}
else
{
PWM_HR= 0;//右電機(jī)低電平。
}
}
else
{
temp1=0;
}
temp1++;
TH1=(65536-tim)/256;
TL1=(65536-tim)%256; //實(shí)現(xiàn)計(jì)數(shù)。
TR1 = 1; //開(kāi)總中斷。
}
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--);
}
|
評(píng)分
-
查看全部評(píng)分
|