10.1小车的安装
10.2电机模块的开发(L9110S)
接通
VCC
,
GND
模块电源指示灯亮, 以下资料来源官方,但是不对,根据下节课实际调试
IA1
输入高电平,
IA1
输入低电平,【
OA1 OB1
】电机正转;
IA1
输入低电平,
IA1
输入高电平,【
OA1 OB1
】电机反转;
IA2
输入高电平,
IA2
输入低电平,【
OA2 OB2
】电机正转;
IA2
输入低电平,
IA2
输入高电平,【
OA2 OB2
】电机反转;
10.3驱动电机模块让小车动起来(前后左右)
#include "reg52.h"
#include "intrins.h"
sbit RightCon1A = P3^2;
sbit RightCon1B = P3^3;
sbit LeftCon1A = P3^4;
sbit LeftCon1B = P3^5;
void Delay1000ms() //@11.0592MHz
{
unsigned char i, j, k;
_nop_();
i = 8;
j = 1;
k = 243;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void goForward()
{
LeftCon1A = 0;
LeftCon1B = 1;
RightCon1A = 0;
RightCon1B = 1;
}
void goRight()
{
LeftCon1A = 0;
LeftCon1B = 1;
RightCon1A = 0;
RightCon1B = 0;
}
void goLeft()
{
LeftCon1A = 0;
LeftCon1B = 0;
RightCon1A = 0;
RightCon1B = 1;
}
void goBack()
{
LeftCon1A = 1;
LeftCon1B = 0;
RightCon1A = 1;
RightCon1B = 0;
}
void main()
{
while(1){
goForward();
Delay1000ms();
Delay1000ms();
goBack();
Delay1000ms();
Delay1000ms();
goLeft();
Delay1000ms();
Delay1000ms();
goRight();
Delay1000ms();
Delay1000ms();
}
}
10.4通过串口控制小车方向
1.通过串口调试工具 利用串口中断
#include "reg52.h"
#include "motor.h"
#include <string.h>
#define SIZE 12
sfr AUXR = 0x8E;
char buffer[SIZE];
void UartInit(void) //9600bps@11.0592MHz
{
AUXR = 0x01;
SCON = 0x50; //配置串口工作方式1,REN使能接收
TMOD &= 0x0F;
TMOD |= 0x20;//定时器1工作方式位8位自动重装
TH1 = 0xFD;
TL1 = 0xFD;//9600波特率的初值
TR1 = 1;//启动定时器
EA = 1;//开启总中断
ES = 1;//开启串口中断
}
//通过串口中断的方式进行 M1 前 M2 后 M3左 M4右
void Uart_Handler() interrupt 4
{
static int i = 0;//静态变量,被初始化一次
char tmp;
if(RI)//中断处理函数中,对于接收中断的响应
{
RI = 0;//清除接收中断标志位
tmp = SBUF;
if(tmp == 'M'){
i = 0;
}
buffer[i++] = tmp;
//灯控指令
if(buffer[0] == 'M'){
switch(buffer[1]){
case '1':
goForward();
break;
case '2':
goBack();
break;
case '3':
goLeft();
break;
case '4':
goRight();
break;
default:
stop();
break;
}
}
if(i == 12){
i = 0;
memset(buffer, '\0', SIZE);
}
}
}
2.通过蓝牙
添加点动控制,如果
APP
支持按下一直发数据,松开就停止发数据(蓝牙调试助手的自定义按键不
能实现),就能实现前进按键按下后小车一直往前走的功能
10.5利用PWM对小车进行调速
原理
: 全速前进是
LeftCon1A = 0; LeftCon1B = 1;
完全停止是
LeftCon1A = 0;LeftCon1B = 0;
那么单位时 间内,比如20ms,
有
15ms
是全速前进,
5ms
是完全停止,
速度就会比
5ms
全速前进,
15ms
完全停止获得的功率多,相应的速度更快!
开发
:借用
PWM
的舵机控制代码
//main.c
extern char speed;
void main()
{
Time0Init();
//UartInit();
while(1){
speed = 10;//10份单位时间全速运行,30份停止,所以慢,20ms是40份的500us
Delay1000ms();
Delay1000ms();
speed = 20;
Delay1000ms();
Delay1000ms();
speed = 40;
Delay1000ms();
Delay1000ms();
}
}
//time.c
#include "motor.h"
#include "reg52.h"
char speed;
char cnt = 0;
void Time0Init()
{
//1. 配置定时器0工作模式位16位计时
TMOD = 0x01;
//2. 给初值,定一个0.5出来
TL0=0x33;
TH0=0xFE;
//3. 开始计时
TR0 = 1;
TF0 = 0;
//4. 打开定时器0中断
ET0 = 1;
//5. 打开总中断EA
EA = 1;
}
void Time0Handler() interrupt 1
{
cnt++; //统计爆表的次数. cnt=1的时候,报表了1
//重新给初值
TL0=0x33;
TH0=0xFE;
//控制PWM波
if(cnt < speed){
//前进
goForward();
}else{
//停止
stop();
}
if(cnt == 40){//爆表40次,经过了20ms
cnt = 0; //当100次表示1s,重新让cnt从0开始,计算下一次的1s
}
}
10.6循迹小车
1.循迹模块使用
TCRT5000传感器的红外发射二极管不断发射红外线
当发射出的红外线 没有 被反射回来或被反射回来但强度不够大时,红外接收管一直处于关断状态, 此时模块的输出端为高电平 ,指示二极管一直处于 熄灭状态被检测物体出现在检测范围内时,红外线被反射回来且强度足够大,红外接收管饱和,此时模块的输出端为 低电平 ,指示 二极管被点亮
//main.c
#include "motor.h"
#include "delay.h"
#include "reg52.h"
sbit Leftxunji = P2^7; //左循迹模块
sbit Rightxunji = P2^6; //右循迹模块
void main()
{
while(1){
/*下方小车两个模块都能反射回来红外,输出低电平,灯亮,直走
上方小车左模块遇到黑线,红外被吸收,左模块输出高电平,右模块输出低电平,左转,反之右转*/
if(Leftxunji == 0 && Rightxunji == 0){
goForward();//前进
}
if(Leftxunji == 1 && Rightxunji == 1){
stop(); //停止
}
if(Leftxunji == 0 && Rightxunji == 1){
goRight(); //向右
}
if(Leftxunji == 1 && Rightxunji == 0){
goLeft(); //向左
}
}
}
//motor.c
#include "reg52.h"
sbit RightCon1A = P3^2;
sbit RightCon1B = P3^3;
sbit LeftCon1A = P3^4;
sbit LeftCon1B = P3^5;
void goForward()
{
LeftCon1A = 0;
LeftCon1B = 1;
RightCon1A = 0;
RightCon1B = 1;
}
void goRight()
{
LeftCon1A = 0;
LeftCon1B = 1;
RightCon1A = 0;
RightCon1B = 0;
}
void goLeft()
{
LeftCon1A = 0;
LeftCon1B = 0;
RightCon1A = 0;
RightCon1B = 1;
}
void goBack()
{
LeftCon1A = 1;
LeftCon1B = 0;
RightCon1A = 1;
RightCon1B = 0;
}
void stop()
{
LeftCon1A = 0;
LeftCon1B = 0;
RightCon1A = 0;
RightCon1B = 0;
}
语音控制小车 SU-03T LD3320
网盘资料
https://pan.baidu.com/s/1dXQSla_8D5O3D7UCsHZ0Dw
提取码
3k5a
这个语音模块不需要编程,不需要二次开发
通过厂家给的网站配置后即可使用,傻瓜式操作,