51单片机

系统原理

51单片机蓝牙遥控小车的系统框图大致如下:
 

系统原理


这是经典的自制蓝牙遥控车系统方案,整个系统分为手机跟小车两部分。
手机端可以自己写蓝牙软件,也可以直接用应用商店现成的,新手建议直接在应用商店下载“蓝牙串口”相关的应用即可。
小车这部分是我们重点关注的,主要由51单片机,电机驱动,蓝牙通信模块和电机等组成。小车的架子可以自己选择,选择两个电机或者四个电机的都可以,这边建议新手选择两个电机的快速入门。
蓝牙模块负责通过无线 电与手机进行通信,接收手机下发的指令,并传达给51单片机。51单片机作为小车的主要控制器,根据蓝牙模块接收到的手机指令操作电机等外围器件执行例如启动、关闭电机,打开、关闭LED等动作。因为单片机的IO口驱动能力有限(电流被限制)所以要外加电机驱动来使电机转动,因而电机驱动的作用就是接收51单片机的指令来控制电机的动作。电机的作用就显而易见了,用来使小车运动。
基本的系统架构就是这样,接下来接收各个部分的技术要点。

各个模块介绍

蓝牙模块

蓝牙模块这边以型号“HC-05”为例介绍。

蓝牙模块的价格从十几到二十几不等,我们这个方案十几的也能用,看自己需要。
HC-05有两种模式,主模式和从模式,主模式能主动配对其他蓝牙设备并连接,从设备只能等待其他蓝牙设备的连接,根据系统框图,我们这个系统就只需要有从模式的就可以了,因为我们只接受手机下发的指令。
蓝牙模块是通过串口通信协议跟单片机进行交流的(什么是通信协议,就类似于我们的中文,英语和方言等,是一种交流的规则,比如说中文用汉字“好”表示好的可以的意思,而英语用英文字母“OK”表示好的意思,需要支持共同协议的双方才能通信),所以需要事先确定好通信协议,比如蓝牙发送2是前进的意思,8是后退的意思等。蓝牙模块的操作一般看商家提供的资料就知道怎么使用了,而且拿回来可以直接用,这边就不过多介绍了。

我所使用的是HC-05蓝牙模块作为本方案的通信模块

电机及其驱动模块

众所周知,单片机的驱动能力非常有限,甚至LED都需要驱动,更别说功率更大的电机了,而电机驱动模块就是增强单片机的负载能力,使单片机能控制电机,所以使用电机驱动模块非常有必要。

电机驱动的选择需要根据电机的种类选择,电机一般有直流电机和步进电机,各自的优缺点大家可以到网上查资料,它们所需要的的驱动模块类型也不一样,购买时需要确认好,避免买错了。这边最近淘宝搞活动,刚刚好花2块钱买了两个28byj48步进电机和配套的驱动板(这里是个坑,速度巨慢,建议买其他的,比如25GA370直流电机等,买电机最好买减速电机,不然电机本身的扭力可能不足以驱动小车),于是就准备用这个来做。

我所使用的是两个28byj48步进电机和配套的驱动板作为本方案的电机(后面发现是坑,巨慢)

电源及电源模块

电源大家可以选择电池盒或者是航模锂电池等,其提供的电压必须是满足小车里所有器件对电压的最低要求的,例如单片机需要5v电压,而电机需要12v,那么电池应该提供的电压是大于等于12v的。

这里我比较推荐航模锂电池,容量大,输出功率高,适合小车这种有大功率用电(电机)的设备。那么如果使用12v的电池,单片机的5v怎么搞呢?这里就需要用到稳压模块,需要准备一些稳压模块,把12v转换成5v提供给单片机,当然如果出现了问题一般是没有共地(所有GND没有相连)。

稳压模块一般注意的就是其提供的功率应该要满足5v电路的需求,那么稳压模块一般推荐LM2596,这边我这次使用的也是这个。

我所使用的是12V锂电池和LM2596s稳压模块作为本方案的电源

单片机最小系统

任何51单片机的最小系统都可以,可以自己搭,也可以直接买,买的话,推荐以下几种:

