前言:代码可用,主要理解逻辑,不用接线也能明白
一:51单片机-串口控制小车实物接线图
1.电机模块开发
1.1接线图
L9110s是一种双路直流电机驱动芯片,常用于控制小型电机的转动。它有多种封装形式,如DIP、SOP等,可以方便地与其他电路连接。L9110具有低电压、低电流和高效率等特点,能够提供稳定的电机驱动电流,同时还具有过热保护功能,能有效地保护电机和芯片本身。由于其成本低廉、易于使用,因此在智能小车、机器人、飞行器等各种电子设备中广泛应用。
单片机只连接P3^3,的线 和P3-4+5+6的线(输入法问题),电机驱动芯片的电源由电池驱动
1.2实物图
1.3电机模块
二:代码
2.1 代码预览区
封装思路:
首先:把具体的操作函数行为A放进以这个功能命名的A.c文件,然后在A.h里面调用A.c里面的具体函数,最后在main.c里面引用A.h
A.h头文件起到中间商的作用,这样子我要变更A.c具体的操作就不用动main.c了,这就是封装的好处
把uart.c和motor.c放进去uart.h和motor.h,main.c引用.h头文件,
给.c源代码瘦身,然后在main.c里面调用实现函数封装
2.2 main.c 主函数
#include"motor.h"
#include "delay.h"
#include "uart.h"
void main(){
UartInit();
while(1);
}
2.3 uart.c 串口控制
#include "reg52.h"
#include "motor.h"
#include "string.h"
sbit D5 = P3^7;
#define SIZE 12
sfr AUXR = 0x8E;//对寄存器进行赋值,相当于1000 1110,看datasheet数据手册(STC89C51RC-RD)
char buffer[SIZE];
void UartInit(void){//串口初始化
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;
}
}//如果缓冲区的buffer[12]放满了12个,那就用memset函数清零
if(i == 12)
{
memset(buffer,'\0',SIZE);
i = 0;
}
}
}
2.4 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;
}
2.5 motor.h
void goRight();
void goLeft();
void goForward();
void goBack();
void stop();
2.6 delay.h
void Delay1000ms();
2.7 uart.h
void UartInit(void);
三:实际操作
3.1 通过串口发送数据
发M1, M2,M3,M4,分别实现前进,后退,左转,右转,发送M678等等,会停止
3.2 memset 函数使用
请参考
http://t.csdnimg.cn/Gwp66
以上