基于51单片机和L298N的小车制作(一)

2023-05-16

到目前为止, 总算把51单片机过了一遍, 本来暑假就要完成的任务一直拖到了现在。  51学完, 就想着先做点东西, 就从小车开始。

     玩小车最重要的是什么? 电机。这个就不用多解释了。 从今天早上开始到现在 总算是知道点皮毛了。 因为有学长做过这东西, 所以做起来也有大概的方向  知道是要搞哪些东西。 现在主要是L298N电机驱动和PWM脉冲控制。  

什么是L298N电机驱动? 什么是PWM脉冲?

一开始我一无所知, 实验室里面有L298N驱动 但是我只知道它是L298N驱动, 对于怎么使用却是一点也不知道。 在网上找教程, 淘宝上找资料; 挣扎了一个上午总算是知道了L298N驱动怎么使用, 相应I/O口的含义以及用途。  给一个传送门:我是L298N驱动资料地址。 

那什么是PWM呢? PWM是脉冲宽度调制, 在电机方面主要是通过改变占空比来改变电机的转速, 从而实现加速、减速、转弯等基本功能。 什么是占空比? 占空比指的是一个周期内, 高电平占这个周期的比例。  占空比越高, 电压输出就越高, 电机转动的就越快。

在飞思卡尔、stm32 等芯片中有专门的模块用来控制PWM, 但是在51单片机中则没有, 所以需要用到内部的定时器来实现, 相对来说比较麻烦。 关于51单片机输出PWM波可以参考一下这篇文章:如果利用51单片机输出PWM波。 我感觉这个网站对现在我也挺好的。

代码部分:

程序一: 通过P2^0和P2^1口来控制电机的转动, 通过按键来控制电机转动的快慢。

# include <reg52.h>

typedef unsigned int u16;
typedef unsigned char u8;

sbit PWM1 = P2^0;		 
sbit PWM2 = P2^1;
sbit key_add = P3^2;
sbit key_less = P3^3;

u16 count = 50, time;

void init0()
{
	TMOD = 0x01; 	// 方式一
	TH0 = (65536 - 10)/256;		// 赋初值
	TL0 = (65536 - 10)%256;
	TR0 = 1;       // 开启定时器0
	EA = 1;		   // 开启总中断
	ET0 = 1;       // 定时器0允许中断
}
void delayms(u16 z)   // 延迟函数 
{
	u16 i, j;
	for (i = z; i > 0; i--)
		for (j = 110; j > 0; j--);
}
void speed_add()     // 加速函数
{
	if (key_add == 0)
	{
		delayms(2);
		if (key_add == 0)
		{
			count += 5;  // 通过改变占空比来进行加速
		}
		while (!key_add);
	}
}
void speed_less()	//减速函数 
{
	if (key_less == 0)
	{
		delayms(2);
		if (key_less == 0)
		{
			count -= 5;
		}
		while (!key_less);
	}
}  
int main (void)
{
	init0();
	while (1)
	{
		speed_add();
		speed_less();	
	}
	return 0;
}
void T0_inter() interrupt 1
{
	TR0 = 0;
	TH0 = (65536 - 10)/256;
	TL0 = (65536 - 10)%256;
	TR0 = 1;
	

	PWM1 = 0;
	time ++ ;
	if (time < count)	// 因为总数是100, 所以可以直接看出占空比是多少。
	{
		PWM2 = 1;
	}
	else
	{
		PWM2 = 0;
	}
	if (time >= 100)
	{
		time = 0;
	}
}

程序二:

#include<reg52.h>
 
#define uint unsigned int
#define uchar unsigned char
 
uchar time,count=50,flag=1;//低电平的占空比
 
sbit PWM1=P2^0;//PWM 通道 1
sbit PWM2=P2^1;//PWM 通道 2
sbit key_turn=P3^3; //电机换向
 

void delayxms(uint z);
void Motor_turn(void);
void timer0_init(void);
 

void main(void)
{
	timer0_init();
	while(1)
	{
		Motor_turn();
    }
} 

void delayxms(uint z)//延时xms程序
{
    uint x,y;
        for(y=z;x>0;x--)
               for(y=110;y>0;y--);
}
 
/***电机正反向控制****/
void Motor_turn(void)
{
	if(key_turn==0)
	{
		delayxms(2);//此处时间不能太长,否者会的中断产生冲突
		if(key_turn==0)
		{
			flag=~flag;
		}
		while(!key_turn);
	}
}
 
