【SOC基础】单片机学习案例汇总 Part1:电机驱动、点亮LED

news2024/11/16 19:45:38

📢:如果你也对机器人、人工智能感兴趣,看来我们志同道合✨
📢:不妨浏览一下我的博客主页【https://blog.csdn.net/weixin_51244852】
📢:文章若有幸对你有帮助,可点赞 👍 收藏 ⭐不迷路🙉
📢:内容若有错误,敬请留言 📝指正!原创文,转载请注明出处

文章目录

  • 一、驱动电机
    • 1.1 直流电机介绍
    • 1.2 电机驱动代码
    • 1.3 变速控制电机驱动
  • 二、点亮LED
    • 2.1 LED介绍
    • 2.2 案例1:点亮一个LED
    • 案例2:流水灯
    • 案例3:按键点亮LED
    • 案例4:跑马灯效果实现


一、驱动电机

1.1 直流电机介绍

直流电机介绍:一种将电能和机械能互相转换的装置。一般直流电机有两极,当电极正接时,电机正转;电极反接,电机反转。
直流电机组成:永磁体(定子)、线圈(转子)和换向器。定子的主要作用是产生磁场。转子的主要作用是产生电磁转矩和感应电动势。

在这里插入图片描述
驱动芯片介绍:如果直接使用芯片的GPIO管脚去驱动大功率器件(继电器、LED等),要么将芯片烧坏,要么就驱动不起来。开发板上板载的驱动芯片是ULN2003,该芯片是一个单片高电压、高电流的达林顿晶体管阵列集成电路,可以用来驱动直流电机。
在这里插入图片描述
从上图可知,ULN2003的输入口与单片机的P1.0-P1.3连接,对应输出则是OUT1-OUT4,而J47则是提供给外部连接电机的接口,可以支持直流电机、五线四相步进电机28BYJ-48连接。本实验使用的是直流电机,电机的一根线连接在VCC上,另一根连接在OUT1上,因此可通过单片机P1.0口输出高电平来控制电机旋转,OUT1输出低电源控制电机停止。注意:单片机P1.0输出低电平时,ULN2003的OUT1并不会输出高电平导致停止,而是因为集电极开路,导致电机无电流流入致使停止。

1.2 电机驱动代码

控制直流电机驱动的代码:

#include <REGX52.H>
sbit Motor = P1^0;
void main()
{
    Motor = 1;
}

在这里插入图片描述

1.3 变速控制电机驱动

步进电机的介绍:除了直流电机外还有步进电机、舵机、无刷电机、空心杯电机等。步进电机是将电脉冲信号转换为角位移或是线位移的开环控制单元。
PWM介绍:PWM是Pulse Width Modulation的缩写,即脉冲宽度调制,简称脉宽调制。在具有惯性的系统中,可以用过对一系列脉冲的宽度进行调制,来等效获得所需要的模拟参数,常用于电机空速、开关电源等领域。
PWM重要参数:
1.频率(1/T,T指的是一个周期的时间)
2.占空比(开启时间/总时间,或是开始时间/关闭时间),占空比其实就是一个周期内高电平时间与周期的比值。占空比注意是开启时间与一个周期时间的比值。
3.精度
产生PWM的方法

在这里插入图片描述
通过改变比较值的大小进而改变占空比。比较值越大,低电平就会占比越大,占空比越低,导致LED等会比较亮(LED是给高电平会亮)。
通过PWM以及按键控制电机变速运转
ULN2003芯片介绍其实就是用为将低电流转换为高电流、低电压转换为高电压的作用。

二、点亮LED

2.1 LED介绍

中文名:发光二极管
外文名:light emitting diode,简称:LED

具有单向导电性,一般我们控制在3mA-20mA。通常我们会在LED管脚上串联一个电阻,目的就是为了限制通过发光二极管的电流不要太大,因此这些电阻又可以称为“限流电阻”。直插式发光二极管长脚为阳极,短脚为阴极。电流只能从阳极流向阴极。

2.2 案例1:点亮一个LED

