前段时间,学完51单片机,出于兴趣,做了一个蓝牙遥控小车,能实现现小车的前进、停止、后退、左转、右转、变速等基本控制。
小车主要由STC12C5620AD为主要控制模块,蓝牙模块使用的是hc-05,使用一个L298N驱动两个电机,通过电机之间的交叉连线,使同一方向的电机实现同方向转动,利用PWM的原理控制电机,程序如下:
硬件链接:
左电机控制端口:P0.0、P0.1
右电机控制端口:P0.2、P0.3
***************************/
include
define uchar unsigned char//宏定义
define uint unsigned int//宏定义
define aa 50//左轮速度调节值
define bb 50//右轮速度调节值
define PWM1 7//小车前进速度,1-9可调(若转弯容易冲出,调慢即可)
define PWM2 8//小车转向速度,1-9可调
sbit zb=P1^2;//左边 光电管的信号端
sbit qb=P1^1;//前边 光电管的信号端
sbit yb=P1^0;//右边 光电管的信号端
sbit you1=P0^1;//右轮正转信号端
sbit you2=P0^0;//右轮倒转信号端
sbit zuo1=P0^3;//左轮正转信号端
sbit zuo2=P0^2;//左轮倒转信号端
uchar a=0;//定义一个变量a,用来读取串口的数据
uchar flag = 0;
void delayms(uint z)//一个带参数的延时程序
{
int i,j;//定义两个变量
for(i=z;i>0;i--)
for(j=110;j>0;j--);//将参数z赋值给j
}
void qian()//前进
{
you1=0;
you2=1;
zuo1=0;
zuo2=1;
delayms(PWM1);//pwm调速,若PWM1=7表示速度为全速的35%
you1=0;
you2=0;
zuo1=0;
zuo2=0;
delayms(20-PWM1);
}
void you()//右转
{
you1=1;
you2=1;
zuo1=0;
zuo2=1;
delayms(PWM2);//pwm调速,若PWM1=9表示速度为全速的90%
you1=0;
you2=0;
zuo1=0;
zuo2=0;
delayms(20-PWM2);
}
void zuo()//左转
{
you1=0;
you2=1;
zuo1=1;
zuo2=1;
delayms(PWM2);//pwm调速,若PWM1=9表示速度为全速的90%
you1=0;
you2=0;
zuo1=0;
zuo2=0;
delayms(20-PWM2);
}
void init()//初始化子程序
{
TMOD=0x20;//设置定时器T1为工作方式2
TH1=0xfd;
TL1=0xfd;//T1定时器装初值
TR1=1;//启动定时器T1
REN=1;//允许串口接收
SM0=0;
SM1=1;//设置串口工作方式1
EA=1;//开总中断
ES=1;//开串口中断
}
void go1()//前进子程序
{
zuo1=1;
zuo2=0;//左边轮子正转
delayms(aa);//pwm有用值,越大左边方向的轮子越快
zuo2=1;//关闭左边轮子
you1=1;
you2=0; //右边轮子正转
delayms(bb);//pwm有用值,越大右边的轮子越快
you2=1;//关闭右边轮子
delayms(100);//pwm无用值,越大,小车跑的越慢
}
void go2()//前进子程序
{
zuo1=1;
zuo2=0;//左边轮子正转
delayms(aa);//pwm有用值,越大左边方向的轮子越快
zuo2=1;//关闭左边轮子
you1=1;
you2=0; //右边轮子正转
delayms(bb);//pwm有用值,越大右边的轮子越快
you2=1;//关闭右边轮子
delayms(80);//pwm无用值,越大,小车跑的越慢
}
void go3()//前进子程序
{
zuo1=1;
zuo2=0;//左边轮子正转
delayms(aa);//pwm有用值,越大左边方向的轮子越快
zuo2=1;//关闭左边轮子
you1=1;
you2=0; //右边轮子正转
delayms(bb);//pwm有用值,越大右边的轮子越快
you2=1;//关闭右边轮子
delayms(60);//pwm无用值,越大,小车跑的越慢
}
void go4()//前进子程序
{
zuo1=1;
zuo2=0;//左边轮子正转
delayms(aa);//pwm有用值,越大左边方向的轮子越快
zuo2=1;//关闭左边轮子
you1=1;
you2=0; //右边轮子正转
delayms(bb);//pwm有用值,越大右边的轮子越快
you2=1;//关闭右边轮子
delayms(40);//pwm无用值,越大,小车跑的越慢
}
void go5()//前进子程序
{
zuo1=1;
zuo2=0;//左边轮子正转
delayms(aa);//pwm有用值,越大左边方向的轮子越快
zuo2=1;//关闭左边轮子
you1=1;
you2=0; //右边轮子正转
delayms(bb);//pwm有用值,越大右边的轮子越快
you2=1;//关闭右边轮子
delayms(20);//pwm无用值,越大,小车跑的越慢
}
void go6()//前进子程序
{
zuo1=1;
zuo2=0;//左边轮子正转
delayms(aa);//pwm有用值,越大左边方向的轮子越快
zuo2=1;//关闭左边轮子
you1=1;
you2=0; //右边轮子正转
delayms(bb);//pwm有用值,越大右边的轮子越快
you2=1;//关闭右边轮子
}
void hui1()//小车后退的子程序
{
zuo1=0;
zuo2=1;//左边轮子倒转
delayms(aa);//pwm有用值,越大左边方向的轮子越快
zuo1=1;//关闭左边轮子
you1=0;
you2=1; //右边轮子倒转
delayms(bb);//pwm有用值,越大右边的轮子越快
you1=1;//关闭右边轮子
delayms(100);//pwm无用值,越大,小车跑的越慢
}
void hui2()//小车后退的子程序
{
zuo1=0;
zuo2=1;//左边轮子倒转
delayms(aa);//pwm有用值,越大左边方向的轮子越快
zuo1=1;//关闭左边轮子
you1=0;
you2=1; //右边轮子倒转
delayms(bb);//pwm有用值,越大右边的轮子越快
you1=1;//关闭右边轮子
delayms(80);//pwm无用值,越大,小车跑的越慢
}
void hui3()//小车后退的子程序
{
zuo1=0;
zuo2=1;//左边轮子倒转
delayms(aa);//pwm有用值,越大左边方向的轮子越快
zuo1=1;//关闭左边轮子
you1=0;
you2=1; //右边轮子倒转
delayms(bb);//pwm有用值,越大右边的轮子越快
you1=1;//关闭右边轮子
delayms(60);//pwm无用值,越大,小车跑的越慢
}
void hui4()//小车后退的子程序
{
zuo1=0;
zuo2=1;//左边轮子倒转
delayms(aa);//pwm有用值,越大左边方向的轮子越快
zuo1=1;//关闭左边轮子
you1=0;
you2=1; //右边轮子倒转
delayms(bb);//pwm有用值,越大右边的轮子越快
you1=1;//关闭右边轮子
delayms(40);//pwm无用值,越大,小车跑的越慢
}
void hui5()//小车后退的子程序
{
zuo1=0;
zuo2=1;//左边轮子倒转
delayms(aa);//pwm有用值,越大左边方向的轮子越快
zuo1=1;//关闭左边轮子
you1=0;
you2=1; //右边轮子倒转
delayms(bb);//pwm有用值,越大右边的轮子越快
you1=1;//关闭右边轮子
delayms(20);//pwm无用值,越大,小车跑的越慢
}
void hui6()//小车后退的子程序
{
zuo1=0;
zuo2=1;//左边轮子倒转
delayms(aa);//pwm有用值,越大左边方向的轮子越快
zuo1=1;//关闭左边轮子
you1=0;
you2=1; //右边轮子倒转
delayms(bb);//pwm有用值,越大右边的轮子越快
you1=1;//关闭右边轮子
}
void turnleft()//小车左转弯子程序
{
zuo1=0;
zuo2=1;//左边轮子停止转动
you1=1;
you2=0; //右边轮子正转
delayms(1);//pwm有用值,越大右边的轮子越快
you2=1;//右边轮子停止
zuo1=1;
}
void turnright()//小车右转弯子程序
{
zuo1=1;
zuo2=0;//左边轮子正转
you1=0;
you2=1; //右边轮子停止
delayms(1);//pwm有用值,越大左边方向的轮子越快
zuo2=1;//左边轮子停止
you1=1;
}
void down()//停止子程序
{
zuo1=1;
zuo2=1;
you1=1;
you2=1; //左右轮全部停止
}
void APP()
{
if(a==0x14||a==0x15||a==0x54||a==0x55||a==0x64||a==0x65)//如果是就前进
go1();
if(a==0x16||a==0x17||a==0x56||a==0x57||a==0x66||a==0x67)//如果是就前进
go2();
if(a==0x18||a==0x19||a==0x58||a==0x59||a==0x68||a==0x69)//如果是就前进
go3();
if(a==0x1a||a==0x1b||a==0x5a||a==0x5b||a==0x6a||a==0x6b)//如果是就前进
go4();
if(a==0x1c||a==0x1d||a==0x5c||a==0x5d||a==0x6c||a==0x6d)//如果是就前进
go5();
if(a==0x1e||a==0x1f||a==0x5e||a==0x5f||a==0x6e||a==0x6f)//如果是就前进
go6();
if(a==0x24||a==0x25||a==0x74||a==0x75||a==0x84||a==0x85)//如果是就后退
hui1();
if(a==0x26||a==0x27||a==0x76||a==0x77||a==0x86||a==0x87)//如果是就后退
hui2();
if(a==0x28||a==0x29||a==0x78||a==0x79||a==0x88||a==0x89)//如果是就后退
hui3();
if(a==0x2a||a==0x2b||a==0x7a||a==0x7b||a==0x8a||a==0x8b)//如果是就后退
hui4();
if(a==0x2c||a==0x2d||a==0x7c||a==0x7d||a==0x8c||a==0x8d)//如果是就后退
hui5();
if(a==0x2e||a==0x2f||a==0x7e||a==0x7d||a==0x8e||a==0x8f)//如果是就后退
hui6();
if(a==0x3f)//如果是0x3f就左转
turnleft();
if(a==0x4f)//如果是0x4f就右转
turnright();
if(a==0x00)//如果是0x00就停止
down();
else
down();
}
void main()//主程序
{
init();//调用初始化子程序
while(1)//死循环
{
if(flag == 1)
{
APP();
flag = 0;
}
}
}
void chuan() interrupt 4//串口中断服务程序
{
RI=0;//软件清除串口响应
a=SBUF;//读取单片机串口接受的蓝牙模块发送的数据
flag = 1;
}