我所使用的是图左边这个(注意晶振要安装好)

其他模块

像上面系统原理图上提到的小灯和屏幕或者是没提到的超声波测距和摄像头等都可以为小车增加新的功能特性,由于我们的目的就只想做个遥控车,其他模块就大家自己去了解了,了解的时候可以重点关注器件的数据手册以及单片机的数据手册。
 


我在本方案中为了简单没有使用其他传感器模块

小车结构

小车架子

众所周知,车一般都有一个车架子,作为车的支撑和承载结构。车架很大方面影响到车的最终效果,大家可以去选购合适的车架。其中有一点需要说明的是,我们选择的车架前轮转弯的调整方式应该是通过电机来调整比较简单适合入门,通过舵机调整的效果更好,但是需要自己学习,这边就不讲舵机的相关知识了。电机实现的比较优雅的转弯方式大家可以搜索“万向轮”和“转向前桥”,这边我使用结构比较简单的万向轮来实现转弯。除了转弯实现方式,电机是否与小车架子匹配也是一方面,不要到时候电机和架子都买了,发现电机无法安装就尴尬了,哈哈。

小车架子除了以上要注意的,其他的大家可以按喜好选择。

我所使用的是类似于图片中的架子(万向轮),不过电机是28byj48步进电机

通信协议

上面讲蓝牙模块的时候提到了通信协议,这边不多再提,主要讲通信协议的设计要点。
下面引自百度百科对通信协议的要素说明:

通信协议主要由以下三个要素组成:
语法:即如何通信,包括数据的格式、编码和信号等级(电平的高低)等。
语义:即通信内容,包括数据内容、含义以及控制信息等。
定时规则(时序):即何时通信,明确通信的顺序、速率匹配和排序。

建立通信协议的目的是准确、完整、快速的传达消息,因此,消息的指令应该简短明确且有完整性校验。
这边简单讲下我们这个方案通信协议设计的基本思路和过程(以万向轮架子为例)。

这边我想通过控制电机来控制小车的动作。
我们需要控制两个电机,电机包括转向(正转、反转、停止)、速度这两个参数。经过试验,发现28byj48步进电机能调步进速度的范围在1ms-30ms之间比较合适,30ms已经很慢了。

  • S代表设置转向(S:sta),后面跟1位数字作为状态表达。0:停止,2:逆(后退),1:顺(前进)。
  • 想继续用s代表设置速度的(s:speed),但想到两个‘S’不利于区分,而且状态只有3种的话就直接用一位数字就能完成所有的状态表达了,而速度的范围是1-30,需要两位数字,因此就使用数字代表设置速度了,同时也表示速度的十位。

基本就以上两种类型的信息就能实现对电机的状态和速度控制。
考虑到小车上有两个电机,因此我们再设计一个描述符,表示我们要控制的是哪一个电机。

  • 调整的电机,L代表要控制电机1,R代表要控制电机2。

消息基本设计完毕,最后面还需要加完整性校验或者是说触发消息。
以后系统越做越复杂的话可能不止我们这一种协议,因此应该在消息头表明消息类型,这样也便于程序处理。

  • 我们的控制电机的消息都以C开头(C:car)

消息传输完毕后应该告诉单片机消息传输完毕了,就像我们跟别人说再见一样。以便单片机及时处理消息。

  • 我们的消息都以\r\n(换行回车)结尾

最后,我们设计的通信可以做如下总结:

 
/**********************
串口通信协议说明:
有以下4种指令:
左电机:
1.CLS{$模式代码}\r\n,模式代码为0,1,2,分别代表0:停止,2:逆(后退),1:顺(前进),成功设置返回'1'
2.CL{$两位速度值}\r\n,速度值为01-30,必须是两位,例如:01,30 ,成功设置返回'2'
右电机:(同左电机,不过指令的L改为R)
1.CRS{$模式代码}\r\n,模式代码为0,1,2,分别代表0:停止,2:逆(后退),1:顺(前进),成功设置返回'3'
2.CR{$两位速度值}\r\n,速度值为01-30,必须是两位,例如:01,30,成功设置返回'4'
设置失败返回'0'
**********************/