/***********定时器0初始化***********/
void timer0_init(void)
{
    TMOD=0x01; //定时器0工作于方式1
    TH0=(65536-10)/256;		// 赋初值
    TL0=(65536-10)%256;
    TR0=1;					 // 开启定时器
    ET0=1;					 // 允许定时器0中断
	EA=1;					 // 开启总中断
}
 
/**************定时0中断处理******************/
void timer0_int(void) interrupt 1
{
	TR0=0;//设置定时器初值期间,关闭定时器
    TH0=(65536-10)/256;
    TL0=(65536-10)%256;
    TR0=1;
    if(flag==1)//电机正转
    {
    	PWM1=0;
		time++;
        if(time<count)	//占空比
        {
        	PWM2=1;
        }
        else
        {
			PWM2=0;
       	}
        if(time>=100)
        {
        	time=0;
        }
	}
    else //电机反转
    {
    	PWM2=0;
        time++;
        if(time<count)
        {
        	PWM1=1;
        }
        else
		{
        	PWM1=0;
		}
        if(time>=100)
        {
        	time=0;
        }
	}
}


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于51单片机和L298N的小车制作(一) 的相关文章

  • 学习open62541 --- [70] 深入理解变量监测

    本文深入探讨一下变量监测的用法和原理 一 累积传输 先前写的关于变量监测的文章 xff0c 都是设置一个采样时间 xff0c 然后有变化了就通知一下 xff0c 有时我们希望变化累积一段时间再一起传给client xff0c 这时如何设置呢
  • 学习CANopen --- [8] 多主机同时运行时的问题

    本文记录一下实际使用CANopen时开启多个主机遇到的问题 一 问题描述 本人在嵌入式设备上用Python CANopen库写一个SDO xff0c 由于数据比较多 xff0c 就使用了Segment download xff0c 大概需要
  • 学习CANopen --- [9] CAN总线的状态检查

    本文讲述如何判断CAN总线是否存在以及是否bus off xff0c 以vcan0进行讲解 xff0c vcan0是虚拟的CAN接口 xff0c 可以把它看做一个软件CAN适配器 xff08 区别于硬件CAN适配器 xff0c 如PeakC
  • 学习CANopen --- [10] 汽车外接OBD模块原理

    在某宝上搜索汽车OBD xff0c 可以发现很多卖OBD模块的 xff0c 通过接入OBD模块可以增加车子本身没有的功能 xff0c 如锁车升窗 xff0c 行车自动落锁和后视镜折叠等 xff0c 那么其实现原理是什么呢 xff1f 使用时
  • 学习open62541 --- [72] client删除subscription时的warning

    本文记录一个问题的理解过程 xff0c 试验条件 xff1a 使用open62541运行server使用asyncua运行clientclient会向server添加subscription xff0c 然后在断开连接前删除subscrip
  • 启明欣欣STM32开发板闪烁LED实验

    最近在咸鱼上买了一块启明欣欣的STM32板子 xff0c 准备在上面测试open62541和CANopen xff0c 到货后如下图 xff0c 找商家要了资料 xff0c 然后运行一个LED灯的实验来简单测试下板子 xff0c 本文记录一
  • Python fpdf2生成表格

    fpdf2库可以用来生成pdf文档 xff0c 该库是从fpdf库fork来的 xff0c 老库自2018年就不再更新维护了 xff0c fpdf2对用户更友好 xff0c api也更方便使用 一 fpdf2介绍 其网址是https pyf
  • Android动态分析工具-Inspeckage

    1 Inspeckage简介 Inspeckage是一个用来动态分析安卓app的xposed模块 Inspeckage对动态分析很多常用的功能进行了汇总并且内建一个webserver 整个分析操作可以在友好的界面环境中进行 2 下载地址 I
  • 行为树 --- [7] BehaviorTree.CPP 4.x版本的编译及使用

    根据BehaviorTree CPP的官方介绍 xff0c 3 x版本已经不再维护了 xff0c 建议使用4 x版本 xff0c 4 x版本和3 x版本的区别可以看这里 https www behaviortree dev migratio
  • OPC UA性能评估

    本文是对这篇论文的总结 xff0c 该文章从性能和资源使用方面比较了工业4 0的4个主要协议 xff1a OPC UA xff0c DDS xff0c ROS和MQTT 这4个协议都是基于以太网 xff08 Ethernet based x
  • 学习open62541 --- [73] 数据源造成无法监测变量的问题解决

    本人最近遇到一个问题 xff1a 给一个变量添加数据源后 xff0c 使用监测项去监测变量变化 xff0c 如果采样时间为0 xff0c 会发现无法监测到变量的变化 本文讲述这种情况的发生原因以及解决办法 一 Server例子 首先准备se
  • 启明欣欣STM32开发板移植FreeRTOS

    承接这篇文章 xff0c 本篇讲述如何把FreeRTOS移植到启明欣欣STM32开发板里 xff0c 比较简单 xff0c 网上也有各种教程 xff0c 本文也是参考其它文章 xff0c 这里再记录一下 一 搭建基础工程 启明欣欣STM32
  • 学习open62541 --- [74] 软链接的妙用

    一 原理 在同一台电脑里 xff0c 可能会有多个工程同时用到open62541 xff0c 比较简单的办法是每个工程都拷贝一份open62541源码 xff0c 但是这样会造成空间浪费 xff0c 而且open62541的源码包本身也不小
  • 学习open62541 --- [75] 生成namespace文件的简便方法

    在之前的文章中 xff0c 生成namespace文件是使用open62541提供的nodeset compiler py xff0c 根据nodeset compiler rst xff08 位于open62541 doc xff09 里
  • 启明欣欣STM32开发板 --- 运行LWIP (无RTOS)

    最近体验了一下CubeMX xff0c 发现真的是非常好用 xff0c 里面使用了ST自家的HAL库 xff0c 这应该是ST的策略 xff0c 为了绑定客户 本文讲述使用CubeMX生成LWIP的Keil工程并在启明欣欣板子上运行 xff
  • 启明欣欣STM32开发板 --- 运行LWIP (使用FreeRtos)

    在上篇文章中 xff0c 我们生成了不带RTOS的LWIP工程 xff0c 本篇讲述如何生成带RTOS的LWIP工程 xff0c RTOS选择FreeRtos xff0c CubeMX工程以上篇文章中的工程为基础 文章目录 一 使能Free
  • python http 身份认证简介

    目录 授权方式简介 1 Basic Authentication 2 OAuth 3 Token Authentication 4 Digest Authentication xff08 重点说一下 xff09 代码实现 1 基本身份认证
  • 记录VScode调试过慢的问题

    目录 问题 xff1a 解决方案 xff1a 0806更新报错 问题 xff1a 最近在使用VScode的过程中调试慢到让人接受不了 xff0c 遂寻找解决方案 xff0c 重装VScode 在网上找了好多答案 xff0c 尝试后均无法解决
  • Android APP漏洞自动化静态扫描检测工具-Qark环境搭建与使用

    QARK 1 qark简介 LinkedIn最近开源了他的静态分析工具QARK xff0c 该工具用于分析那些用Java语言开发的Android应用中的潜在安全缺陷 QARK 全称 Quick Android Review Kit 这个工具
  • QT中CMakeLists添加第三方库

    1 新建项目 xff0c 打开CMakeLists txt文件 cmake minimum required VERSION 2 8 project fp test cm 括号内fp test cm为项目名称 add executable

