51单片机第四节数码管

  • 格式:pdf
  • 大小:178.60 KB
  • 文档页数:6

51单⽚机第四节数码管

本笔记默认学习者已拥有:1.Keil5和stc烧写⼯具 等各种软件、驱动、环境;

2.有⼀个属于⾃⼰的 51单⽚机开发板及相关零件 ;

3.认识C语⾔的语法;

本⼈使⽤的51开发板为 郭天祥C51 TX-1C增强版开发板 ;

本笔记根据B站up主:江科⼤⾃化协的教学视频 整理得到ヾ(•ω•)

4-1 静态数码管显⽰

上图为TX-1C的 数码管及LED模块 原理图

138译码器和74HC245 都是⽤来控制 数码管显⽰ 的;

单数码管

1.上图为 ⼀位数码管,数码管有两种连接⽅式(对应 右边上下两幅图);2.右上图的原理图,8个LED的阴极都连在⼀个引脚上,称为共阴极连接;3.右下图的原理图,8个LED的阳极都连在⼀个引脚上,称为共阳极连接;

TX-1C开发板的连接⽅式是 共阴极连接;

4.左下⾓的 左边图⽚ ,定义了8个LED的名称;

5.左下⾓的 右边图⽚ ,定义了引脚的名称,与右图的引脚名称⼀⼀对应

假设数码管连接⽅式为 共阳极连接,观察可以发现,数码管中的 LED 的引脚引出,使⽤的是就近原则;

假设数码管连接⽅式为 共阴极连接,如果上数码管显⽰ 数字6 ?

1.要让数码管显⽰ 数字6,让要 LED-A、C、D、E、F、G亮起;

2.共阴极的公共端 要接地(给数据‘0’,或者是低电平);

3.阳极(称为位选端)根据LED的亮灭需求给 数据0或1(1亮、0灭) ,称为 段码(阳码) (1011 1110 即为段码);

如果 共阳极连接,共阳极端 要接到 VCC(⾼电平),阴极给 数据0或1 (1灭,0亮),称为 段码(阴码),和共阴极正好是相反关系;

共阳极连接→共阳极端接VCC并选中→阴极(位选端)传递(阴码)段码(1亮、0灭)→数码管显⽰共阴极连接→共阴极端接GND并选中→阳极(位选端)传递(阳码)段码(1灭、0亮)→数码管显⽰

四位⼀体数码管

开发板上即为 四位⼀体的数码管,且有两个,正好组成了 ⼋位数码管;

