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