具体怎么实现我们要在代码部分完成。

程序代码

单片机部分

硬件

硬件连接如下:

很简单~
电池输出的12V电压通过稳压器稳压到5V之后提供给整个系统电源。
蓝牙模块连接至单片机的串口(RX接TX,TX接RX)。
两个电机驱动依次接至单片机的P1口。
电机直接分别接到电机驱动模块上。

指令系统概述

指令是计算机用于控制各种功能部件完成的某一特定动作的指示和命令。一台计算机能识别和执行的指令集合即为其指令系统。指令系统是一套控制计算机执行操作的编码,通常称为机器语言。机器语言是计算机唯一能识别和执行的指令。指令系统由硬件决定,且不具有通用性。汇编语言可以准确地计算出控制操作时间并灵活地实施控制,及高效开发必须掌握指令系统和汇编语言。

在实际开发应用中,由于指令系统与汇编语言开发的繁琐和开发效率低则应用C语言开发或者直接应用固件集成库开发提高开发效率和时间。但是对于单片机及其他硬件开发过程,开发过程的调试和资源应用都应对于汇编和指令系统的熟悉才能真正的高效开发完成调试达到目的。

常用单位和术语

位(bit):位是计算机所表示的最小的最基本的数据单位。由于计算机使用的是二进制数,因此位就是一个二进制数。

字节(byte):一个连续8位的二进制数码称为一个字节,即1byte=8bit。

字(word):通常16位二进制数码组成,即1word=2byte=16bit。

字长:字长是计算机一次处理二进制的位数。(MCS-51是8位单片机,字长就是8位)

汇编语言指令格式

指令的表示方式称为指令格式,它规定了指令的长度和内部信息的安排。完整的指令格式如下:

[标号:] 操作码 [操作数],[操作数],[操作数] [;注释]

注:[]项是可选项;

标号:本条指令的起始地址的符号,也称为指令的符号地址,代表该条指令在程序编译时的具体地址,标号可以被其他语句调用。

操作码:又称为指令助记符,对应的英文构成,是指令语句的关键。

操作数:可以是具体数据,也可以是具体数据存放的地址。

例: ORG 0100H

START:MOV A,#78H

···················

ORG 0500H

LP: MOV R0,#80H

指令系统中的常用符号:

Rn 当前寄存器区的8个工作寄存器R0~R7(n=0~7)。

Ri 当前寄存器区中可作间接寻址寄存器的2个寄存器R0、R1(i=0,1)。

Direct 直接地址,即8位的内部RAM或特殊功能寄存器的地址。

#data 包含在指令中的8位立即数。

#data16 包含在指令中的16位立即数。

rel 相对转移指令中的偏移量,为8位的带符号补码数。

DPTR 数据指针,可用作16位的数据地址寄存器。

bit 内部RAM或特殊功能寄存器中的直接寻址位。

C(或Cy) 进位标志位或位处理机中的累加器。

addr11 11位目的地址

addr16 16位目的地址

@ 间接寻址寄存器前缀,如@Ri,@A+DPTR

(X) X中的内容。

((X)) 由X寻址的单元中的内容。

→ 箭头右边的内容被箭头左边的内容所取代。

指令系统的寻址方式

在计算机中,说明操作数所在的地址的方法,或指令按地址获得操作数的方式,称为指令的寻址方式。指令的执行首先要按照地址寻找操作数,指令再对操作数进行操作。操作结果还要按照地址存入相应的存储单元和寄存器中。程序实际就是不断寻找操作数然后执行操作的过程,将操作结果根据地址存入相应的存储器和寄存器中的过程。寻址方式越多,计算机灵活性越强,指令系统就越复杂。

MCS-51操作数可以存放片内ROM/RAM和片外ROM/RAM中,也可以存储在特殊功能寄存器中。总共提供了7种寻址方式。

  1. 寄存器寻址方式

操作数在寄存器中MOV A,Rn ;(Rn)→A,n=0~7表示把存储器Rn的内容传送给累加器A。

