前言
大家好吖,欢迎来到 YY 滴单片机 系列 ,热烈欢迎! 本章主要内容面向接触过单片机的老铁
主要内容含:
一.前置操作
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实验烧写部分:传送门
#include <REGX52.H> void main() { //138译码器 P2_2=1; P2_3=0; P2_4=1; P0=0x7D; while(1) { } }
- 现象:我们烧写入单片机后,可以发现LED6处出现数字6
三.自定义的静态数码管显示(代码演示)
- 根据数码管段码图,以及while函数,我们进行改装
#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.利用自定义延时函数封装(代码演示)
#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); } }