1 数码管介绍
数码管是给我们展示数据或者信息的电子器件,它是最原始以及成本比较低。以下是数码管的实物图:
1.1 数码管的段选与位选
以下是数码管的每一段所对应的位置:
从图可以看出来,数码管共有 a、b、c、d、e、f、g、dp 这么 8 个段,而实际上,这 8 个段每一段都是一个 LED 小灯,所以一个数码管就是由 8个 LED 小灯组成的。注意 dp 这个段,它是表示一个小数点!我们看一下数码管内部结构的示意图:
数码管分为共阳和共阴两种:
共阴数码管就是 8 只 LED 小灯的阴极是连接在一起的,阴极是公共端,由阳极来控制单个小灯的亮灭。
同理共阳数码管就是阳极接在一起。
看到这里我们就不难猜出,所谓的段选就是选择要点亮数码管中 a、b、c、d、e、f、g、dp 哪些段。
我们假设有多个这样的数码管,例如本文原理图中这样:
该图中的 LED8、LED7、LED6、LED5、LED4、LED3、LED2、LED1 网络标签都是数码管的公共端口 COM,位选指的就是这里,你可以认为里面有8个数码管,在你选择好段选之后,给某个 COM 网络进行选择就相当于选择点亮某个数码管。
下面以一个例子说明:
假设我要在上图从左往右第3个数码管显示“0”,那么“0”对应段选就是点亮 a、b、c、d、e、f,对于共阴数码管,它的表示如下:
假设P0端口连接到数码管的各个段,那么给P0端口写入0x3f,再给LED6网络端口置为0电平即可。
相反地,共阳数码管把共阴数码管的位选反转一下:
给P0端口写入0xc0,再给LED6网络端口置为1。
1.2 数码管的段选表格
前面我们学习了“0”的表示,下面列出共阴数码管与共阳数码管的表格:
① 共阴数码管表格:
unsigned char code LedChar[]={
0x3F, //"0"
0x06, //"1"
0x5B, //"2"
0x4F, //"3"
0x66, //"4"
0x6D, //"5"
0x7D, //"6"
0x07, //"7"
0x7F, //"8"
0x6F, //"9"
0x77, //"A"
0x7C, //"B"
0x39, //"C"
0x5E, //"D"
0x79, //"E"
0x71, //"F"
0xff, //全亮
0x00 //熄灭
};
② 共阳数码管表格:
unsigned char code LedChar[]={
0xc0,//0
0xf9,//1
0xa4,//2
0xb0,//3
0x99,//4
0x92,//5
0x82,//6
0xf8,//7
0x80,//8
0x90,//9
0x88,//A
0x83,//B
0xc6,//C
0xa1,//D
0x86,//E
0x8e, //F
0x00, //全亮
0xff //熄灭
};
2 原理图
① 数码管原理图:
② 数码管的位选使用138译码器进行解析,关于这块我们可以参考这篇文章:《数字器件认识 | 74HC138三八译码器的应用》。
③ MCU原理图:
3 代码
#include "reg52.h" //此文件中定义了单片机的一些特殊功能寄存器
typedef unsigned int u16; //对数据类型进行声明定义
typedef unsigned char u8;
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
u8 code LedChar[]={
0x3F, //"0"
0x06, //"1"
0x5B, //"2"
0x4F, //"3"
0x66, //"4"
0x6D, //"5"
0x7D, //"6"
0x07, //"7"
0x7F, //"8"
0x6F, //"9"
0x77, //"A"
0x7C, //"B"
0x39, //"C"
0x5E, //"D"
0x79, //"E"
0x71, //"F"
0xff, //全亮
0x00 //熄灭
};
/*******************************************************************************
* 函 数 名 : main
* 函数功能 : 主函数
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void main()
{
LSA=0;
LSB=0;
LSC=0; //控制138译码器的Y0输出低电平
P0=LedChar[0];
while(1);
}
简要分析:
整个程序实现给数码管最右边单独显示“0”,段选连接到P0引脚,位选通过138译码器进行控制。
程序定义LSA、LSB、LSC用于控制138译码器的A、B、C引脚,当三者均设置低电平,就能控制138译码器的Y0引脚输出低电平,从而达到控制位选。假设要控制Y6引脚输出低电平,即选择数码管从左到右显示第2个,则LSA=0;LSB=1;LSC=1;。如果不明白,,,看这篇文章:《数字器件认识 | 74HC138三八译码器的应用》
定义LedChar的时候使用了51 单片机的关键字 code。我们前边用到的unsigned char或者unsigned int这两个关键字,这样定义的变量都是放在我们的单片机的 RAM中,我们在程序中可以随意去改变这些变量的值。但是还有一种数据,我们在程序中要使用,但是却不会改变它的值,定义这种数据时可以加一个code关键字修饰一下,这个数据就会存储到我们的程序空间 Flash 中,这样可以大大节省单片机的 RAM 的使用量,毕竟我们的单片机 RAM 空间比较小,而程序空间则大的多。
上一篇:8051单片机实战分析(以STC89C52RC为例) | 06 - 动态数码管驱动
下一篇:8051单片机实战分析(以STC89C52RC为例) | 04 - 蜂鸣器驱动
推荐阅读最新更新时间:2024-11-08 11:08
设计资源 培训 开发板 精华推荐
- LT1161CSW 的典型应用电路使用一个额外的通道对多个/并联开关进行公共电流限制
- LTC3634HFE 降压稳压器的典型应用电路,具有使用两个输入电源的 2 相 VTT 终端
- 下推式磁悬浮月球灯-stm32f10x
- 用于编程欠压锁定的 LT3066IDE-3.3 线性稳压器的典型应用电路
- LT1303、3 节电池至 3.3V/200mA SEPIC 转换器
- LV8961HUWR2GEVK:LV8961H 评估套件
- FRDM-K22F: 面向Kinetis® K22 MCU的恩智浦Freedom开发平台
- LTC7149EFE 24V 输入并发 ±12V 电源的典型应用电路
- Dogchaser 超声波驱狗器
- 使用 PAM8124 15W D 类音频功率放大器进行桥接负载 (BTL) 配置的典型应用电路