(基于江协科技)51单片机入门:3.静态数码管
目录
一位数码管工作原理
四位一体的数码管工作原理
138译码器工作原理
74HC245
1.(共阴级链接)控制单个数码管亮“6”
2.(共阴极链接)动态数码管显示
数码管消影
一位数码管工作原理
可将数码管每段单独看成一个LED,一个单体数码管就是8个LED,对它控制它出现数字,就是控制他排列在莫些地方的LED亮灯就行
下方为单体数码管的链接图
单体数码管的链接会分两种:
1.共阳极链接(一条干路是5V的电压)
控制单独段LED亮,只要控制这段支路电压是0V就行
2.共阴极链接(一条干路是0V的电压)
控制单独段LED亮,只要控制这段支路电压是5V就行
四位一体的数码管工作原理
满足二级管的亮灭在于:
1.屁股后面为 5 V
2.头前为 0 V
上图将四位一体数码管拆分观察,想要其中的LED亮灯,这组干路(DIG表示的线路)得是5V(共阳极链接)
如果图中二极管的头对干路,那么干路得是0V(共阴级链接)才能控制这组LED灯会有亮灯的机会
之后才是控制每组中单个LED的亮灭
现在我已经给了DIG1 5V 其余为 0V
现在要控制它亮个 “6” 出现就得知道它每条线路控制的那个位置的LED
亮 “6” 线路 A C D E F G 要亮
所以给这些LED对应线路控制为 0 符就能出现亮 “6”
注意,四位一体数码管和一位数码管的区别在于,一位数码管干路电压是固定的,四位一体干路是可控的,干路控制那个组能有亮灯的可能。
干路下的支路控制的是每组中的LED灯亮(和一位数码管操作一样)
138译码器工作原理
可以观察到 P22 P23 P24 等值,我们转移到单片机模块上去看,也能看到 P22 P23 P24的值,现在我们已经知道能通过寄存器去控制银脚了。但是银脚的数量是有限的,所以138译码器的功能就是减少银脚的使用,利用银脚间接控制4位一体数码管的亮灭
我们可以控制 P22 P23 P24 的电压组成 2进制,有8种排序方式,利用这8种排序方式去控制 8 条主干线的电压
以C B A的排序去控控制
0 0 0 控制 LED1(就是DIG1) 为 5V 或 0V(根据自己单片机是共阴级还是共阳极链接)
0 0 1 LED2
0 1 0 LED3
依次类推
74HC245
能看见J21元件,这个元件能决定你是从下面74HC245左端到右端输入数据,还是右端到左端读取素数
2 1 链接 左端(P00)到右端(LCD0)输入数据
我们要控制灯的亮灭,要使 21 连接
· 3 2 链接 右端到左端读取数据
1.(共阴级链接)控制单个数码管亮“6”
#include <REGX52.H>int main()
{while(1){P2_4 = 0;P2_3 = 0;P2_2 = 1;P0 = 0x7D;}return 0;
}
控制指定数码亮数字函数:
void lig(int num1,int num2)
{unsigned char arr[] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F };switch(num1){case 1:P2_4=0,P2_3=0,P2_2=0;break;case 2:P2_4=0,P2_3=0,P2_2=1;break;case 3:P2_4=0,P2_3=1,P2_2=0;break;case 4:P2_4=0,P2_3=1,P2_2=1;break;case 5:P2_4=1,P2_3=0,P2_2=0;break;case 6:P2_4=1,P2_3=0,P2_2=1;break;case 7:P2_4=1,P2_3=1,P2_2=0;break;case 8:P2_4=1,P2_3=1,P2_2=1;break;}P0 = arr[num2];
}
2.(共阴极链接)动态数码管显示
由于138译码器的存在每次显示只会显示一个数字
所以,想要显示多个数字,就要利用人眼视觉暂留进行快速切换
例如:
3秒一个循环
第1秒在第3号位显示1
第2秒在第2号位显示0
第3秒在第1号位显示0
将这个循环所用的时间缩短就行(通常整个循环在20ms以内),我们就会感觉这四个数码管是同时亮着的。
数码管消影
鬼影的根本原因: 数码管从“亮”到“灭”的切换不是瞬间完成的,存在一个极短的延时
在这个延时中,上一数字的信息会被下一个灯接收(这个过程用时很短,所以篡位的数字,亮度很低)
所以在下一个亮灯前将上一个亮灯数据清空一下(给P0赋值为不亮灯的数据,这时下一个灯提前接收到的数据是不亮灯)
再执行下一个亮灯操作,就能将鬼影清除
动态数码管显示代码如下:
#include <REGX52.H>void Delay(int num) //@11.0592MHz
{while(num--){unsigned char i, j;i = 2;j = 199;do{while (--j);} while (--i);}
}void lig(int num1,int num2)
{unsigned char arr[] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F };switch(num1){case 1:P2_4=0,P2_3=0,P2_2=0;break;case 2:P2_4=0,P2_3=0,P2_2=1;break;case 3:P2_4=0,P2_3=1,P2_2=0;break;case 4:P2_4=0,P2_3=1,P2_2=1;break;case 5:P2_4=1,P2_3=0,P2_2=0;break;case 6:P2_4=1,P2_3=0,P2_2=1;break;case 7:P2_4=1,P2_3=1,P2_2=0;break;case 8:P2_4=1,P2_3=1,P2_2=1;break;}P0 = arr[num2];
}int main()
{while(1){lig(1,0);Delay(2);P0=0x00;lig(2,0);Delay(2);P0=0x00;lig(3,1);Delay(2);P0=0x00;}return 0;
}