void Timer1Init() //定时器1设定为为自动避障模式所需的初始化
{
TMOD=0X11;//选择为定时器1模式,工作方式1,仅用TR1打开启动。选择为定时器0模式,工作方式1,仅用TR1打开启动
TH1=0;
TL1=0;
ET1=1;//打开定时器1中断允许
EA=1;//打开总中断
TR1=1;//打开定时器
}
void Timer1Init2() //定时器1设定为为蓝牙遥控模式所需的初始化
{
SCON=0X50; //设置为工作方式1,8位数据,可变波特率
TMOD |=0X20; //设置计数器工作方式2
PCON=0X00; //波特率不加倍
TH1=0XFd; //计数器初始值设置,9600 @11.0592MHz
TL1=0XFd;
TR1=1; //打开计数器
ES = 1; //开串口中断
EA = 1; //开总中断
}
char Work_Mode=0; //工作模式的选择 为0时,为手机或者电脑等上位机对小车进行蓝牙遥控 ,为1时小车自动避障模式
char Work_Mode2=0;
void main()
{
Timer0Init();
Timer1Init2();
Left_Speed_Ratio=5; //设置左电机车速为最大车速的50%
Right_Speed_Ratio=5; ////设置右电机车速为最大车速的50%
while(1)
{
if(Work_Mode==1)
{
ES=0; //关闭串口中断
if(Work_Mode2==0)
{
Timer1Init();
Work_Mode2=1;
}
if(Echo==1)
{
TH1=0;
TL1=0;
TR1=1; //开启计数
while(Echo); //当RX为1计数并等待
TR1=0; //关闭计数
Conut(); //计算
}
if(M_sensor==1)
{ run(); }
else
{
if(L_sensor==1)
{ left(); }
else if(R_sensor==1)
{ right() ; }
else
{ back(); }
}
}
else
{
switch(receive_real_data)
{
case '1': run(); break;
case '2': left(); break;
case '3': right(); break;
case '4': back(); break;
case '5': Speed_add(); break;
case '6': Speed_reduce(); break;
case '7': stop(); break;
case '8': Work_Mode=1; break;
}
LED=1;
}
}
}
void Speed_add() //加速函数
{
if(Left_Speed_Ratio<10) //限幅
{
Left_Speed_Ratio++;
Right_Speed_Ratio++;
}
}
void Speed_reduce() //减速函数
{
if(Left_Speed_Ratio>0) //限幅
{
Left_Speed_Ratio--;
Right_Speed_Ratio--;
}
}
void Com_Int(void) interrupt 4
{
uchar receive_data;
EA = 0;
if(RI == 1) //当硬件接收到一个数据时,RI会置位
{
RI = 0;
receive_data = SBUF;//接收到的数据
if(receive_data == '1')
{
LED =0;//接收到1亮灯
}
else
{
LED =1; //其他情况灯灭
}
}
SBUF=receive_data;//将接收到的数据放入到发送寄存器
while(!TI); //等待发送数据完成
TI=0; //清除发送完成标志位
EA = 1;
}
void Com_Int(void) interrupt 4
{
EA = 0;
if(RI == 1) //当硬件接收到一个数据时,RI会置位
{
LED=0;
RI = 0;
receive_data = SBUF;//接收到的数据
if(receive_data!=0)
receive_real_data=receive_data;
SBUF=receive_real_data;//将接收到的数据放入到发送寄存器
while(!TI); //等待发送数据完成
TI=0; //清除发送完成标志位
}
EA = 1;
}
#include
extern unsigned char Left_Speed_Ratio;
extern unsigned char Right_Speed_Ratio;
unsigned int time=0;
unsigned int HC_SR04_time=0;
extern unsigned char pwm_val_left;
extern unsigned char pwm_val_right;
bit flag =0;
extern char M_sensor;
char Work_Mode=0; //工作模式的选择 为0时,为手机或者电脑等上位机对小车进行蓝牙遥控 ,为1时小车自动避障模式
char Work_Mode2=0;
unsigned char receive_data=0;
unsigned char receive_real_data=0;
void delay1s(void)
{
unsigned char a,b,c;
for(c=167;c>0;c--)
for(b=171;b>0;b--)
for(a=16;a>0;a--);
_nop_();
}
void delay1ms(void)
{
unsigned char a,b,c;
for(c=1;c>0;c--)
for(b=142;b>0;b--)
for(a=2;a>0;a--);
}
void Timer0Init()
{
TMOD|=0X01;//选择为定时器0模式,工作方式1,仅用TR0打开启动。
TH0=0XFC; //给定时器赋初值,定时1ms
TL0=0X18;
ET0=1;//打开定时器0中断允许
EA=1;//打开总中断
TR0=1;//打开定时器
}
void Timer1Init()
{
TMOD=0X11;//选择为定时器1模式,工作方式1,仅用TR1打开启动。选择为定时器0模式,工作方式1,仅用TR1打开启动
TH1=0;
TL1=0;
ET1=1;//打开定时器1中断允许
EA=1;//打开总中断
TR1=1;//打开定时器
}
void Timer1Init2()
{
SCON=0X50; //设置为工作方式1,8位数据,可变波特率
TMOD |=0X20; //设置计数器工作方式2
PCON=0X00; //波特率不加倍
TH1=0XFd; //计数器初始值设置,9600 @11.0592MHz
TL1=0XFd;
TR1=1; //打开计数器
ES = 1; //开串口中断
EA = 1; //开总中断
}
void timer0()interrupt 1 using 2
{
TH0=0XFC; //给定时器赋初值,定时1ms
TL0=0X18;
time++;
pwm_val_left++;
pwm_val_right++;
pwm_out_left_moto();
pwm_out_right_moto();
HC_SR04_time++;
if(HC_SR04_time>=500) //500ms 启动一次超声波测距
{
HC_SR04_time=0;
StartModule();
}
}
void Timer1() interrupt 3
{
flag=1; //若定时器1溢出则flag置1
}
void Com_Int(void) interrupt 4
{
EA = 0;
if(RI == 1) //当硬件接收到一个数据时,RI会置位
{
LED=0;
RI = 0;
receive_data = SBUF;//接收到的数据
if(receive_data!=0)
receive_real_data=receive_data;
SBUF=receive_real_data;//将接收到的数据放入到发送寄存器
while(!TI); //等待发送数据完成
TI=0; //清除发送完成标志位
}
EA = 1;
}
void main()
{
Timer0Init();
Timer1Init2();
Left_Speed_Ratio=5; //设置左电机车速为最大车速的50%
Right_Speed_Ratio=5; ////设置右电机车速为最大车速的50%
while(1)
{
if(Work_Mode==1)
{
ES=0; //关闭串口中断
if(Work_Mode2==0)
{
Timer1Init();
Work_Mode2=1;
}
if(Echo==1)
{
TH1=0;
TL1=0;
TR1=1; //开启计数
while(Echo); //当RX为1计数并等待
TR1=0; //关闭计数
Conut(); //计算
}
if(M_sensor==1)
{ run(); }
else
{
if(L_sensor==1)
{ left(); }
else if(R_sensor==1)
{ right() ; }
else
{ back(); }
}
}
else
{
switch(receive_real_data)
{
case '1': run(); break;
case '2': left(); break;
case '3': right(); break;
case '4': back(); break;
case '5': Speed_add(); break;
case '6': Speed_reduce(); break;
case '7': stop(); break;
case '8': Work_Mode=1; break;
}
LED=1;
}
}
}
#include
unsigned char pwm_val_left =0;
unsigned char push_val_left =0;
unsigned char pwm_val_right =0;
unsigned char push_val_right=0;
unsigned char Left_Speed_Ratio;
unsigned char Right_Speed_Ratio;
bit Left_moto_stop =1;
bit Right_moto_stop =1;
void Left_moto_go() //左电机正转
{p34=0;p35=1;}
void Left_moto_back() //左电机反转
{p34=1;p35=0;}
void Left_moto_stp() //左电机停转
{p34=1;p35=1;}
void Right_moto_go() //右电机正转
{p36=0;p37=1;}
void Right_moto_back() //右电机反转
{p36=1;p37=0;}
void Right_moto_stp() //右电机停转
{p36=1;p37=1;}
void pwm_out_left_moto(void) //左电机PWM
{
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) //右电机PWM
{
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;
}
void run(void) //小车前行
{
push_val_left =Left_Speed_Ratio;
push_val_right =Right_Speed_Ratio;
Left_moto_go();
Right_moto_go();
}
void back(void) //小车后退
{
push_val_left =Left_Speed_Ratio;
push_val_right =Right_Speed_Ratio;
Left_moto_back();
Right_moto_back();
}
void left(void) //小车左转
{
push_val_left =Left_Speed_Ratio;
push_val_right =Right_Speed_Ratio;
Right_moto_go();
Left_moto_back();
}
void right(void) //小车右转
{
push_val_left =Left_Speed_Ratio;
push_val_right =Right_Speed_Ratio;
Right_moto_back();
Left_moto_go();
}
void stop(void) //小车停止
{
push_val_left =Left_Speed_Ratio;
push_val_right =Right_Speed_Ratio;
Left_moto_stp();
Right_moto_stp();
}
void rotate(void) //小车原地转圈
{
push_val_left =Left_Speed_Ratio;
push_val_right =Right_Speed_Ratio;
Left_moto_back();
Right_moto_go();
}
void Speed_add() //加速函数
{
if(Left_Speed_Ratio<10)
{
Left_Speed_Ratio++;
Right_Speed_Ratio++;
}
}
void Speed_reduce() //减速函数
{
if(Left_Speed_Ratio>0)
{
Left_Speed_Ratio--;
Right_Speed_Ratio--;
}
}
#include
float S=0;
extern bit flag;
unsigned int measure_time;
char M_sensor;
void StartModule() //启动超声波模块
{
Trig=1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
Trig=0;
}
void Conut(void)
{
measure_time=TH1*256+TL1;
TH1=0;
TL1=0;
S=(measure_time*1.87)/100; //算出来是CM
if( flag==1||S>50||S<2) //超出测量
{
flag=0;
LED=1;
M_sensor=1;
}
else
{
LED=0;
M_sensor=0;
}
}
#ifndef __car_H
#define __car_H
#include
#include
sbit Left_moto_pwm=P1^6 ;
sbit Right_moto_pwm=P1^7;
sbit p34=P3^4;
sbit p35=P3^5;
sbit p36=P3^6;
sbit p37=P3^7;
sbit Trig= P1^4; //产生脉冲引脚
sbit Echo= P1^5; //回波引脚
sbit LED=P0^0;
sbit L_sensor=P2^0;
sbit R_sensor=P2^1;
void Left_moto_go() ;
void Left_moto_back() ;
void Left_moto_stp() ;
void Right_moto_go();
void Right_moto_back();
void Right_moto_stp();
void delay(unsigned int k) ;
void delay1s(void) ;
void delay1ms(void);
void pwm_out_left_moto(void) ;
void pwm_out_right_moto(void);
void run(void);
void back(void);
void left(void);
void right(void);
void stop(void);
void rotate(void);
void StartModule() ;
void Timer1Init();
void Timer0Init();
void Conut(void);
void Timer1Init2();
void Speed_add() ;
void Speed_reduce();
#endif
本文介绍的内容的完整代码的keil文件和蓝牙HC—08模块的资料包(包括HC-COM这个app在内)我会放到附件里,还是那句话,我放的时候都是免费的,但是它会自己涨,需要的可以评论区留言,我直接发给你
欢迎大家积极交流,本文未经允许谢绝转载