|
#include <reg52.h>
//IO引腳定義:
sbit IN1=P1^0;
sbit IN2=P1^1;
sbit IN3=P1^2;
sbit IN4=P1^3;
//以上為電機(jī)驅(qū)動(dòng)板輸入引腳定義,
//IN1和IN2控制左輪電機(jī),輸出對(duì)應(yīng)的OU1和OUT2接左輪電機(jī),
//IN3和IN4控制右輪電機(jī),輸出對(duì)應(yīng)的OU3和OUT4接右輪電機(jī)
sbit L_PWM=P1^4; //左輪調(diào)速,接驅(qū)動(dòng)模塊ENA使能端,在這里輸入PWM信號(hào)
sbit R_PWM=P1^5; //右輪調(diào)速,接驅(qū)動(dòng)模塊ENB使能端,在這里輸入PWM信號(hào)
//宏定義
#define L_go IN1=0;IN2=1 //左輪前進(jìn)
#define L_back IN1=1;IN2=0 //左輪后退
#define L_stop IN1=0;IN2=0 //左輪停止,兩個(gè)輸出1也可以
#define R_go IN3=0;IN4=1 //右輪前進(jìn)
#define R_back IN3=1;IN4=0 //右輪后退
#define R_stop IN3=0;IN4=0 //右輪停止,兩個(gè)輸出1也可以
#define car_go L_go;R_go; //小車前進(jìn)
#define car_back L_back;R_back //小車后退
#define car_left R_go;L_stop //小車左轉(zhuǎn)彎
#define car_right L_go;R_stop //小車右轉(zhuǎn)彎
#define car_stop L_stop;R_stop //小車停車
#define car_left_360 R_go;L_back //小車向左360度轉(zhuǎn),也可以認(rèn)為是大轉(zhuǎn)彎
#define car_right_360 L_go;R_back //小車向右360度轉(zhuǎn),也可以認(rèn)為是大轉(zhuǎn)彎
//數(shù)據(jù)定義
unsigned char l_tt=0; //定時(shí)器計(jì)數(shù)用
unsigned char l_Lpwm=0; //左輪PWM占空比值,我們?cè)O(shè)計(jì)10個(gè)格,0-9,0為停止,9為全速
unsigned char l_Rpwm=0; //右輪PWM占空比值,我們?cè)O(shè)計(jì)10個(gè)格,0-9,0為停止,9為全速
//TIMER0中斷服務(wù)子函數(shù)產(chǎn)生PWM信號(hào)
void timer0()interrupt 1 using 2
{
TH0=0XFC; //定時(shí)1毫秒,10格調(diào)速,為100HZ頻率,此頻率下效果比較好,過大有噪聲,過小振動(dòng)大
TL0=0X17;
l_tt++;
if(l_tt>9)l_tt=0; //比較用,10格調(diào)速
if(l_tt<=l_Lpwm){//左調(diào)速,占空比數(shù)值越大,輸出高電平時(shí)間越寬,電機(jī)轉(zhuǎn)速越高,我們?cè)O(shè)計(jì)10個(gè)格,0-9,0為停止,9為全速
L_PWM=1;
}
else{
L_PWM=0;
}
if(l_tt<=l_Rpwm){//右調(diào)速,同上
R_PWM=1;
}
else{
R_PWM=0;
}
}
//延時(shí)
void Delay(unsigned int t)
{
unsigned int c;
while(t--){
c=10000;
while(c--);
}
}
//入口函數(shù)
void main(void)
{
unsigned char i;
EA=1; //首先開啟總中斷
TMOD|=0X11; //定時(shí)器方式1,16位計(jì)數(shù)器,用來計(jì)數(shù)時(shí)間
TH0= 0XFC; //1ms定時(shí)
TL0= 0X14;
TR0= 1;
ET0= 1;
while(1){
l_Lpwm=0;
car_go; //前進(jìn)
for(i=0;i<10;i++){//慢慢提速
l_Lpwm++;
l_Rpwm++;
Delay(2);
}
Delay(5); //保持速度前進(jìn)一會(huì)
for(i=0;i<10;i++){//慢慢降速
l_Lpwm--;
l_Rpwm--;
Delay(2);
}
Delay(10);
car_back; //后退,以下原理同上
for(i=0;i<10;i++){
l_Lpwm++;
l_Rpwm++;
Delay(2);
}
Delay(5);
for(i=0;i<10;i++){
l_Lpwm--;
l_Rpwm--;
Delay(2);
}
Delay(10);
}
}
|
|