嵌入式-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
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
MCU C51单片机是一种常用的微控制器,用于控制各种电子设备。在小车驱动程序中,我们可以使用C语言编写代码来实现各种功能。 首先,我们需要设置IO口的输入和输出,以便与电机连线。我们可以通过设置端口的高低电平来控制电机的转向和速度。比如,我们可以使用P0口来控制左右电机的转向,P1口来控制左右电机的PWM信号。 接下来,我们可以编写函数来控制小车的运动。例如,我们可以编写一个函数来控制小车前进,将左右电机的引脚设置为正向旋转,并且给予PWM信号来控制速度。另外,我们还可以编写函数来控制小车后退、左转、右转等动作。 除了基本的运动控制外,我们还可以为小车添加传感器和避障功能。例如,我们可以添加红外避障传感器,当检测到障碍物时,自动停止或改变方向。我们还可以添加超声波传感器,用于检测前方距离,避免与前方障碍物碰撞。 在编写小车驱动程序时,我们需要考虑定时器的使用。通过设置定时器,我们可以定时中断程序,以达到控制小车运动的目的。例如,我们可以使用定时器来控制小车的前进时间和速度,达到精确控制的效果。 总之,MCU C51单片机可以用于控制小车驱动程序。通过编写适当的代码,我们可以实现小车的各种运动功能,并且可以根据需要添加传感器和避障功能,提高小车的智能性和安全性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值