前言
大家好吖,欢迎来到 YY 滴单片机 系列 ,热烈欢迎! 本章主要内容面向接触过单片机的老铁
主要内容含:
欢迎订阅 YY滴C++专栏!更多干货持续更新!以下是传送门!
目录
- 一.前置操作
-
- 1.LED数码管介绍
- 2.位选的基本概念
- [3. 1位数码管的引脚(10个)定义(应用【位选】概念)](#3. 1位数码管的引脚(10个)定义(应用【位选】概念))
- [4. 4位1体数码管的引脚(12个)定义](#4. 4位1体数码管的引脚(12个)定义)
- 5.138译码器
- 6.74HC245芯片(双向数据缓冲器)
-
- (6.1)74HC245芯片的作用
- (6.2)74HC245芯片的使能端【OE(LE)引脚】
- (6.2)74HC245芯片的方向选择端【DIR引脚】
-
- (6.2.1)[J21跳线帽]
- [(6.2.2) 数码管模块为什么要加上74HC245芯片?](#(6.2.2) 数码管模块为什么要加上74HC245芯片?)
- 7.104电容
- [8. 4位1体排阻部分(限流电阻)](#8. 4位1体排阻部分(限流电阻))
- 二.基本的静态数码管显示
- 三.自定义的静态数码管显示(代码演示)
- 四.自定义的动态数码管显示
一.前置操作
1.LED数码管介绍
2.位选的基本概念
- 在单片机中,位选通常指的是选择特定的寄存器位或者特定的位操作。单片机中的寄存器通常是一个二进制数,每一位都代表一个特定的状态或者功能。当进行位选时,我们通常是指通过编程来选择特定的寄存器位,或者对特定的寄存器位进行操作,比如置位(设置为1)或者清零(设置为0)。这种操作可以用来控制单片机的各种功能,比如控制输入输出、控制器件的工作状态等。
3. 1位数码管的引脚(10个)定义(应用【位选】概念)
- 1位数码管
- 两种连接方式:共阴极链接,共阳极链接
- 【3,8引脚】事实上是同一个引脚,引出来两根,可以接正也可以接负
- 数码管的链接实际上符合:就近原则
- 例:我们要展示数字6,用共阴极的LED:
- 位选3,8译码器为0或者低电平
- 对应设置A,B,C,D,E,F,G,DP的L口(即7 6 4 2 1 9 10 5)
- 如图所示
1011 1110
就是这个LED的段码
4. 4位1体数码管的引脚(12个)定义
- 4位1体数码管
- 分成4个小的单元,各自小的单元的公共端各自独立(图中12,9,8,6引脚)
- 剩余位选端为(10 7 4 2 1 10 5 3)
- 例:我们要展示第三个LED的数字1,用共阴极的LED:
- 位选8为0或者低电平,【12,9,6】为1
- 对应设置A,B,C,D,E,F,G,DP的L口(即11 7 4 2 1 19 5 3)
- 如图所示
1001 1111
就是这个LED的段码
5.138译码器
(5.1)138译码器的作用
- 138译码器可以用于选择某个特定的输出端
- 通常被用于将输入的二进制数据转换成对应的输出信号。它通常有三个输入端和八个输出端。输入端通常是三位二进制数据,而输出端则对应着八种可能的组合。138译码器的作用是将特定的输入编码转换成相应的输出信号,从而实现特定的逻辑功能或控制。
(5.2)138译码器的使能端
- 使能端:"使能端"是指在数字电路或者数字系统中用来启用或者禁用某种功能或操作的输入端口。当使能端为有效状态 时,相应的功能或操作会被激活或者允许执行;而当使能端为无效状态时,相应的功能或操作会被禁用或者停止执行。、
- 如下图所示,138译码器中的使能端
- 必须6号引脚接1 ; 4号五号引脚接0,元器件才能工作
- 实际中并不需要管它,因为其上电就工作
(5.3)138译码器的输出端
- 我们观察输出端的Y0~Y7
- 上方有横线,代表低电平有效------即此时LED亮,位选为0;
- 我们查看开发板图,发现:LED1~8接到的是138译码器的输出端
(5.4)138译码器的输入端
- 输入端C->B->A,从左到右:高位到低位,表示一个二进制数
- 这个2进制是n,就代表Yn有效
- 有效:上方有横线,代表低电平有效------即此时LED亮,位选为0;
- 如果CBA为000,就代表Y0有效,Y0为0
- 接着再找Yn对应的LED
6.74HC245芯片(双向数据缓冲器)
(6.1)74HC245芯片的作用
- 它的作用是允许数据在两个方向上进行传输,同时提供了数据缓冲和隔离的功能,以及 提高驱动能力
- 双向数据缓冲器通常被用于数字系统中,特别是在多个设备或模块之间进行数据传输时。它可以有效地解决数据传输速度不匹配、数据格式不一致以及数据冲突等问题,从而提高了系统的稳定性和可靠性。
(6.2)74HC245芯片的使能端【OE(LE)引脚】
- 如图所示,OE(LE)上方有横线,代表低电平有效
(6.2)74HC245芯片的方向选择端【DIR引脚】
- 英文注释为direction(方向)
- 决定了数据是把左送右边,还是右边读回来
- DIR接 高电平,把数据输送到右边;
- DIR接 低电平,把数据读回左边;
- 如电路图所示:DIR引脚接的是LE引脚,也就是J21跳线帽
- 我们这个静态数码管显示的项目只需要,写数据而不需要读
- 所以LE接高电平即可, 也就是跳线帽链接LE和VCC
(6.2.1)[J21跳线帽]
- 跳线帽是一种用于在电子电路板上进行连接的小组件。它通常由一个塑料外壳和两个金属引脚组成。跳线帽的作用是在电路板上的引脚之间建立连接,从而改变电路的功能或功能
(6.2.2) 数码管模块为什么要加上74HC245芯片?
- 单片机高电平的驱动能力有限,最大电流不能太大
- 单片机低电平的驱动能力强一些(LED采用低电平点亮会更亮一些)
- 所以我们要加上 74HC245芯片(双向数据缓冲器) 提高驱动能力
- 驱动的能力来源------双向数据缓冲器上的电源
7.104电容
- 滤波电容是一种用于电路中的被动元件,其主要作用是在电路中实现 滤波功能。滤波电容可以通过对不同频率的信号进行响应,将高频或低频信号滤除或通过,从而实现对信号的滤波处理
- 作用:用来稳定电源
- 单位:F(法拉)
8. 4位1体排阻部分(限流电阻)
- 四位一体
二.基本的静态数码管显示
- 这次实验:让LED6显示数字6
1.总结步骤:怎么样让某盏灯显示数字
图中以LED4示例
- 控制138译码器的3个口,让其输出口选中对应的LED
- 给P0口一个段码的数据,经过缓冲器,送到公共段码端
2.根据原理图,确定LED第几个亮的位选(注意:数据端位对应端口端位,即高位对高位)
- 因为数据端位对应端口端位,即高位对高位 ;
- 我们要让LED6亮,138译码器需要输入5对应到Y5即
101
;所以反推出我们的位选为P2_2=1;P2_3=0;P2_4=1;
3.根据原理图,确定LED数字的段选(注意:数据端位对应端口端位,即高位对高位)
- 因为数据端位对应端口端位,即高位对高位 ;所以反推出我们的段选为
0111 1101
- 寄存器不支持二进制,所以我们将其转换成十六进制
P0=0x7D;
4.代码演示
- 烧写进单片机步骤详情LED实验烧写部分:传送门
cpp
#include <REGX52.H>
void main()
{
//138译码器
P2_2=1;
P2_3=0;
P2_4=1;
P0=0x7D;
while(1)
{
}
}
- 现象:我们烧写入单片机后,可以发现LED6处出现数字6
三.自定义的静态数码管显示(代码演示)
- 根据数码管段码图,以及while函数,我们进行改装
cpp
#include <REGX52.H>
unsigned char smgduan[17]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,
0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};
void Nixie(unsigned char Location,Number)
{
switch(Location)
{
case 1:P2_4=1;P2_3=1;P2_2=1;break;
case 2:P2_4=1;P2_3=1;P2_2=0;break;
case 3:P2_4=1;P2_3=0;P2_2=1;break;
case 4:P2_4=1;P2_3=0;P2_2=0;break;
case 5:P2_4=0;P2_3=1;P2_2=1;break;
case 6:P2_4=0;P2_3=1;P2_2=0;break;
case 7:P2_4=0;P2_3=0;P2_2=1;break;
case 8:P2_4=0;P2_3=0;P2_2=0;break;
}
P0=smgduan[Number];
}
void main()
{
Nixie(2,2);//控制第几个灯亮什么数字
while(1)
{
}
}
四.自定义的动态数码管显示
1.视觉暂留原理
- 利用视觉暂留原理:视觉暂留原理是指在人眼观察到快速连续变化的图像时,由于视觉系统的特性,前一幅图像留存在视网膜上的印象会持续一段时间,从而使得人眼看到的图像在一定时间内仍然保持在视野中,这就是所谓的视觉暂留。
2.消影问题
- 数码管显示主要分两个过程:1.位选 2.段选
- 我们发现在用视觉暂留原理解决显示问题后,显示过程中会出现数字乱位的问题
- 出现问题的原因:单片机处理速度很快,上一个过程的段暄会影响到这个过程的位选
- 解决方法:在每一个过程中间加入一个清零步骤
P0=0x00;
2.利用自定义延时函数封装(代码演示)
cpp
#include <REGX52.H>
unsigned char smgduan[17]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,
0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};
void Delay(unsigned int xms)
{
unsigned char i, j;
while(xms)
{
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
xms--;
}
}
void Nixie(unsigned char Location,Number)
{
switch(Location)
{
case 1:P2_4=1;P2_3=1;P2_2=1;break;
case 2:P2_4=1;P2_3=1;P2_2=0;break;
case 3:P2_4=1;P2_3=0;P2_2=1;break;
case 4:P2_4=1;P2_3=0;P2_2=0;break;
case 5:P2_4=0;P2_3=1;P2_2=1;break;
case 6:P2_4=0;P2_3=1;P2_2=0;break;
case 7:P2_4=0;P2_3=0;P2_2=1;break;
case 8:P2_4=0;P2_3=0;P2_2=0;break;
}
P0=smgduan[Number];
Delay(1);//Á¢¿ÌÇå0ÊýÂë¹Ü>>á±äµÃºÜ°µ
P0=0x00;//ÏûÓ°
}
void main()
{
while(1)
{
Nixie(1,1);
Delay(20);
Nixie(2,2);
Delay(20);
Nixie(3,3);
Delay(20);
Nixie(2,2);
}
}