在b站跟随江科大的视频学习51单片机时,有些地方理解有些吃力,于是写下博客记录、巩固。
极力推荐大家去看江科大的单片机教程!
本人的开发板是2023年12月购入的普中科技51单片机A2开发板
本篇内容对应江科大视频 [4-1] 静态数码管显示
LED分为两种连接方式:共阳极连接和共阴极连接
两种连接方式唯一的区别就在于8个LED是将阴极还是阳极作为公共端
(图片来自江科大视频)
普中A2开发板上的LED数码管是共阴极连接
分析LED数码管我们可以得出让它亮的条件:
1)该数码管阴极接地(位选)
2)给8个LED阳极引脚数字信号(段码)
例如我们想让它显示8,我们需要的操作就是:
1)阴极接地
2)给阳极段码 1111 1110
以上就是一个数码管的操作原理
实际开发板上有8个数码管,连接情况如下:
我们想要操作哪一个数码管,就只需要位选该数码管即可。为了节省单片机的IO口,开发板上加了一个74HC138译码器。
这样就可以用3个IO口控制8个数码管的位选了。
74HC138的具体原理可以查询百度百科 ,用法大致为:
想让LED8输出低电平(位选LED8对应数码管),只需要输入端输入 0 0 0 即可(因为前面还有一个取非)。
观察动态数码管模块,可以看出8个数码管每个的阳极引脚接到了同样的8根线上。这也就说明我们同一时间只能让一个数码管亮一种数字。
如果想要让数码管显示 1 2 3 4 5 6 7 8 ,就需要不断地扫描数码管,利用人眼的视觉暂留来实现,当然其中需要一步消影操作,否则数码管的显示会非常模糊。
我们对数码管的操作为:段选、位选、段选、位选......
我们期待的结果是:(段选、位选)、(段选、位选)......
但是实际上很有可能出现:(段选、【位选)、(段选】、位选)......这种情况。
就是因为上一次的位选没有清零,导致下一次的段选和之前的位选匹配,造成重影。
消影的操作就是在中间加入位清零,确保段选和位选的匹配,当然为了增强LED的亮度,还需要进行延时(代码执行速度过快)。
最后的改进流程为:(段选、位选、延时、位清零)、(段选、位选、延时、位清零)......
附上代码:(实现显示数字90345678)
#include <REGX52.H>
#include <INTRINS.H>
void NixieTube(unsigned char location,unsigned char number);
void Delay(unsigned int x);
void main()
{
while(1)
{
NixieTube(1,9);
NixieTube(2,0);
NixieTube(3,3);
NixieTube(4,4);
NixieTube(5,5);
NixieTube(6,6);
NixieTube(7,7);
NixieTube(8,8);
}
}
void NixieTube(unsigned char location,unsigned char 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;
}
switch(number)
{
case 0:
P0=0x3F;
break;
case 1:
P0=0x06;
break;
case 2:
P0=0x5B;
break;
case 3:
P0=0x4F;
break;
case 4:
P0=0x66;
break;
case 5:
P0=0x6D;
break;
case 6:
P0=0x7D;
break;
case 7:
P0=0x07;
break;
case 8:
P0=0x7F;
break;
case 9:
P0=0x6F;
break;
}
Delay(1);
P0=0x00;
//以上两行代码都是进行消隐操作,
//Delay的作用是让这个数字的亮度增加,P0归零是避免位选下一个数码管时会先短暂出现上一个数字
}
void Delay(unsigned int x)
{
int i;
for(i=0;i<x;i++)
{
unsigned char i, j;
_nop_();
i = 2;
j = 199;
do
{
while (--j);
} while (--i);
}
}