历史上的今天
今天是:2025年11月18日(星期二)
2022年11月18日 | 如何使用8051微控制器和蓝牙模块构建一个Android手机控制的机器人
2022-11-18 来源:circuitdigest
在这个项目中,我们将使用8051微控制器和模块构建一个手机控制的。该机器人是使用直流设计的,直流电机的方向将由从安卓应用程序收到的命令控制。机器人的状态被发送回安卓应用程序。该项目还将帮助HC-05蓝牙模块与8051微控制器的接口.
所需组件:
8051 微控制器 (AT89S52)
HC-05 蓝牙模块
L293D
机器人底盘
直流电机 (2)
轮子 (2)
脚轮
跳线
蓝牙终端安卓应用
电路图:
8051 微控制器:
8051微控制器是一种8位微控制器,具有128字节的片上,4K字节的片上,两个,一个串行端口和四个8位端口。8052微控制器是8051微控制器的扩展。在这个项目中,我们使用AT89S52微控制器。下表显示了8051名家庭成员的比较。
| 特征 | 8051 | 8052 |
| 只读存储器(以字节为单位) | 4K | 8K |
| 内存(字节) | 128 | 256 |
| 定时器 | 2 | 3 |
| I/O 引脚 | 32 | 32 |
| 串行端口 | 1 | 1 |
| 中断源 | 6 | 8 |
HC-05 蓝牙模块:
HC-05 是一个串行蓝牙模块.可以使用 AT 命令对其进行配置。它可以在三种不同的配置(主、从、环回)下工作。在我们的项目中,我们将它用作从属。HC-05模块的特点包括:
典型灵敏度为-80dBm。
默认波特率:9600bps,8个数据位,1个停止位,无奇偶校验。
自动配对 N 码:“1234”默认 PIN 码
它有 6 个引脚。
Vcc 和 Gnd 引脚用于为 HC-05 供电。
Tx 和 Rx 引脚用于与微控制器通信。
用于激活 HC-05 模块的使能引脚。当它为低时,模块被禁用
状态引脚行为状态指示灯。当它未与任何其他蓝牙设备配对/连接时,LED 会持续闪烁。当它与任何其他蓝牙设备连接/配对时,LED 会以 2 秒的恒定延迟闪烁。
L293D 电机驱动器 IC:
L293D 是一款双 H 桥电机驱动器 IC。它充当,L293D 的输出驱动直流电机。它包含两个内置的H桥电路。在共模运行模式下,它可以在两个方向上同时驱动两个直流电机。下表显示了L293D IC的引脚说明。
引脚说明
| 引脚编号 | 名字 | 功能 |
| 1 | 启用 1,2 | 电机 1 的使能引脚 |
| 2 | 输入 1 | 输入 1 用于电机 1 |
| 3 | 产出 1 | 电机 1 的输出 1 |
| 4 | 格德 | 接地 (0V) |
| 5 | 格德 | 接地 (0V) |
| 6 | 产出 2 | 电机 2 的输出 1 |
| 7 | 输入 2 | 输入 2 用于电机 1 |
| 8 | Vcc 2 | 电机电压(5V) |
| 9 | 启用 3,4 | 电机 1 的使能引脚 |
| 10 | 输入 3 | 输入 1 用于电机 2 |
| 11 | 产出 4 | 电机 1 的输出 2 |
| 12 | 格德 | 接地 (0V) |
| 13 | 格德 | 接地 (0V) |
| 14 | 产出 4 | 电机 2 的输出 2 |
| 15 | 输入 4 | 输入 2 用于电机 2 |
| 16 | Vcc 1 | 电源电压 (5V) |
安卓手机控制机器人的工作:
在这个智能手机控制的机器人中,android应用程序的用户通过HC-05模块将数据发送到8051微控制器。在8051微控制器中比较接收到的数据,并做出相应的决定。下表显示了不同接收字符的电机方向和机器人状态。
| 接收的字符 | 电机 1 | 电机 2 | 机器人现状 |
| f | 向前 | 向前 | 向前迈进 |
| b | 向后 | 向后 | 向后移动 |
| r | 向前 | 向后 | 向右移动 |
| l | 向后 | 向前 | 向左移动 |
| s | 关闭 | 关闭 | 停止 |
蓝牙终端应用程序允许我们蓝牙终端。此应用程序支持双向通信,此应用程序与大多数设备兼容。
以下步骤显示了如何安装和使用此应用。
1.在您的安卓手机上下载并安装蓝牙终端应用程序。
2.安装应用程序后,打开应用程序并打开蓝牙。
3.选择设备,然后单击连接选项。连接成功后,我们可以开始向HC-05模块发送数据。
查看下面的代码说明,了解 8051 微控制器如何发送和接收字符以旋转所需的电机。
代码说明:
该项目的完整 C 程序和演示在本项目结束时给出。代码被分成有意义的小块,并在下面解释。
对于与 8051 微控制器的 L293D 接口,我们必须定义 L293D 连接到 8051 微控制器的引脚。电机1的In1引脚连接到P2.0,电机1的In2引脚连接到P2.1,电机2的In1引脚连接到P2.2,电机2的In2引脚连接到P2.3
sbit m1f=P2^0; // in1 pin of motor1
sbit m1b=P2^1; // in2 pin of motor1
sbit m2f=P2^2; // in1 pin of motor2
sbit m2b=P2^3; // in2 pin of motor2
接下来,我们必须定义一些在程序中使用的函数。延迟功能用于创建指定的时间延迟。Txdata功能用于通过串口传输数据。Rxdata功能用于从串口接收数据。
void delay(unsigned int) ; //funcon for creaTIng delay
char rxdata(void); //funcTIon for receiving a character through serial port of 8051
void txdata(unsigned char); //funcTIon for sending a character through serial port of 8051
在代码的这一部分中,我们将配置8051微控制器进行串行通信。TMOD加载了定时器1模式2(自动重新加载)的0x20。SCON 寄存器加载了 8 个数据位、1 个停止位和接收启用的0x50。TH1寄存器加载了波特率为每秒9600位的0xfd。TR1=1 用于启动计时器。
TMOD=0x20;
SCON=0x50;
TH1=0xfd;
TR1=1;
在代码的这一部分中,rxdata 函数的返回字符存储在变量 's' 中以供进一步使用。
s=rxdata(); //receive serial data from hc-05 bluetooth module
在代码的这一部分中,我们必须将接收到的字符与不同方向的预分配字符进行比较。如果接收到的字符是“f”,则机器人必须向前移动。这是通过使 m1f、m2f 引脚高而 m1b、m2b 引脚低来实现的。完成此操作后,接下来我们必须将机器人的状态发送到Android应用程序。这是在 txdata 功能的帮助下完成的。对收到的不同字符重复相同的过程,并做出相应的决定。表1显示了机器人不同运动方向的m1f,m1b,m2f,m2b的不同值。
if(s=='f') //move both the motors in forward direction
{
m1f=1;
delay(1);
m1b=0;
delay(1);
m2f=1;
delay(1);
m2b=0;
delay(1);
for(i=0;msg1[i]!='';i++) //send status of robot to android app through bluetooth
{
txdata(msg1[i]);
}
}
| M1F | M1B | M2F | M2B | 电机 1 旋转 | 电机 2 旋转 | 机器人现状 |
| 1 | 0 | 1 | 0 | 向前 | 向前 | 前进 |
| 0 | 1 | 0 | 1 | 反向 | 反向 | 向后移动 |
| 1 | 0 | 0 | 1 | 向前 | 反向 | 向右移动 |
| 0 | 1 | 1 | 0 | 反向 | 向前 | 向左移动 |
| 0 | 0 | 0 | 0 | 停止 | 停止 | 停止 |
这是您可以通过使用 8051 微控制器控制四个电机来向任何方向旋转机器人汽车。
/*this program is for controlling a robot using bluetooth and android app*/
#include
unsigned char ch1;
unsigned char s;
sbit m1f=P2^0; // in1 pin of motor1
sbit m1b=P2^1; // in2 pin of motor1
sbit m2f=P2^2; // in1 pin of motor2
sbit m2b=P2^3; // in2 pin of motor2
void delay(unsigned int) ; //function for creating delay
char rxdata(void); //function for receiving a character through serial port of 8051
void txdata(unsigned char); //function for sending a character through serial port of 8051
void main(void)
{
unsigned char i;
unsigned char msg1[]={"robot is moving forward"};
unsigned char msg2[]={"robot is moving backward"};
unsigned char msg3[]={"robot is moving right"};
unsigned char msg4[]={"robot is moving left"};
unsigned char msg5[]={"robot is stopped"};
TMOD=0x20; //timer 1 , mode 2 , auto relo
SCON=0x50; //8bit data , 1 stop bit , REN enabled
TH1=0xfd; //timer value for 9600 bits per second(bps)
TR1=1;
while(1) //repeat forever
{
s=rxdata(); //receive serial data from hc-05 bluetooth module
if(s=='f') //move both the motors in forward direction
{
m1f=1;
delay(1);
m1b=0;
delay(1);
m2f=1;
delay(1);
m2b=0;
delay(1);
for(i=0;msg1[i]!='';i++)
{
txdata(msg1[i]);
}
}
else if(s=='b')
{
m1f=0;
delay(1);
m1b=1;
delay(10);
m2f=0;
delay(10);
m2b=1;
delay(10);
for(i=0;msg2[i]!='';i++)
{
txdata(msg2[i]);
}
}
else if(s=='r')
{
m1f=1;
delay(1);
m1b=0;
delay(10);
m2f=0;
delay(10);
m2b=1;
delay(10);
for(i=0;msg3[i]!='';i++)
{
txdata(msg3[i]);
}
}
else if(s=='l')
{
m1f=0;
delay(1);
m1b=1;
delay(1);
m2f=1;
delay(1);
m2b=0;
delay(1);
for(i=0;msg4[i]!='';i++)
{
txdata(msg4[i]);
}
}
else if(s=='s')
{
m1f=0;
delay(1);
m1b=0;
delay(1);
m2f=0;
delay(1);
m2b=0;
delay(1);
for(i=0;msg5[i]!='';i++)
{
txdata(msg5[i]);
}
}
txdata('n');
}
}
char rxdata()
{
while(RI==0); //wt till RI becomes HIGH
RI=0; //make RI low
ch1=SBUF; //copy received data
return ch1; //return the received data to main function.
}
void txdata(unsigned char x)
{
SBUF=x; //copy data to be transmitd to SBUF
while(TI==0); //wait till TI becomes high
TI=0; //mae TI low for next transmission
}
void delay(unsigned int z)
{
unsigned int p ,q;
for(p=0 ; p
{
for(q=0 ; q<1375 ; q++); //repeat for 1375 times
}
}
史海拾趣
|
作者:applevista 前两天,父亲在庙会上买了两个黑猫神牌电子驱蚊灭鼠器,5块一个。 前两年,见过这样东西,样子不一样,也提醒父亲这是骗人的,还是被骗了。 要是一块一个倒也不错,它其实就是一个简单的彩灯。 这个与卫星增台器、节电器一样 ...… 查看全部问答> |
|
请教各位高手 我在画原理图时(orcad) 有下列两个疑问: 1、请问处理器(在page1上)上的一个引脚如A1需要连接两个外围芯片x,y 可是芯片X我是用层次法(层次图上层在page1上)画的,与芯片y的连接是用平坦式画法 ...… 查看全部问答> |
|
在使用Altera的FPGA时候,由于系统需求,需要在管脚的内部加上上拉电阻。Quartus II软件中在Assignment Editor中可以设置。具体过程如下:1. 在菜单Assignments中选择Assignment Editor. 2. 在弹出的界面里选择I/O Features.找到Node. 3. 选择Node ...… 查看全部问答> |
|
本人想用stm32f207VG做下外扩NAND flash,先读取ID不行,GPIO配置如下: RCC_AHB3PeriphClockCmd(RCC_AHB3Periph_FSMC,ENABLE); RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_GPIOE | ...… 查看全部问答> |
|
[F7设计小分队征集中] 反射式血氧心率信号采集及监护记录系统 本帖最后由 nemo1991 于 2015-8-28 11:41 编辑 血氧探头展示: 原有所做的基于单片机的血氧仪,放大电路基于分立元件: 采用光学手段测试血氧的原理:file:///C:\\Users\\Di\\AppData\\Local\\Temp\\art222C.tmp 血红蛋白:对红光与红外光 ...… 查看全部问答> |




