📢:如果你也对机器人、人工智能感兴趣,看来我们志同道合✨
📢:不妨浏览一下我的博客主页【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 ();
}
}