|
#include <reg52.h>
#define Left_moto2_pwm P0_4 //接驅(qū)動(dòng)模塊ENA 左后輪
#define Right_moto2_pwm P0_5 //接驅(qū)動(dòng)模塊ENB 右后輪
#define Left_moto_pwm P1_4 //接驅(qū)動(dòng)模塊ENA 左前輪
#define Right_moto_pwm P1_5 //接驅(qū)動(dòng)模塊ENB 右前輪
#define uchar unsigned char
#define uint unsigned int
sbit P0_4=P0^4; //定義P0_4
sbit P0_5=P0^5; //定義P0_5
sbit P1_4=P1^4; //定義P1_4
sbit P1_5=P1^5; //定義P1_5
sbit IN1 = P1^2; //為1 左電機(jī)反轉(zhuǎn) 前輪
sbit IN2 = P1^3; //為1 左電機(jī)正轉(zhuǎn) 前輪
sbit IN3 = P1^6; //為1 右電機(jī)正轉(zhuǎn) 前輪
sbit IN4 = P1^7; //為1 右電機(jī)反轉(zhuǎn) 前輪
sbit IN5 = P0^2; //為1 左電機(jī)反轉(zhuǎn) 后輪
sbit IN6 = P0^3; //為1 左電機(jī)正轉(zhuǎn) 后輪
sbit IN7 = P0^6; //為1 右電機(jī)正轉(zhuǎn) 后輪
sbit IN8 = P0^7; //為1 右電機(jī)反轉(zhuǎn) 后輪
bit Right_moto_stop=1;
bit Left_moto_stop =1;
int pwm=1;
#define left_motor_go IN1 = 0, IN2 = 1//左電機(jī)正傳
#define left_motor_back IN1 = 1, IN2 = 0//左電機(jī)反轉(zhuǎn)
#define right_motor_go IN3 = 0, IN4 = 1//右電機(jī)正傳
#define right_motor_back IN3 = 1, IN4 = 0//右電機(jī)反轉(zhuǎn)
#define left_motor2_go IN5 = 0, IN6 = 1//左電機(jī)正傳
#define left_motor2_back IN5 = 1, IN6 = 0//左電機(jī)反轉(zhuǎn)
#define right_motor2_go IN7 = 0, IN8 = 1//右電機(jī)正傳
#define right_motor2_back IN7 = 1, IN8 = 0//右電機(jī)反轉(zhuǎn)
unsigned char pwm_val_left =0;//變量定義
unsigned char push_val_left =0;// 左電機(jī)占空比N/10
unsigned char pwm_val_right =0;
unsigned char push_val_right=0;// 右電機(jī)占空比N/10
void delay(uint z)
{
uint x,y;
for(x = z; x > 0; x--)
for(y = 114; y > 0 ; y--);
}
void UART_INIT() //藍(lán)牙初始化
{
SM0 = 0;
SM1 = 1;//串口工作方式1
REN = 1;//允許串口接收
EA = 1;//開總中斷
ES = 1;//開串口中斷
TMOD = 0x20;//8位自動(dòng)重裝模式
TH1 = 0xfd;
TL1 = 0xfd;//9600波特率
TR1 = 1;//啟動(dòng)定時(shí)器1
}
void run(void) //pwm調(diào)速函數(shù)
{
push_val_left =pwm; //PWM 調(diào)節(jié)參數(shù)1-10
push_val_right =pwm; //PWM 調(diào)節(jié)參數(shù)1-10
if(pwm==10) pwm=0;
if(pwm==0&&pwm<0) pwm=0;
}
void pwm_out_left_moto(void) //左側(cè)電機(jī)調(diào)速,調(diào)節(jié)push_val_left的值改變電機(jī)轉(zhuǎn)速,占空比
{
if(Left_moto_stop)
{
if(pwm_val_left<=push_val_left)
{ Left_moto_pwm=1;
Left_moto2_pwm=1; }
else
{ Left_moto_pwm=0;Left_moto2_pwm=0; }
if(pwm_val_left>=10)
pwm_val_left=0;
}
else { Left_moto_pwm=0;Left_moto2_pwm=0; }
}
void pwm_out_right_moto(void) //右側(cè)電機(jī)調(diào)速
{
if(Right_moto_stop)
{
if(pwm_val_right<=push_val_right)
{ Right_moto_pwm=1;
Right_moto2_pwm=1; }
else
{Right_moto_pwm=0;
Right_moto2_pwm=0;}
if(pwm_val_right>=10)
pwm_val_right=0;
}
else {Right_moto_pwm=0;Right_moto2_pwm=0; }
}
void timer0()interrupt 1 using 2 //TIMER0中斷服務(wù)子函數(shù)產(chǎn)生PWM信號(hào)//
{
TH0=0XF8; //1Ms定時(shí)
TL0=0X30;
pwm_val_left++;
pwm_val_right++;
pwm_out_left_moto();
pwm_out_right_moto();
}
void forward() //小車前進(jìn)//
{
ET0 = 1;
run(); //pwm 程序
left_motor_go; //左電機(jī)前進(jìn)
right_motor_go; //右電機(jī)前進(jìn)
left_motor2_go; //左電機(jī)前進(jìn) 后輪
right_motor2_go; //右電機(jī)前進(jìn) 后輪
}
void left_go() //左轉(zhuǎn)
{
ET0 = 1;
run();
left_motor_back;
right_motor_go;
left_motor2_back;
right_motor2_go;
delay(700);
forward();
}
void right_go() //右轉(zhuǎn)
{
ET0 = 1;
run();
delay(50);
right_motor_back;
left_motor_go;
right_motor2_back;
left_motor2_go;
delay(700);
forward();
}
void left() //小車左轉(zhuǎn)圈
{
ET0 = 1;
run();
delay(50);
right_motor_go; // 右電機(jī)前進(jìn)
left_motor_back; // 左電機(jī)后退
right_motor2_go; // 右電機(jī)前進(jìn)
left_motor2_back; // 左電機(jī)后退
}
void right() //小車右轉(zhuǎn)圈
{
ET0 = 1;
run();
delay(50);
left_motor_go;
right_motor_back;
left_motor2_go;
right_motor2_back;
}
void back() //小車后退
{
ET0 = 1;
run();
left_motor_back;
right_motor_back;
left_motor2_back;
right_motor2_back;
}
void stop() //小車停止
{
ET0 = 0;
P1=0;
P0=0;
}
void UART_SER() interrupt 4 //串口中斷
{
if(RI)
{
RI = 0; //清除接收標(biāo)志
switch(SBUF)
{
case 'g': forward(); break;//前進(jìn)
case 'b': back(); break;//后退
case 'l': left(); break;//左轉(zhuǎn)圈
case 'r': right(); break;//右轉(zhuǎn)圈
case 's': stop(); break;//停止
case 'z': left_go(); break;//左轉(zhuǎn)行駛
case 'y': right_go(); break;//右轉(zhuǎn)行駛
case 'p': pwm++;break; //加速
case 'c': pwm--;break; //減速
}
}
}
void main()
{
TMOD=0X01;
TH0= 0XF8; //1ms定時(shí)
TL0= 0X30;
TR0= 1;
ET0= 1;
EA = 1;
UART_INIT();//串口初始化
while(1);
}
|
|