⽽TX-1C上 包含的是六位数码管,⽽⾮⼋位;1.四位数码管 也有 两种连接⽅式,即 共阴极连接 和 共阳极连接 ;{

Processing math: 100%2.四位数码管,(每位的公共端 单独引出来,位选端全部连在⼀起(所有A段连在⼀起、所有B段连在⼀起……),总共有12个引脚;

假设数码管连接⽅式为 共阴极连接,如何在 第三位 显⽰ 数字1 ?

1.给第三位的公共端 赋值 0(低电平),给其他位的公共端 赋值 1(⾼电平);

这样等同于 其他位的公共端(负极)接到了正极上,⽆论如何都亮不了;只有第三位能亮;

2.这样给 LED-B、C 的位选端 赋值 1,其他 位选端 赋值0

共阳极连接 即为 公共端 赋值 1(⾼电平)亮,其他以此类推;3.发现这样⼀个现象,数码管⽆法在同⼀时间显⽰多个数字,其在同⼀时刻下只能有⼀个显⽰,

只有⼀个数码管能被点亮,即使有多个被选中的数码管,显⽰的数字也是相同的;

这种共⽤引脚的现象,是为了减少控制数码管IO⼝;

(四位数码管有32个LED,如果都采⽤ 共阴极连接 的⽅式,也要32+1(公共端)=33个引脚;)

(采⽤这种链接,就只需要12个引脚即可控制四位数码管;)

如何让数码管多位显⽰不同数字(动态数码管显⽰)?

1.利⽤ ⼈眼视觉的暂留 和 数码管显⽰的余辉 的原理

先让第⼀位数码管显⽰1,然后很快地让第⼆位数码管显⽰2,再很快地让第三位数码管显⽰3,

让它不断地扫描,重复显⽰1、2、3的过程,这样三个数字就“同时”显⽰了;

原理分析

138译码器

1.观察到 原理图右图 与数码管有关的,有138译码器(74LS138)和74HC245两枚芯⽚;

TX-1C的原理图为左图,也有两个74HC573芯⽚与数码管有关;

芯⽚名称与功耗、电压、说明符号有关,具体内容不做分析;

2.如图,数码管连接⽅式为 共阴极连接,这样传输数据,就能让第三位显⽰ 数字1 了;

3.⽽上⾯的 LED1 ~ 8,其实接在了138译码器的输出端,138译码器正好可以实现让LED1 ~ 8输出 0或1;

LED1 ~ 8 对应了 TX-1C 六位数码管的SEG DS 1 ~ 6;

4.138译码器可将LED 1 ~ 8的⼋个端⼝ 转化为 由 3个端⼝ (P22、P23、P24)控制,⽽G1、G2A、G2B端⼝ 被 称为 使能端;

使能端 相当于 ⼀种开关,如果电平有效,它就可以⼯作;如果电平⽆效,它就不⼯作;

观察原理图发现,使能端是已经接好 VCC 和 GND 的,也就是说,其上电 其实就会⼯作TX-1C的74HC573也是同理,但其并未压缩 控制端⼝的数量;

5.138译码器也叫“38线译码器”,是由3个线到8个线,其中C是⾼位、A是低位,

CBA组成的数符合8进制,控制着Y0 ~ Y7 这8个端⼝;

6.所以,138译码器的作⽤就是⽤来选中某⼀位数码管的

74HC245

1.74HC245是⼀种 双向数据缓冲器,VDD、GND都可视为电源,OE为使能(其 接地 就⼯作);

2.DIR(direction),是⽅向的意思,它接到了VCC(⾼电平)上,将数据从左边输出到右边,从右边将数据读取回左边;

DIR若接到低电平上,会将数据从右边输出到左边,从左边将数据读取回右边;

3.单⽚机的⾼电平 驱动能⼒有限,其输出的最⼤电流不能太⼤;其低电平 驱动能⼒强;因此,LED模块才采⽤了 低电平点亮 的模式;

4.如果⽤⾼电平 直接点亮 数码管,电流会很⼩,灯会很暗;所以其加⼀个缓冲器,缓冲器可以提⾼ 其驱动能⼒,

如果直接将 数据 输出 给 数码管,数据就会被视为 驱动数据;现在增加了缓冲器,数据 就变成了 控制信号,

控制信号 只需要很微弱,缓冲器 就可以接收到,缓冲器再通过⾃⼰接到的电源,输出 数据 到引脚上,

这样控制的电流只需要⾮常⼩,就能驱动数码管 以⽐较亮的形式显⽰;

5.CC2电容 是⽤来 稳定电源的,叫电源滤波;

6.图右有 ⼀ 排阻,阻值为100R(即为100Ω),作⽤为 限流电阻 ,防⽌数码管的电流过⼤;

TX-1C既没有电容,也没有排阻;

原理总结

1.⽤ 138译码器 使 数码管 的某⼀位 被选中;

2.再给P0⼝⼀个 段码数据;

TX-1C虽然⽤P0⼝控制 段码输⼊,但也⽤P0⼝控制 位选;

需要先⽤ P2.6⼝和P2.7⼝ 控制 输⼊数据 是 段码 还是 位选;P2.6⼝控制 段码的输⼊;P2.7⼝控制 位选的输⼊;

例,给P2.6 数据1 (⾼电压)、给P2.7 数据 0 (低电压),就可以确定现在给数据是 段码 ;

1.由TX-1C的原理图可知,数码管内 LED灯 与 P0端⼝ 的顺序关系:

(1)LED的名称定义是通⽤⽆疑的;

(2)数码管本⾝的引脚名称不重要,重要的是 LED与哪个 P0 的 引脚 相连;

2.由TX-1C的原理图可知, P0.0引脚 控制 数码管的最左位,P0.5引脚控制 数码管的最右位,

剩余引脚是没有控制 数码管 位选 的作⽤的,哪个P0 的 引脚 控制 六位数码管的 哪位 很重要;

代码实现

静态数码管显⽰(让数码管第三位显⽰3).c

#include

sbit D=P2^6; //段码⼝

sbit W=P2^7; //位选⼝

void main(){

D=0;

W=1;

P0=0xFB;//1111 1011

W=0;

D=1;

P0=0x4F;//0100 1111

while(1);

}

下⾯写出了⼀个通⽤函数,可以让数码管在 第⼏个位置 显⽰ 哪个数

#include

#define uchar unsigned char

sbit D=P2^6;

sbit W=P2^7;

void NixieTube(uchar wei,uchar duan){ //NixieTube是数码管的英⽂

uchar WEI,DUAN; //(Nixie是⼥⽔妖的意思)

D=0;

W=1;

switch(wei){ //位选部分

case 1:WEI=0xFE; break; case 2:WEI=0xFD; break;

case 3:WEI=0xFB; break;

case 4:WEI=0xF7; break;

case 5:WEI=0xEF; break;

case 6:WEI=0xDF; break;

}

P0=WEI;

W=0;

D=1;

switch(duan){ //段码部分

case 0:DUAN=0x3F; break;

case 1:DUAN=0x06; break;

case 2:DUAN=0x5B; break;

case 3:DUAN=0x4F; break;

case 4:DUAN=0x66; break;

case 5:DUAN=0x6D; break;

case 6:DUAN=0x7D; break;

case 7:DUAN=0x07; break;

case 8:DUAN=0x7F; break;

case 9:DUAN=0x6F; break;

case 10:DUAN=0x77; break; //A

case 11:DUAN=0x7F; break; //B

case 12:DUAN=0x39; break; //C

case 13:DUAN=0x3F; break; //D

case 14:DUAN=0x79; break; //E

case 15:DUAN=0x71; break; //F

case 16:DUAN=0x80; break; //.

}

P0=DUAN;

}

void main(){

NixieTube(3,3);

while(1);

}

运⾏结果如下:

4-2 动态数码管显⽰

1.如果只是单纯让其显⽰完⼀个再显⽰⼀个,代码如下:

#include

#define uchar unsigned char

sbit D=P2^6;

sbit W=P2^7;

uchar Nixiewei[]={0,0xFE,0xFD,0xFB,0xF7,0xEF,0xDF};

uchar Nixiecode[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7F,0x39,0x3F,0x79,0x71,0x80};

//将两个switch改进为数组

void NixieTube(uchar wei,uchar duan){

D=0;

W=1;

P0=Nixiewei[wei];

W=0;

D=1;

P0=Nixiecode[duan];

}

void main(){

while(1){

NixieTube(1,1);

NixieTube(2,2);

NixieTube(3,3);

}

}

运⾏结果如下:

2.这是⼀个数码管的常见问题,称为 数码管的消影 ;

位选-->段选-->位选-->段选-->位选-->......