由于单片机是TTL电平,因此高电平是+5V,低电平是0V。因此控制一个LED灯的亮灭就是控制负极的电平即可。通过如下的LED电路图可知,要让LED发光即对应的阴极管脚应该为低电平,若为高电平则熄灭。
在这里插入图片描述
按键介绍:按下按键就会导通开关,相当于一根导线(低电平),当松手时开关断开(由于存在上拉电阻,所以自然状态下是高电平)
按键抖动现象:由于机械点的弹性作用,按键开关在闭合时不会马上稳定的接通,在断开时也不会一下子断开,因而在闭合和断开的瞬间均伴随着一连串的抖动。抖动时间的长短由按键的机械特性决定的,一般为5ms到10ms。
按键消抖方式:为了确保CPU对按键的一次闭合仅作一次处理,必须进行消抖。
一种是硬件消抖,另一种是软件消抖。为了使电路更加简单,通常采用软件消抖,一般来说一个简单的按键消抖就是先读取按键的状态,如果得到按键按下之后,延时10ms,再次读取按键的状态,如果按键还是按下状态,那么说明按键已经按下。其中延时10ms就是软件消抖处理。

在这里插入图片描述

按键电路是如何工作的?
按下就是一根导线一样,直接接地,也就是低电平;不按下的时候因为存在上拉电阻,存在电压差,因此是高电平。
(由于开发板IO都有上拉电阻,所以默认IO为高电平)
独立按键电路构成是由各个按键的一个管脚连接在一起接地,按键其他引脚分别接到单片机IO口。
单片机的IO口既可作为输出也可作为输入使用,当检测按键时用的是它的输入功能,独立按键的一端接地,另一端与单片机的I/O口相连,开始时先给该IO口赋一高电平,然后让单片机不断地检测该I/O口是否变为低电平,当按键闭合时,即相当于该I/O口通过按键与地相连,变成低电平,程序一旦检测到I/O口变为低电平则说明按键被按下,然后执行相应的指令。
在这里插入图片描述

程序代码

#include "reg52.h"
typedef unsigned char u8;
typedef unsigned int u16;

sbit LED1=P2^0;

