当前位置: 代码迷 >> 综合 >> 5.0 静态数码管 _ [AT89C51/2] [从零开始的单片机]
  详细解决方案

5.0 静态数码管 _ [AT89C51/2] [从零开始的单片机]

热度:16   发布时间:2023-12-06 04:49:39.0

数码管介绍

数码管即发光二极管,有的时七段,有的是八段,八段的二极管比七段的多了一小段二极管"dp"(为下一节"动态数码管"及段选埋伏笔)
一般把能显示一个数字"8"的二极管叫做一位(位选的伏笔),如果有8个8能全部显示出来,叫做8位数码管,当然也有1~7位的数码管。
数码管
下面用数字表出数码管的8个"段":
8段数码管

数码管显示原理——共阳极\共阴极输送电平的区别

在这里插入图片描述
数码管内部电路如图,左侧为共阳极原理图,右侧为共阴极原理图。
要想让数码管输出数字"0",就要使除了"g""dp"之外的二极管全部点亮即可。

以输出数字"0"为例子:

注意:要使二极管导通,就要使线路两端有电平差。如果我们不能改变共阴极的阴级电平,就只能改变输入的电平!共阳极同理。

  • 对于共极来说,因为阳极使捆绑在一起的,我们只能控制阴极,使单片机控制8条线路的电平。要使二极管点亮,就要使电路接通,所以要对除"g"、"dp"以外的线路输送电平。

  • 极同理,阴极是捆绑在一起的,所以我们只能通过控制各个阳极来控制二极管点亮。所以对除"g"、"dp"以外的线路输送电平。

(如果使用共阴极数码管需要注意:共阴极数码管是要靠单片机 IO 口输出电流来点亮的,但单片机 I/O 口难以输出稳定且巨大的电流。可以用上拉电阻的方法或使用专门的数码管驱动芯片,比如 74HC573、74HC245 等,优点为输出电流较大,电路接口简单。)

数码管显示原理——输送电平"内容"

上面提到过,对于不同数码管,输送的电平也有区别,具体如下:

u8 smg_code[] = {
    0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//共阴极数码管u8 smg_code[] = {
    0xc0,0xf9,0xa4,0xb0,0x99,0x92,0xc0,0xf9,0xa4,0xb0,0x99,0x92,0xc6,0xa1,0x86,0x8e};//共阳极数码管

共阴数码管数数字"0"段码为例:要让除了除"g"、"dp"以外的线路输送高电平,即输入1,0x3f,其二进制是:0011 1111,取反后为:1100 0000,转换成 16 进制即为 0xc0。
其他数字同理,不yig难发现其中输出同一个数字有着按位取反的规律。其中,把a作为高位,dp作为低位,正好使单片机的8个管脚同时输出。

数码管显示原理——核心

数码管静态显示基础原理:每个数码管的段选必须接一个 8 位数据线来保持显示的字形码。当送入一次字形码后,显示字形可一直保持,直到送入新字形码为止。
和2.0 LED闪烁 相比不需要编写延时函数,仅需要让特定的段选恒亮即可。

硬件设计

数码管原理图虽然开发板上没有单个的静态数码管,但依然可以在动态数码管电路中使用其中一个来学习静态数码管显示。本实验使用 SMG1 最左边那个数码管作为静态数码管,因为单片机 IO 口外部都增加了外部上拉电阻,因此 P22、P23、P24 引脚默认就是高电平,根据 38 译码器输出特点,此时LED8输出有效,即低电平。

软件设计

#include "reg52.h"typedef unsigned char u8;
typedef unsigned int u16;#define SMG_A_DP_PORT P0//P0^0~P0^7为整体//数组从下表"0"开始,依次表示为0、1、2......e,f,要想使数码管显示其中的字符,直接调用下标即可
u8 smg_code[] = {
    0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//共阴极数码管u8 smg_code1[] = {
    0xc0,0xf9,0xa4,0xb0,0x99,0x92,0xc0,0xf9,0xa4,0xb0,0x99,0x92,0xc6,0xa1,0x86,0x8e};//共阳极数码管//直接定义74HC38译码器的端口,利用38译码规律直接控制8个数码管的输出数字
sbit LSA = P2^2;
sbit LSB = P2^3;
sbit LSC = P2^4;//直接使用P0宏端口
void main()
{
    LSA = 1;LSB = 1;LSC = 1;P0 = smg[0];//调用数组的下标while(1);
}

代码块中涉及到74HC38译码器的使用,在静态数码管使用较少,在下一节"动态数码管"中详细解析,因此在这里不过多赘述。

  相关解决方案