嵌入式-51单片机-串口控制小车(直流电机驱动)

前言:代码可用,主要理解逻辑,不用接线也能明白

一: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

以上

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值