void delay_10us(u16 ten_us)//当传入Ten_us=1时,大约延时10us
{
	while (ten_us--);
}	
void main (
{
	while(1)
	{
		LED1=0;//点亮
		delay_10us ( 50000) ;//大约488msLED1=i;//熄灭
		delay_10us (50000) ;
	}
}

1s=1000ms;1ms=100us。输入1时,等于10微妙。
Typedef 用于重定义数据类型名称

案例2:流水灯

什么是流水灯?流水灯的本质其实就是多个灯间隔一定时间依此亮灭,像水流一样。
流水灯的不同8个状态:
第1个状态等于0x80(10000000),
第2个状态等于0x40(01000000),
第3个状态等于0x20(00100000),
第4个状态等于0x10(00010000),
第5个状态等于0x08(00001000),
第6个状态等于0x04(00000100),
第7个状态等于0x02(00000010),
第8个状态等于0x01(00000001),
延时时间越长流水灯就流的越慢,越短就流水越快。
如何实现流水灯?
8个状态一次执行,完成后从头开始,其实就是一个循环。下面以两个
实现流水灯的代码:
第一种:功能实现了,但是写的太笨了,如果状态变多程序就会更长。

While(1{
	P0=0x80;
	delay();
	P0=0x40;
	delay();
	P0=0x20;
	delay();
	P0=0x10;
	delay();
}

第二种:改进思路:通过变量运算来得到合适的端口输出值
(1)首先定义变量unsigned char a,初值等于0x80(10000000)
(2)8个状态,其实就是a依次右移0-7位
(3)相当于是用C语言让单片机自己去运算得到每个状态的端口值,而不用自己事先去计算好。这样程序就简化了。

#include "reg52.h"
typedef unsigned char u8;
typedef unsigned int u16:
define LED_PORT  P2//使用宏定义将P2端口定义。
void delay_10us (u16 ten_us)//当传入Ten_us=1时,大的延时10t
{
	while(ten_ua--) :
}
void main()
{
	uB i=0;
	while(l)
		{
			for(i=0;i<8;i++)
			{
				LED_PORT=~(0x01<<2);
				delay_10us(5000);
			}
		}
}	

上图中的是左移,也可以右移,就不需要加取反的符号。

案例3:按键点亮LED

使用按键控制LED的亮灭,通过开发板上的独立按键K1控制D1指示灯亮灭。

#include <REGX52.H>
sbit LED1=P2^0;
sbit KEY1 =P3^0;
void main()
{
    if(KEY1==0)
{
LED1=0;
}
else
{
LED1=1;
}
}

案例4:跑马灯效果实现

什么是跑马灯?跑马灯和流水灯非常像,不同的是:流水灯是8颗LED其中7灭1亮,亮的在移动;跑马灯是8颗LED7亮1灭,灭的在移动。
实现思路分析
01111111 0x7f 10000000
10111111 0xbf 01000000
11011111 0xdf 00100000

(1)编程实现跑马灯,必须用到C语言的2种技巧:左移(右移)、按位取反
(2)C语言中~这个符号表示对一个数字按位取反,譬如一个数01111111按位取反后变成了10000000。而11011111按位取反后变成了00100000

void main (void)
{
	unsigned char i =0;//i控制循环次
	while (1)
	{
		unsigned char d = 0x80;//端口值
		for (i=0; i<8; i++)
			{
				PO = ~d;//d按位取反后0端口
				d >>=1;
				delay ();
			}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1156260.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

mybatisplus 增删改查

文章目录 1.BaseMapperBaseMapper中提供的CRUD方法&#xff1a; CURD实例通用ServiceIService中的CRUD方法 Service层操作数据实例 1.BaseMapper 说明: 通用 CRUD 封装BaseMapper 接口&#xff0c;为 Mybatis-Plus 启动时自动解析实体表关系映射转换为 Mybatis 内部对象注入容器…

集成测试、单元测试、系统测试之间的关系和区别

前言 为了使软件正常工作&#xff0c;所有单元都应集成在一起并正常运行。集成测试就像是要求不同工种的工人修建一个房子&#xff0c;希望他们都团结协作。如何判断他们在一起是否可以按照计划完成建设呢&#xff1f;唯一了解的方法是通过将它们全部拉在一起并测试它们如何相互…

写时拷贝+进程终止

目录 一、写时拷贝 二、创建多进程 三、进程终止 &#xff08;一&#xff09;main函数的返回值 1. main函数的返回值 2. 退出码 3. 查看进程的退出码 &#xff08;二&#xff09;错误码VS退出码 &#xff08;三&#xff09;代码异常终止 1. 基本概念 2. 信号 &…

Visual Studio 2022打不开net4.5项目的解决方案

1 问题 是因为你本机没有装相关的netframework的包&#xff0c;具体文件夹的路径在&#xff1a; C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework 如下图&#xff1a; 进入目录看&#xff0c;我的net4.5.2是空的&#xff0c;如下图&#xf…

jsp 网上订餐Myeclipse开发mysql数据库web结构java编程计算机网页项目

选题目的 本设计课题为网上订餐系统设计与实现&#xff0c;提供无纸化点餐、支付&#xff0c;实现点餐快捷&#xff0c;方便管理。餐厅电子化是目前的潮流和趋势&#xff0c;大多数企业都将公司内部运营流程电子化。网上订餐管理系统应运而生&#xff0c;能够有效提高公司的管…

【干货】<img/>加载成功||失败

功能描述 img标签绑定URL时&#xff0c;图片加载会出现如下情况&#xff1a; 加载成功展示url加载失败显示默认图片&#xff08;require(/assets/images/imgError.png)&#xff09; dom代码 <img :src"url" alt"" error"errorImageShow($even…

第57篇-某钩招聘网站加密参数分析【2023-10-31】

声明:该专栏涉及的所有案例均为学习使用,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关!如有侵权,请私信联系本人删帖! 文章目录 一、前言二、网站分析1.X-S-HEADER参数2.请求参数data3.响应机密值data一、前言 网址: aHR0cHM6Ly93d3cubGFnb3UuY29t…

优化 FPGA HLS 设计

优化 FPGA HLS 设计 用工具用 C 生成 RTL 的代码基本不可读。以下是如何在不更改任何 RTL 的情况下提高设计性能。 介绍 高级设计能够以简洁的方式捕获设计&#xff0c;从而减少错误并更容易调试。然而&#xff0c;经常出现的问题是性能权衡。在高度复杂的 FPGA 设计中实现高性…

【element-ui】表格

效果展示 组件代码 <el-table class"compTableClass" ref"tableOOOOO":class"(className in tableConfig)?tableConfig.className:":data"tableConfig.data" :height"tableConfig.height" style"width: 100%"…

【ES专题】ElasticSearch 高级查询语法Query DSL实战

目录 前言阅读对象阅读导航前置知识数据准备笔记正文一、ES高级查询Query DSL1.1 基本介绍1.2 简单查询之——match-all&#xff08;匹配所有&#xff09;1.2.1 返回源数据_source1.2.2 返回指定条数size1.2.3 分页查询from&size1.2.4 指定字段排序sort 1.3 简单查询之——…

CUMT-----Java课后第三章编程作业

文章目录 一、题11.1 题目描述1.2 代码块1.3 运行截图 二、题22.1 题目描述2.2 代码块2.3 运行截图 一、题1 1.1 题目描述 1.2 代码块 public class Book {private String name;private int pages;public String getname(){return name;}public void setname(String name){th…

HarmonyOS(二)—— 初识ArkTS开发语言(上)之TypeScript入门

前言 Mozilla创造了JS&#xff0c;Microsoft创建了TS&#xff0c;而Huawei进一步推出了ArkTS。因此在学习使用ArkTS前&#xff0c;需要掌握基本的TS开发技能。 ArkTS介绍 ArkTS是HarmonyOS优选的主力应用开发语言。它在TypeScript&#xff08;简称TS&#xff09;的基础上&am…

网络安全安全领域最容易搞混的四个名词:Network网络安全、Cyber网络安全、数据安全、信息安全

在安全领域我们经常会遇到Network网络安全、Cyber网络安全、数据安全、信息安全&#xff0c;它们看起来都差不多&#xff0c;那么它们之间有什么区别呢&#xff1f; 如果你对网络安全入门感兴趣&#xff0c;那么你需要的话可以点击这里&#x1f449;【入门&进阶全套282G学…

基于PyTorch的共享单车使用数量预测研究

收藏和点赞&#xff0c;您的关注是我创作的动力 文章目录 概要 一、预测模型的实现3.1数据的获取和预处理3.2划分数据集3.3构建神经网络 二、PyTorch框架三 原理2.1前馈神经网络2.1.1 BP神经网络 四 预测效果验证4.1小批量梯度下降4.2批量梯度下降4.3随机梯度下降 五 结 论目录…

javascript的webstorage数据存储问题,不能直接存undefined

这篇文章分享一下自己使用sessionStorage遇到的一个小问题&#xff0c;以后遇到要避坑。 需求是easyui表格的单元格编辑&#xff0c;点击保存的时候会结束当前行的编辑&#xff0c;然后修改editingId&#xff08;当前编辑行记录的ID&#xff09;。 目录 一、待解决问题 二、完…

CN考研真题知识点二轮归纳(3)

持续更新&#xff0c;上期目录&#xff1a; CN考研真题知识点二轮归纳&#xff08;2&#xff09;https://blog.csdn.net/jsl123x/article/details/134111760?spm1001.2014.3001.5501 1.TCP/IP 名称&#xff1a;传输控制协议/网络协议&#xff0c;是一个协议族&#xff0c;主…

机器人仿真——gazebo学习笔记(0)

Gazebo是一个功能强大的三维物理仿真平台&#xff0c;具有强大的物理引擎、高质量的图形渲染能力、重点是他是开源的、免费的。 1.Gazebo具备以下几个特点: 1.动力学仿真:支持多种高性能物理引擎,像ODE、Bullet等. 2.三维可视化环境:x、y、z三维环境。 3.传感器仿真:支持传…

【MATLAB】全网唯一的13种信号分解+FFT傅里叶频谱变换联合算法全家桶

有意向获取代码&#xff0c;请转文末观看代码获取方式~ 大家吃一顿火锅的价格便可以拥有13种信号分解FFT傅里叶频谱变换联合算法&#xff0c;绝对不亏&#xff0c;知识付费是现今时代的趋势&#xff0c;而且都是我精心制作的教程&#xff0c;有问题可随时反馈~也可单独获取某一…

数据仓库-拉链表

在数据仓库中制作拉链表&#xff0c;可以按照以下步骤进行&#xff1a; 确定需求&#xff1a;首先明确需要使用拉链表的场景和需求。例如&#xff0c;可能需要记录历史数据的变化&#xff0c;以便进行时间序列分析等。设计表结构&#xff1a;在数据仓库中&#xff0c;拉链表通…

uniapp 使用 UDP

一、搭建UDP服务端&#xff0c;nodejs const dgram require("dgram");const message Buffer.from("你好&#xff0c;这是一个UDP广播消息"); const port 3000; // 用你想要的端口替换这里// 创建一个UDP套接字 const socket dgram.createSocket("…