×
单片机 > 单片机程序设计 > 详情

L298N+AT89C52+BT-04A蓝牙控制遥控小车

发布时间:2023-02-16 发布时间:
|

1.环境的搭建
Proteus8.7版本,还有就是虚拟端口号的搭建,因为Proteus8.7没有蓝牙模块,蓝牙实际上就是一个串口,我们用虚拟串口代替蓝牙模块,Virtual Serial Port Driver Pro.exe虚拟串口的软件,文件夹里有安装步骤也有,在这儿就不多说了,BT-04A默认的波特率是9600bps,而我们用的是4800bps,因为我

用的是12Mhz的晶振,产生9600bps的误差太大不适合用(如果你用的11.0592HMhz的晶振,可以直接用,程序源码里面有怎么设置),用串口下载CH340G,连接上BT-04A,输入AT指令,改变波特率。

2.设计思路
l298n是驱动芯片,还得给电机提供电源,我们可以采用18650电池当电源,l298N的数据手册,文件里有具体说明。

一共四个数据输入,数据输出,如果有兴趣的朋友可以看看L298N的工作原理,我在这儿附上一张图,




3.程序源码
在最后附上所有的资料和所需要的的软件。


4.实验现象
都在文件夹里,如果还想增加其他功能,可以根据自己的需求添加。
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)

单片机源程序如下:

/*波特率 4800bps ,晶振用的12Mhz,BT04-A ,默认的是9600bps*/

/*如果这个程序源码修改为11.0592的晶振,那么proteus里面的compim也要修改为9600bps*/

#include

typedef unsigned char uchar;

typedef unsigned int uint;


sbit A_IA=P0^0;

sbit A_IB=P0^1;

sbit B_IA=P0^2;

sbit B_IB=P0^3;

sbit JDQ=P2^0;


void CarForward(); //前进

void CarBack(); //后退

void CarLeft(); //向左

void CarRight(); //向右

void CarStop(); //停止

void JDQ1(); //开灯

void JDQ2(); //关灯

void UsartInit(); //串口初始化

void delay1ms(uint c);

uchar receiveData; //接受的数据

void main()

{ JDQ=0;

UsartInit();

while (1);

}

void UsartInit()

{

TMOD |=0x20;

SCON =0x50;

PCON =0x80; //4800bps

TH1=0xf3; //如果你用的是9600bps,初值为TH1=0xFA;TH1=0xFA;

TL1=0xf3;

ES=1;

EA=1;

TR1=1;

}

void delay1ms(uint c)

{

uint a,b;

for(a=c;a>0;a--);

for(b=112;b>0;b--);

}


void CarForward()

{

A_IA=1;

A_IB=0;

B_IA=1;

B_IB=0;

}

void CarBack()

{

A_IA=0;

A_IB=1;

B_IA=0;

B_IB=1;

}

void CarLeft()

{

A_IA=0;

A_IB=0;

B_IA=0;

B_IB=1;

}

void CarRight()

{

A_IA=0;

A_IB=1;

B_IA=0;

B_IB=0;

}

void CarStop()

{

A_IA=0;

A_IB=0;

B_IA=0;

B_IB=0;

}

void JDQ1()

{

JDQ=1;

}

void JDQ2()

{

JDQ=0;

}

void Usart()interrupt 4

{

receiveData=SBUF; //接收数据

RI=0; //关闭计时器

SBUF=receiveData; //发送数据

while(!TI);

TI=0;

if(receiveData=='2')

CarForward();

else if (receiveData=='8')

CarBack();

else if(receiveData=='6')

CarLeft();


else if(receiveData=='4')

CarRight();

else if(receiveData=='5')

CarStop();

else if(receiveData=='0')

JDQ1();

else if(receiveData=='1')

JDQ2();

delay1ms(10) ;

}



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
51单片机中断源的扩展方法