目录
一、静态数码管显示
1、一位数码管
(1)LED数码管各段名称
(2)数码管引脚定义
(3) 共阴极(89C52RC单片机LED数码管采用共阴极方式)
(4)共阳极
2、四位一体数码管
(1)四位一体数码管引脚定义
(2)上面共阴极和下面共阳极
3、数码管模块原理图详解
4、编写程序
5、实物展示
二、动态数码管显示
1、数码管的消影
2、编写程序
3、实物展示
4、数码管驱动方式
一、静态数码管显示
1、一位数码管
(1)LED数码管各段名称
(2)数码管引脚定义
接线服从就近原则
(3) 共阴极(89C52RC单片机LED数码管采用共阴极方式)
中间是二极管,电流只能从下面流向上面,所以所有接口共用一个阴极,上面接口接地,
给下面接口输入1时,LED二极管亮;输入0时,LED二极管灭。
(4)共阳极
中间是二极管,电流只能从上面流向下面,所以所有接口共用一个阳极,上面接口接电源VCC,
当给下面接口输入0时,LED二极管亮;输入1时,LED二极管灭。
2、四位一体数码管
(1)四位一体数码管引脚定义
(2)上面共阴极和下面共阳极
89C52RC单片机采用共阴极方式,当给共阴极12、9、8、6为1101时,再给下面共用端口输入0110 0000时,LED段B、C亮,这时第三个LED数码管会显示1;如果给共阴极12、9、8、6为1001,则第二个数码管和第三个数码管都会显示1。
3、数码管模块原理图详解
(1)138译码器
~:有上划线,代表低电平有效,如果没有上划线,表示高电平有效。
开发板上接的是74HC138,右侧LED1~LED8接到了数码管的公共端,通过138译码器,能够使由左侧P22、P23、P24三个端口来控制选择右边的8个端口LED1~LED8。
例:当C、B、A输入为000时,输出Y0低电平有效,其他无效,即输出LED8~LED1为1111 1110。
C | B | A | 输出(上面一横代表低电平有效) |
0 | 0 | 0 | Y0(1111 1110 ) |
0 | 0 | 1 | Y1(1111 1101) |
0 | 1 | 0 | Y2(1111 1011) |
0 | 1 | 1 | Y3(1111 0111) |
1 | 0 | 0 | Y4(1110 1111) |
1 | 0 | 1 | Y5(1101 1111) |
1 | 1 | 0 | Y6(1011 1111) |
1 | 1 | 1 | Y7(0111 1111) |
左下角G1、G2A和G2B为使能端,当G1接VCC,G2A和G2B接地,138译码器才会工作。
89C52RC单片机采用的是共阴极数码管,右上角COM指公共端,所以如果想点亮第三个数码管,首先需要给LED1~LED8赋值1101 1111,这样第三个数码管就被选中了,然后给第三个数码管数据,需要给数码管下面的接口输入阳码(1为亮,0为灭)——如想让数码管显示1,需要输入 0110 0000。
74HC245为双向数据缓冲器,右上角VDD是电源接VCC,OE为使能端口,低电平有效,接地时芯片才开始工作,左下角GND为接地。
左侧A0和右侧B0为一 一对应的关系,左上角DIR为控制数据方向端口,如果DIR接高电平是将左侧数据A0~A8送到右侧B0~B8,如果DIR接低电平,是将右侧数据B0~B8送到左侧A0~A8,由于在电路板上LE始终与VCC连接,因此这里74HC245的作用是将左侧数据A0~A8送到右侧B0~B8。
由于数码管为共阴极,给数码管下面接口输入阳码时,LED才亮,但是直接将P0~P7的高电平输入到数码管时,89C52RC单片机的I/O口是弱上拉类型,单片机高电平驱动能力有限,输出的最大电流不能太大,而低电平驱动能力更强一些。因此通过从P0~P7的数据,经过74HC245,就会使输入数码管的电流更小,这样驱动能力会更强一些。
4、编写程序
#include <REGX52.H>
unsigned char shumaguanTable[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,};
//定义数组注意后面要加分号,且左边是方框,右边是中括号
//右边分别是0~9的数码管显示输入值的16进制
void shumaguan(unsigned char Location,Number)
{
switch(Location)
{ //通过switch函数判断输入的Location是1~8哪一个值
//再由后面的138译码器来选择对应的数码管
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=shumaguanTable[Number]; //Number输入0~9的任意数字,就会显示相应数字
}
void main()
{
shumaguan(7,2); //输入Location为7,Number为2,带入函数中
while(1)
{
}
}
5、实物展示
二、动态数码管显示
1、数码管的消影
在shumaguan(Location,Number)函数中,Location左边数字,段选控制选择哪个数码管亮;Number右边数字,位选控制数码管显示的值。
若主程序为
void main()
{
shumaguan(1,1);
shumaguan(2,2);
shumaguan(3,3);
while(1)
{
}
}
函数运行过程为(第一个函数)位选、段选、(第二个函数)位选、段选、(第三个函数)位选、段选。
由于人的视觉暂留效果,并且没有加延时,单片机运行速度太快,在上个函数的段选和下个函数位选之间会发生显示数据串位的问题,如下图所示。
所以为了消除串位的现象,需要在每一个函数段选后,将其消0,这样就能实现动态数码管显示。
2、编写程序
#include <REGX52.H>
unsigned char shumaguanTable[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,};
//定义数组注意后面要加分号,且左边是方框,右边是中括号
//右边分别是0~9的数码管显示输入值的16进制
void Delay(unsigned int xms) //延时函数,输入x多少,就延时多少ms
{
unsigned char i, j;
while(xms--)
{
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
}
}
void shumaguan(unsigned char Location,Number) //数码管显示函数,Location是第几个数码管,Number是显示的数字
{
switch(Location)
{ //通过switch函数判断输入的Location是1~8哪一个值
//再由后面的138译码器来选择对应的数码管
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=shumaguanTable[Number]; //Number输入0~9的任意数字,就会显示相应数字
Delay(1); //让数码管稳定显示数字,立刻清零的话,数码管会显示比较暗
P0=0x00; //在数码管显示数字后,将段选清零,消除串位重影现象
}
void main()
{
while(1)
{
shumaguan(1,1);
shumaguan(2,2);
shumaguan(3,3);
}
}
3、实物展示
4、数码管驱动方式
单片机直接扫描:硬件设备简单,但会耗费大量的单片机CPU时间;
专用驱动芯片:内部自带显存,扫描电路,单片机只需告诉它显示什么即可,
TM1640就是这种专用驱动芯片。 文章来源:https://www.toymoban.com/news/detail-719578.html
文章来源地址https://www.toymoban.com/news/detail-719578.html
到了这里,关于51单片机数码管显示(三)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!