随机推荐

  • Linux下curl模拟带header的Http请求

    格式 xff1a curl H 头部内容 http xxx 123 com curl span class hljs attribute H span span class hljs string 34 Accept text html a
  • 中断与查询方式的比较

    单片机在操作外部设备时 xff0c 常用的有中断和查询两种方式 除了在编程方面的区别外 xff0c 在性能和效率上都是有所区别 中断的性能要比查询强大 xff0c 反应速度快 xff0c 要求相应的ISR不能过于繁琐 xff0c 而且要求电
  • 解决nodejs报错TypeError: ParserIncomingMessage is not a constructor.

    当前最新的 node v8 12 v10 11 在 http模块里有一个bug bug报错如下 xff1a TypeError ParserIncomingMessage is not a constructor at HTTPParser
  • 串口通信基础知识(UART)

    目录 一 串口通信的具体分类 xff1a 二 常见的串行通信接口简介 xff1a 三 具体通信标准的实现 xff1a 1 UART xff08 通用异步收发传输器 xff09 xff1a 一 串口通信的具体分类 xff1a 总结一下 xff
  • ++声明、定义、类的定义、头文件作用、头文件重复引用

    转载至 xff1a 点击打开链接 C 43 43 声明 定义 类的定义 头文件作用 头文件重复引用 xff0c 不具名空间 转自 xff1a http www cnblogs com rocketfan archive 2009 10 02
  • 三维旋转矩阵;东北天坐标系(ENU);地心地固坐标系(ECEF);大地坐标系(Geodetic);经纬度对应圆弧距离

    目录 TOC自动生成 旋转矩阵东北天 站心坐标系地心坐标系参考文献 旋转矩阵 Givens rotation 逆时针 Jacobi rotation 顺时针 箭头朝里朝外 xff0c 顺时针 逆时针 xff0c 61 61 旋转角的正负 6
  • libcurl进行异步并发

    libcurl的easy 接口 xff0c easy接口的使用非常的简单 xff0c curl easy init用来初始化一个easy curl对象 xff0c curl easy setopt对easy curl对象进行相关设置 xff
  • unbuntu运行VINS-MONO实验总结

    ubuntu16 04运行VINS ONO实验总结 初探 简介1 环境配置2 运行Euroc数据集 xff13 小觅摄像头运行vins mono 简介 VINS Mono是香港科技大学沈劭劼团队开源的单目视觉惯导SLAM方案 前端KLT稀疏
  • 电子硬件3.杜邦线

    杜邦线是常用于电路连接的导线 xff0c 能够刚好插在常用的2 54mm间距的排针上 杜邦线的三种类型为 xff1a 公公线 公母线 母母线
  • Android应用安全检测工具简介

    Android应用安全检测工具简介 1 测试工具集 Appie 轻量级的软件包 可以用来进行基于Android的渗透测试 不想使用VM的时候可以尝试一下 Android Tamer 可以实时监控的虚拟环境 可以用来进行一系列的安全测试 恶意
  • C语言浮点型数据存储结构

    1 float类型 float类型占四个字节 xff0c 每个字节占8位 xff0c 总共32位 xff0c 其内存结构如下图 xff1a 31位为符号位 xff1a 0表示正数 xff0c 1表示负数 31 23位 xff1a 共8位表示
  • sockaddr和sockaddr_in详解

    struct sockaddr和struct sockaddr in这两个结构体用来处理网络通信的地址 一 sockaddr sockaddr在头文件 include lt sys socket h gt 中定义 xff0c sockadd
  • python requests模拟登陆带验证码的网站

    作为之前专利爬虫的续篇 xff0c 本篇准备描述如何通过python的requests模块登录专利查询网站 环境准备 python 3 6requests chrome尝试 首先 xff0c 我们使用chrome尝试登录专利网站 xff0c
  • 兔子与兔子(下一篇解释原理:字符串哈希)

    文章目录 兔子与兔子题目描述解题思路 兔子与兔子 题目描述 很久很久以前 xff0c 森林里住着一群兔子 有一天 xff0c 兔子们想要研究自己的 DNA 序列 我们首先选取一个好长好长的 DNA 序列 xff08 小兔子是外星生物 xff
  • 机器学习(二)--- KNN(K-Nearest Neighbors)

    KNN K Nearest Neighbors 简单类比 xff08 Simple Analogy xff09 KNN xff1a 通过你周围的人来判断你是哪一类人 Tell me about your friends who your n
  • 机器学习(三) --- DT(Decision Tree)

    文章目录 Decision TreeIntroductionConstructing Decision Treesexample Pruning决策树 随机森林和Gradient BoostingReference xff1a Decisi
  • 3D点云资料(笔记自用)

    数据集 xff1a Pointnet Pointnet2 pytorch Pointnet语义分割任务S3DIS数据集上的注意点 dataset ShapeNet简介及认识 文件格式 PCD格式 目标检测标注工具 标注工具windows安装
  • 用指针给数组赋值的一个小问题

    问题是这样的 xff0c 我打算输入与元素为数组赋值 xff0c 然后反向输出数组元素 include lt stdio h gt int main void int a 10 p 61 a i for i 61 0 i lt 10 i 4
  • 51之中断

    51单片机的中断系统 选用的单片机型号是 xff1a HC6800 ES V2 0 一 中断的概念 CPU在处理某一事件A时 xff0c 发生了另一事件B请求CPU迅速去处理 xff08 中断发生 xff09 xff1b CPU暂时中断当前
  • 基于51单片机和L298N的小车制作(一)

    到目前为止 xff0c 总算把51单片机过了一遍 xff0c 本来暑假就要完成的任务一直拖到了现在 51学完 xff0c 就想着先做点东西 xff0c 就从小车开始 玩小车最重要的是什么 xff1f 电机 这个就不用多解释了 从今天早上开始