程序编译没错,蓝牙也是可以通讯的(与PC端连接可实现收发),但是小车就是不动。这是为什么呢?
/*手机蓝牙遥控小车 APP 用的SPP蓝牙串口助手
左转右转大概是90度
pwm有十级变速*/
#include <reg52.h>
#define Left_moto_pwm P1_4 //接驱动模块ENA 使能端,输入PWM信号调节速度 左前轮
#define Right_moto_pwm P1_5 //接驱动模块ENB 右前轮
#define uchar unsigned char
#define uint unsigned int
sbit P1_4=P1^4; //定义P1_4
sbit P1_5=P1^5; //定义P1_5
/*电机驱动IO定义*/
sbit IN1 = P1^2; //为1 左电机反转 前轮
sbit IN2 = P1^3; //为1 左电机正转 前轮
sbit IN3 = P1^6; //为1 右电机正转 前轮
sbit IN4 = P1^7; //为1 右电机反转 前轮
sbit EN1 = P1^4; //为1 左电机使能
sbit EN2 = P1^5; //为1 右电机使能 */
bit Right_moto_stop=1;
bit Left_moto_stop =1;
unsigned int time=0;
int pwm=1;
#define left_motor_en EN1 = 1 //左电机使能
#define left_motor_stops EN1 = 0 //左电机停止
#define right_motor_en EN2 = 1 //右电机使能
#define right_motor_stops EN2 = 0 //右电机停止
#define left_motor_go IN1 = 0, IN2 = 1//左电机正传
#define left_motor_back IN1 = 1, IN2 = 0//左电机反转
#define right_motor_go IN3 = 1, IN4 = 0//右电机正传
#define right_motor_back IN3 = 0, IN4 = 1//右电机反转
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 1为最慢,10是最快 改这个值可以改变其速度
push_val_right =pwm; //PWM 调节参数1-10 1为最慢,10是最快 改这个值可以改变其速度
if(pwm==10) pwm=0;
if(pwm==0&&pwm<0) pwm=0;
}
/************************************************************************/
/* PWM调制电机转速 */
/************************************************************************/
/* 左侧电机调速 */
/*调节push_val_left的值改变电机转速,占空比 */
void pwm_out_left_moto(void)
{
if(Left_moto_stop)
{
if(pwm_val_left<=push_val_left)
{ Left_moto_pwm=1;
}
else
{ Left_moto_pwm=0; }
if(pwm_val_left>=10)
pwm_val_left=0;
}
else { Left_moto_pwm=0; }
}
/******************************************************************/
/* 右侧电机调速 */
void pwm_out_right_moto(void)
{
if(Right_moto_stop)
{
if(pwm_val_right<=push_val_right)
{ Right_moto_pwm=1;
}
else
{Right_moto_pwm=0;
}
if(pwm_val_right>=10)
pwm_val_right=0;
}
else {Right_moto_pwm=0; }
}
/***************************************************/
///*TIMER0中断服务子函数产生PWM信号*/
void timer0()interrupt 1 using 2
{
TH0=0XF8; //1Ms定时
TL0=0X30;
time++;
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; //右电机前进
}
void left_go() //左转
{
ET0 = 1;
run();
left_motor_back;
right_motor_go;
delay(700);
forward();
}
//右转
void right_go()
{
ET0 = 1;
run();
delay(50);
right_motor_back;
left_motor_go;
delay(700);
forward();
}
//小车左转圈
void left()
{
ET0 = 1;
run();
delay(50);
right_motor_go; // 右电机前进
left_motor_back; // 左电机后退
}
//小车右转圈
void right()
{
ET0 = 1;
run();
left_motor_go;
right_motor_back;
}
//小车后退
void back()
{
ET0 = 1;
run();
left_motor_back;
right_motor_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);
}
|