寻址范围:

(1)4组通用工作寄存区共32个工作寄存器。

(2)部分特殊功能寄存器,例如A,B以及数据指针寄存器DPTR等。

2.直接寻址方式

操作数直接以单元地址形式给出:MOV A , 40H

寻址范围

(1)内部RAM的128个单

(2)特殊功能寄存器。除了单元地址形式外,还可用寄存器符号的形式给出。例如:MOV A,80H与MOV A,P0是等价的。

3.寄存器间接寻址方式

寄存器中存放的是操作数的地址,在寄存器前加前缀标志“@”。访问内部RAM或外部RAM的低256个字节时,只采用RP或R1作为间址寄存器。例如:

MOV A , @Ri;i=0或1

其中Ri中的内容为40H,把内部RAM40H单元内容送A。寻址范围:

(1)访问内部RAM低128个单元,其通用形式为@Ri

(2)对外部内部RAM的64K字节的间接寻址,例如: MOVX A,@DPTR

(3)片外数据存储器的低256字节,例如:MOVX A,@Ri

(4)堆栈区:堆栈操作指令PUSH(压栈)和POP(出栈)使用堆栈指针SP作间址寄存器

4.立即寻址方式

操作数在指令中直接给出,需在操作数前面加前缀“#”。例如:

MOV A , #40H

5.基址寄存器加变址寄存器间址寻址方式

本寻址方式是用于访问程序存储器的数据表格,以DPTR(数据指针)或PC作基址寄存器,以累加器A作为变址寄存器,以两者相加作为16位地址作为操作数地址,以达到访问数据表格的目的。例如:指令MOVC A,@A+DPTR其中A的原有内容位05H,DPTR的内容为0400H,该指令执行的结果就是把程序存储器0405H单元的内容传送给A。说明:

(1)本寻址方式是专门针对程序存储器的寻址方式,寻址范围可以达到64KB.

(2)本寻址方式的指令只有3条:

MOVC A,@A+DPTR;

MOVC A,@A+PC;

JMP @A+DPTR;

6.位寻址方式

MCS-51有位处理功能,可以对数据位进行操作。例如:MOV C,40H 是把位40H的值送到进位位C。

寻址范围包括:

(1)内部RAM中的位寻址区,单元地址为20H~2FH。位有两种表示方法:40H和单元地址加上位(28H).0,是指28H单元中的最低位。

(2)特殊功能寄存器中的可位寻址如下4种:

a.直接使用位寻址。例如PSW.5的位寻址为0D5H。

b.位名称的表示方法,例如PSW.5是F0的标志位,可使用F0表示该位。

C.单元地址加位数,例如(0D0H).5。

d.特殊功能寄存器符号加位数,例如PSW.5。

7.相对寻址方式

本寻址方式为了解决程序转移指令而设计的,作为转移指令而采用(相对寻址只对程序存储器ROM进行寻址)。在相对寻址的转移指令中,给出了地址偏移量,以“rel”表示,即把PC的当前值加上偏移量就构成了程序转移的目的地址:

目的地址=转移指令所在的地址 + 转移指令的字节数 + rel

偏移量rel是一带符号的8位二进制数补码数 。范围是:–128 - +127 向地址增加方向最大可转移(127+转移指令字节)个单元地址,向地址减少方向最大可转移(128-转移指令字节)个单元地址。

7种寻址方式及寻址空间,见表如下。

指令中的源操作数可以使用上面的任意一种,目的操作数只能使用除立即寻址外的其他6种寻址方式。片内RAM(低128B)区可采用直接寻址,寄存器寻址、寄存器间接寻址方式访问。片内SFR(RAM区的高128B)只能采用直接寻址方式访问。片外RAM区只能采用寄存器间接寻址(R0,R1,DPTR作为间址寄存器)访问方式。程序存储器ROM可以采用直接寻址、相对寻址、基址加变址寄存器间接寻址。位寻址(片内RAM的20H~2FH单元的128位及SFR区83位可位寻址)只能用位寻址方式访问。

  • 47
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值